diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 index 15bb499d2ca93f21606dbcee61087753ef7c4230..f0eb696c9f4b2049de9afd5db3a7581f3966fbef 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 @@ -114,8 +114,8 @@ end subroutine IO_Format_read_select SUBROUTINE IO_Field_metadata_bcast(TPFILE,TPFIELD) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD ! INTEGER :: IERR ! @@ -159,10 +159,10 @@ SUBROUTINE IO_Field_read_byfield_X0(TPFILE,TPFIELD,PFIELD,KRESP) ! USE MODD_IO, ONLY: ISP,GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD ! data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD ! data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -238,13 +238,13 @@ USE MODD_STRUCTURE_ll, ONLY: ZONE_ll USE MODE_SCATTER_ll USE MODE_ALLOCBUFFER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code -INTEGER,OPTIONAL, INTENT(IN) :: KIMAX_ll -INTEGER,OPTIONAL, INTENT(IN) :: KJMAX_ll -TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING ! splitting of the domain +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING ! splitting of the domain ! INTEGER :: IERR REAL,DIMENSION(:),POINTER :: ZFIELDP @@ -349,13 +349,13 @@ USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODE_ll , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll #endif ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code -INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll -INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll -TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING ! splitting of the domain +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) :: KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) :: KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING ! splitting of the domain ! INTEGER :: IERR real :: zfieldp0d @@ -367,7 +367,7 @@ INTEGER :: IRESP INTEGER :: IHEXTOT REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22 -type(tfielddata) :: tzfield +class(tfieldmetadata),allocatable :: tzfield #ifdef MNH_GA REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA TYPE(LIST_ll) ,POINTER :: TZFIELD_ll @@ -389,8 +389,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -400,7 +400,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp0d, iresp ) pfield(:, :) = Spread( Spread( zfieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -410,8 +409,8 @@ IF (IRESP==0) THEN pfield(:, :) = Spread( Spread( pfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -422,7 +421,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp1d, iresp ) pfield(:, :) = Spread( pfield(:, jphext + 1), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -558,10 +556,10 @@ USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), TARGET, INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL,DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! TYPE TX_2DP REAL,DIMENSION(:,:), POINTER :: X @@ -588,7 +586,7 @@ CHARACTER(LEN=2) :: YDIR CHARACTER(LEN=4) :: YK CHARACTER(LEN=NMNHNAMELGTMAX+4) :: YRECZSLICE CHARACTER(LEN=4) :: YSUFFIX -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP #ifdef MNH_GA @@ -615,8 +613,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -629,7 +627,6 @@ IF (IRESP==0) THEN pfield(:, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -640,8 +637,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -653,7 +650,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp2d, iresp ) pfield(:, :, :) = Spread( pfield(:, jphext + 1, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -717,6 +713,7 @@ IF (IRESP==0) THEN ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size GALLOC_ll = .TRUE. IRESP_ISP=0 + Allocate( tzfield, mold = tpfield ) DO JKK=1,SIZE(PFIELD,3) ! IKU_ll IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE @@ -783,6 +780,7 @@ IF (IRESP==0) THEN JK_MAX=MIN(SIZE(PFIELD,3),JK+INB_PROC_REAL-1) ! INB_REQ=0 + Allocate( tzfield, mold = tpfield ) DO JKK=JK,JK_MAX IF (TPFILE%NSUBFILES_IOZ .GT. 1 ) THEN IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ) @@ -947,10 +945,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR real, dimension(:,:), pointer :: zfieldp2d @@ -960,7 +958,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X4',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -976,8 +974,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -991,7 +989,6 @@ IF (IRESP==0) THEN pfield(:, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1002,8 +999,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1016,7 +1013,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp3d, iresp ) pfield(:, :, :, :) = Spread( pfield(:, jphext + 1, :, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1106,10 +1102,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR real, dimension(:,:,:), pointer :: zfieldp3d @@ -1119,7 +1115,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X5',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1135,8 +1131,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1151,7 +1147,6 @@ IF (IRESP==0) THEN pfield(:, :, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1162,8 +1157,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1177,7 +1172,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp4d, iresp ) pfield(:, :, :, :, :) = Spread( pfield(:, jphext + 1, :, :, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1266,10 +1260,10 @@ USE MODE_ALLOCBUFFER_ll USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP @@ -1356,10 +1350,10 @@ SUBROUTINE IO_Field_read_byfield_N0(TPFILE,TPFIELD,KFIELD,KRESP) ! USE MODD_IO, ONLY: ISP,GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1427,10 +1421,10 @@ USE MODD_IO, ONLY: ISP, GSMONOPROC USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1518,10 +1512,10 @@ USE MODD_TIMEZ, ONLY: TIMEZ USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:),TARGET,INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:), TARGET, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR integer :: ifieldp0d @@ -1531,7 +1525,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1547,8 +1541,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -1558,7 +1552,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp0d, iresp ) kfield(:, :) = Spread( Spread( ifieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1568,8 +1561,8 @@ IF (IRESP==0) THEN kfield(:, :) = Spread( Spread( kfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -1580,7 +1573,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp1d, iresp ) kfield(:, :) = Spread( kfield(:, jphext + 1), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1672,10 +1664,10 @@ USE MODD_TIMEZ, ONLY: TIMEZ USE MODE_ALLOCBUFFER_ll USE MODE_SCATTER_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR integer, dimension(:), pointer :: ifieldp1d @@ -1685,7 +1677,7 @@ LOGICAL :: GALLOC logical :: glfi, gnc4 INTEGER :: IRESP INTEGER :: IHEXTOT -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N3',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1701,8 +1693,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 ) IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1715,7 +1707,6 @@ IF (IRESP==0) THEN kfield(:, :, :) = Spread( Spread( kfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), & dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1726,8 +1717,8 @@ IF (IRESP==0) THEN dim = 2, ncopies = ihextot ) endif else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1739,7 +1730,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp2d, iresp ) kfield(:, :, :) = Spread( kfield(:, jphext + 1, :), dim = 2, ncopies = ihextot ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1825,10 +1815,10 @@ SUBROUTINE IO_Field_read_byfield_L0(TPFILE,TPFIELD,OFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1893,10 +1883,10 @@ SUBROUTINE IO_Field_read_byfield_L1(TPFILE,TPFIELD,OFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -1961,10 +1951,10 @@ SUBROUTINE IO_Field_read_byfield_C0(TPFILE,TPFIELD,HFIELD,KRESP) ! USE MODD_IO, ONLY: ISP, GSMONOPROC ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -2032,10 +2022,10 @@ SUBROUTINE IO_Field_read_byfield_T0(TPFILE,TPFIELD,TPDATA,KRESP) use modd_io, only: ISP, GSMONOPROC use modd_type_date, only: DATE_TIME ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +TYPE(DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field +INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! INTEGER :: IERR INTEGER :: IRESP @@ -2118,12 +2108,12 @@ USE MODE_DISTRIB_lb USE MODE_MNH_TIMING, ONLY: SECOND_MNH2 USE MODE_TOOLS_ll, ONLY: GET_GLOBALDIMS_ll ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM -INTEGER, INTENT(IN) :: KRIM ! size of the LB area -REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT) :: PLB ! array containing the LB field -INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM +INTEGER, INTENT(IN) :: KRIM ! size of the LB area +REAL, DIMENSION(:,:,:) ,TARGET, INTENT(INOUT) :: PLB ! array containing the LB field +INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code ! !* 0.2 Declarations of local variables ! @@ -2147,7 +2137,7 @@ real, dimension(:,:), pointer :: ZTX2DP REAL,DIMENSION(:,:,:), POINTER :: TX3DP REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2, ZT3 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22 -type(tfielddata) :: tzfield +class(tfieldmetadata), allocatable :: tzfield TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_lb','reading '//TRIM(TPFIELD%CMNHNAME)) @@ -2175,8 +2165,8 @@ IF (IRESP==0) THEN IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3))) IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2188,7 +2178,6 @@ IF (IRESP==0) THEN if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ZTX2DP, iresp ) Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) if ( gnc4 ) call IO_Field_read_nc4( tpfile, tzfield, tx3dp, iresp ) diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 index b48a37b2649d4d8ae06964e24a736db43439cbaf..da38896296cf4494e4dd2d248b55eb15651e5a98 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 @@ -25,7 +25,8 @@ MODULE MODE_IO_FIELD_WRITE - use modd_field, only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL + use modd_field, only: tfieldlist, tfieldmetadata, tfieldmetadata_base, & + TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL USE MODD_IO, ONLY: TFILEDATA, TOUTBAK USE MODD_MPIF use modd_parameters, only: NMNHNAMELGTMAX @@ -81,10 +82,10 @@ MODULE MODE_IO_FIELD_WRITE CONTAINS SUBROUTINE IO_Field_metadata_check(TPFIELD,KTYPE,KDIMS,HCALLER) - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD ! Field to check - INTEGER, INTENT(IN) :: KTYPE ! Expected datatype - INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions - CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine + CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD ! Field to check + INTEGER, INTENT(IN) :: KTYPE ! Expected datatype + INTEGER, INTENT(IN) :: KDIMS ! Expected number of dimensions + CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine ! CHARACTER(LEN=2) :: YDIMOK,YDIMKO CHARACTER(LEN=8) :: YTYPEOK,YTYPEKO @@ -177,13 +178,13 @@ CONTAINS subroutine IO_Field_write_error_check( tpfile, tpfield, hsubr, kresp_in, kresp_lfi, kresp_nc4, kresp_out ) use modd_io, only: gsmonoproc - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield - character(len=*), intent(in) :: hsubr - integer, intent(in) :: kresp_in - integer, intent(in) :: kresp_lfi - integer, intent(in) :: kresp_nc4 - integer, intent(out) :: kresp_out + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(in) :: tpfield + character(len=*), intent(in) :: hsubr + integer, intent(in) :: kresp_in + integer, intent(in) :: kresp_lfi + integer, intent(in) :: kresp_nc4 + integer, intent(out) :: kresp_out character(len=:), allocatable :: ymsg character(len=6) :: yresp @@ -311,14 +312,14 @@ subroutine IO_Field_create( tpfile, tpfield ) use modd_field use modd_io, only: gsmonoproc, isp - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(in) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata), intent(in) :: tpfield - integer :: ik_file - integer :: iresp - logical :: glfi, gnc4 - type(tfielddata) :: tzfield - type(tfiledata), pointer :: tzfile + integer :: ik_file + integer :: iresp + logical :: glfi, gnc4 + class(tfieldmetadata), allocatable :: tzfield + type(tfiledata), pointer :: tzfile call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) ) @@ -340,7 +341,7 @@ subroutine IO_Field_create( tpfile, tpfield ) end if if ( iresp == 0 ) then - tzfield = tpfield + Allocate( tzfield, source = tpfield ) if ( All( tzfield%ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) then call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': ' & @@ -443,8 +444,8 @@ subroutine IO_Ndimlist_reduce( tpfile, tpfield ) use modd_io, only: gsmonoproc, l1d, l2d, lpack use modd_parameters_ll, only: jphext - type(tfiledata), intent(in) :: tpfile - type(tfielddata), intent(inout) :: tpfield + type(tfiledata), intent(in) :: tpfile + class(tfieldmetadata_base), intent(inout) :: tpfield integer :: ihextot integer :: ji @@ -529,7 +530,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -632,7 +633,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(1), optional, intent(in) :: koffset @@ -762,7 +763,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(2), optional, intent(in) :: koffset @@ -790,7 +791,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -821,8 +822,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -839,7 +840,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp0d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -854,8 +854,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -871,7 +871,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -1021,7 +1020,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(3), optional, intent(in) :: koffset @@ -1064,7 +1063,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield TYPE(TFILEDATA),POINTER :: TZFILE ! TZFILE => NULL() @@ -1102,8 +1101,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1120,7 +1119,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1134,8 +1132,8 @@ end subroutine IO_Ndimlist_reduce end if endif ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1153,7 +1151,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :) if ( Present ( koffset ) ) then @@ -1486,7 +1483,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -1509,7 +1506,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1539,8 +1536,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1559,7 +1556,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1574,8 +1570,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1595,7 +1591,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -1701,7 +1696,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -1721,7 +1716,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -1746,8 +1741,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -1760,7 +1755,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp3d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -1770,8 +1764,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -1784,7 +1778,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp4d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp4d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp, iresp_lfi ) @@ -1874,7 +1867,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -1985,7 +1978,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2077,7 +2070,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2189,7 +2182,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2212,7 +2205,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2238,8 +2231,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2249,7 +2242,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp0d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp0d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2259,8 +2251,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) !Necessary if time dimension @@ -2270,7 +2262,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = NMNHDIM_ONE end if @@ -2370,7 +2361,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),TARGET,INTENT(IN) :: KFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2392,7 +2383,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2418,8 +2409,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2430,7 +2421,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2440,8 +2430,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2452,7 +2442,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp2d, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp, iresp_lfi ) @@ -2548,7 +2537,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),TARGET, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, OPTIONAL, INTENT(OUT) :: KRESP ! return-code integer, dimension(4), optional, intent(in) :: koffset @@ -2571,7 +2560,7 @@ end subroutine IO_Ndimlist_reduce INTEGER :: IHEXTOT CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -2601,8 +2590,8 @@ end subroutine IO_Ndimlist_reduce IF (GSMONOPROC) THEN ! sequential execution ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 2 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1) = tzfield%ndimlist(3) @@ -2621,7 +2610,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(1:2) = NMNHDIM_ONE end if @@ -2636,8 +2624,8 @@ end subroutine IO_Ndimlist_reduce endif ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -2657,7 +2645,6 @@ end subroutine IO_Ndimlist_reduce if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp3d, iresp_nc4 ) end if else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE ifieldp => kfield(:, jphext + 1 : jphext + 1, :, :) if ( Present( koffset ) ) then @@ -2757,7 +2744,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2849,7 +2836,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:),TARGET, INTENT(IN) :: OFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -2956,7 +2943,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3036,7 +3023,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3140,7 +3127,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3217,7 +3204,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME),DIMENSION(:), INTENT(IN) :: TFIELD ! array containing the data field INTEGER,OPTIONAL, INTENT(OUT):: KRESP ! return-code ! @@ -3297,7 +3284,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PLB ! array containing the LB field INTEGER,OPTIONAL, INTENT(OUT) :: KRESP ! return-code @@ -3326,7 +3313,7 @@ end subroutine IO_Ndimlist_reduce TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP CHARACTER(LEN=:),ALLOCATABLE :: YMSG CHARACTER(LEN=6) :: YRESP - type(tfielddata) :: tzfield + class(tfieldmetadata), allocatable :: tzfield ! YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME @@ -3361,8 +3348,8 @@ end subroutine IO_Ndimlist_reduce IF (IRESP==0) THEN IF (GSMONOPROC) THEN ! sequential execution IF (LPACK .AND. L2D) THEN + Allocate( tzfield, source = tpfield ) if ( tpfile%ldimreduced ) then - tzfield = tpfield tzfield%ndims = tzfield%ndims - 1 if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then tzfield%ndimlist(2) = tzfield%ndimlist(3) @@ -3373,7 +3360,6 @@ end subroutine IO_Ndimlist_reduce if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ztx2dp, iresp_lfi ) if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ztx2dp, iresp_nc4 ) else - tzfield = tpfield if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE tx3dp => plb(:, jphext + 1 : jphext + 1, :) if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, tx3dp, iresp_lfi ) @@ -3457,7 +3443,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3551,7 +3537,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3645,7 +3631,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL, DIMENSION(:,:,:,:), TARGET, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -3739,7 +3725,7 @@ end subroutine IO_Ndimlist_reduce !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(IN) :: KXOBOX ! @@ -4249,7 +4235,7 @@ IMPLICIT NONE ! TYPE(TOUTBAK), INTENT(IN) :: TPOUTPUT !Output structure ! -TYPE(TFIELDDATA) :: TZFIELD +TYPE(TFIELDMETADATA) :: TZFIELD ! #if 0 INTEGER :: IKB diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 index f98999c1ea643987e3825b791b28d30d41a151fa..66aab0cef714eb2a2df0802e5d4585e040d8727e 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2021 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. @@ -13,7 +13,7 @@ !----------------------------------------------------------------- module mode_io_read_lfi ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata_base USE MODD_IO USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH use modd_precision, only: LFIINT, MNHINT64, MNHREAL32, MNHREAL64 @@ -50,10 +50,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -89,10 +89,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -123,10 +123,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -157,10 +157,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -191,10 +191,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -225,10 +225,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL ,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -259,10 +259,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:,:,:,:), INTENT(INOUT) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -293,10 +293,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -327,10 +327,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -361,10 +361,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -395,10 +395,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER,DIMENSION(:,:,:),INTENT(INOUT) :: KFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -429,10 +429,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -476,10 +476,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -531,10 +531,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -581,10 +581,10 @@ IMPLICIT NONE ! !* 0.1 Declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME),INTENT(INOUT) :: TPDATA ! array containing the data field -INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA ! array containing the data field +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured ! !* 0.2 Declarations of local variables ! @@ -592,7 +592,7 @@ INTEGER(KIND=LFIINT) :: IRESP, ITOTAL INTEGER :: ILENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK LOGICAL :: GGOOD -TYPE(TFIELDDATA) :: TZFIELD +TYPE(tfieldmetadata_base) :: TZFIELD INTEGER, DIMENSION(3) :: ITDATE ! date array REAL,DIMENSION(1) :: ZTIME ! @@ -649,7 +649,7 @@ SUBROUTINE IO_Field_read_check_lfi(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD INTEGER, INTENT(IN) :: KLENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KWORK INTEGER(KIND=LFIINT), INTENT(OUT) :: KTOTAL diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 index a257e66b8cdd31e21396959c0d72217ae4a3a615..24825773483afbc1d79b6ce432c08294dcfccc75 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 @@ -17,7 +17,7 @@ #ifdef MNH_IOCDF4 module mode_io_read_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata, tfieldmetadata_base use modd_io, only: tfiledata use modd_precision, only: CDFINT @@ -53,11 +53,11 @@ SUBROUTINE IO_Field_attr_read_check_nc4(TPFILE,TPFIELD,KVARID,KRESP,HCALENDAR) ! USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID -INTEGER, INTENT(OUT) :: KRESP ! return-code -CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HCALENDAR +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD +INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID +INTEGER, INTENT(OUT) :: KRESP ! return-code +CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCALENDAR ! INTEGER :: IERRLEVEL INTEGER :: IGRID @@ -260,10 +260,10 @@ END SUBROUTINE IO_Field_attr_read_check_nc4 SUBROUTINE IO_Field_read_nc4_X0(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL, INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -315,10 +315,10 @@ END SUBROUTINE IO_Field_read_nc4_X0 SUBROUTINE IO_Field_read_nc4_X1(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -382,10 +382,10 @@ END SUBROUTINE IO_Field_read_nc4_X1 SUBROUTINE IO_Field_read_nc4_X2(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -464,10 +464,10 @@ END SUBROUTINE IO_Field_read_nc4_X2 SUBROUTINE IO_Field_read_nc4_X3(TPFILE, TPFIELD, PFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -536,7 +536,7 @@ END SUBROUTINE IO_Field_read_nc4_X3 SUBROUTINE IO_Field_read_nc4_X4(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -610,7 +610,7 @@ END SUBROUTINE IO_Field_read_nc4_X4 SUBROUTINE IO_Field_read_nc4_X5(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -687,7 +687,7 @@ END SUBROUTINE IO_Field_read_nc4_X5 SUBROUTINE IO_Field_read_nc4_X6(TPFILE, TPFIELD, PFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -765,10 +765,10 @@ END SUBROUTINE IO_Field_read_nc4_X6 SUBROUTINE IO_Field_read_nc4_N0(TPFILE, TPFIELD, KFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -INTEGER, INTENT(INOUT) :: KFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +INTEGER, INTENT(INOUT) :: KFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -822,7 +822,7 @@ END SUBROUTINE IO_Field_read_nc4_N0 SUBROUTINE IO_Field_read_nc4_N1(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -890,7 +890,7 @@ END SUBROUTINE IO_Field_read_nc4_N1 SUBROUTINE IO_Field_read_nc4_N2(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -972,7 +972,7 @@ END SUBROUTINE IO_Field_read_nc4_N2 SUBROUTINE IO_Field_read_nc4_N3(TPFILE, TPFIELD, KFIELD, KRESP) TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD INTEGER, INTENT(OUT) :: KRESP ! return-code @@ -1042,10 +1042,10 @@ KRESP = IRESP END SUBROUTINE IO_Field_read_nc4_N3 SUBROUTINE IO_Field_read_nc4_L0(TPFILE, TPFIELD, OFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL, INTENT(INOUT) :: OFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +LOGICAL, INTENT(INOUT) :: OFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1112,10 +1112,10 @@ END SUBROUTINE IO_Field_read_nc4_L0 SUBROUTINE IO_Field_read_nc4_L1(TPFILE, TPFIELD, OFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1199,10 +1199,10 @@ END SUBROUTINE IO_Field_read_nc4_L1 SUBROUTINE IO_Field_read_nc4_C0(TPFILE, TPFIELD, HFIELD, KRESP) -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID @@ -1268,10 +1268,10 @@ USE MODD_TYPE_DATE ! USE MODE_DATETIME ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD -TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA -INTEGER, INTENT(OUT) :: KRESP ! return-code +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD +TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA +INTEGER, INTENT(OUT) :: KRESP ! return-code INTEGER(KIND=CDFINT) :: istatus INTEGER(KIND=CDFINT) :: INCID diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 index 1930838631bea8fe7286ba1bdbd9972602a933e3..7346177c4e2f279187f3fff07a14278abe835127 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90 @@ -103,7 +103,7 @@ contains subroutine IO_Mnhversion_get(tpfile) !Compare MNHVERSION of file with current version and store it in file metadata use modd_conf, only: nmnhversion - use modd_field, only: tfielddata, TYPEINT + use modd_field, only: tfieldmetadata, TYPEINT use mode_io_field_read, only: IO_Field_read @@ -113,7 +113,7 @@ subroutine IO_Mnhversion_get(tpfile) integer :: imasdev,ibugfix integer :: iresp integer,dimension(3) :: imnhversion - type(tfielddata) :: tzfield + type(tfieldmetadata) :: tzfield call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','called for '//trim(tpfile%cname)) @@ -123,7 +123,7 @@ subroutine IO_Mnhversion_get(tpfile) if ( .not. associated( tpfile%tmainfile ) ) then imnhversion(:) = 0 !use tzfield because tfieldlist could be not initialised - tzfield = tfielddata( & + tzfield = tfieldmetadata( & cmnhname = 'MNHVERSION', & cstdname = '', & clongname = 'MesoNH version', & diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 50412e8c08015401031defdfdbec37509180e520..a7d7604f2bfa26a10b32cdadd66dcedcd0627b17 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -24,7 +24,7 @@ #ifdef MNH_IOCDF4 module mode_io_tools_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: tfiledata use modd_netcdf, only: tdimnc, tdimsnc use modd_precision, only: CDFINT @@ -85,7 +85,7 @@ USE MODD_FIELD, ONLY: NMNHDIM_ARAKAWA, TYPECHAR ! !Used by LFI2CDF TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KLEN TYPE(tdimnc),DIMENSION(:), INTENT(OUT) :: TPDIMS INTEGER, INTENT(OUT) :: KRESP @@ -253,6 +253,8 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX use modd_dyn, only: xseglen use modd_dyn_n, only: xtstep + +!PW: check if all parameters are used... use modd_field, only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V, & NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME, & NMNHDIM_ONE, NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX, & @@ -515,7 +517,7 @@ use modd_field, only: NMNHDIM_UNKNOWN, NMNHDIM_ONE, NMNHDIM_COMPLEX, NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, NMNHDIM_ARAKAWA TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER(KIND=CDFINT),DIMENSION(:), INTENT(IN) :: KSHAPE INTEGER(KIND=CDFINT),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS ! diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 index 430f06ccfed1c5d64d8daeec50f95164be6d1ed7..588ac539b516d2093b296b3d97b9d3312302d30f 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 @@ -14,7 +14,7 @@ !----------------------------------------------------------------- module mode_io_write_lfi ! -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata_base USE MODD_IO USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH use modd_precision, only: LFIINT, MNHINT64, MNHREAL64 @@ -53,7 +53,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL, INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -92,7 +92,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -137,7 +137,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files) @@ -203,7 +203,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -248,7 +248,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -293,7 +293,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -338,7 +338,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -383,7 +383,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -422,7 +422,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:), INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -467,7 +467,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -512,7 +512,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -558,7 +558,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -604,7 +604,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -651,7 +651,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD LOGICAL,DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -706,7 +706,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -764,7 +764,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TPDATA ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -772,14 +772,14 @@ INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! INTEGER :: ILENG INTEGER(kind=LFIINT) :: IRESP, ITOTAL -TYPE(TFIELDDATA) :: TZFIELD +CLASS(tfieldmetadata_base), ALLOCATABLE :: TZFIELD INTEGER, DIMENSION(3) :: ITDATE ! date array INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK CHARACTER(LEN=LEN_HREC) :: YRECFM ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_lfi_T0','writing '//TRIM(TPFIELD%CMNHNAME)) ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Write date ! @@ -840,7 +840,7 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised ! @@ -849,7 +849,7 @@ INTEGER, INTENT(OUT):: KRESP ! return-code if problems a INTEGER :: ILENG, IPOS INTEGER :: JI INTEGER(kind=LFIINT) :: IRESP, ITOTAL -TYPE(TFIELDDATA) :: TZFIELD +CLASS(tfieldmetadata_base), ALLOCATABLE :: TZFIELD INTEGER, DIMENSION(:), ALLOCATABLE :: ITDATE ! date array INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK CHARACTER(LEN=LEN_HREC) :: YRECFM @@ -866,7 +866,7 @@ END IF ! ALLOCATE( ITDATE( ILENG ) ) ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Write date ! @@ -924,7 +924,7 @@ END SUBROUTINE IO_Field_write_lfi_T1 ! SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP) ! -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KLENG INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK INTEGER(kind=LFIINT), INTENT(OUT) :: KTOTAL diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 index 53053069c936e71c6df416594babe000686782a7..4019f6346ad0afd8523e9727f2811987ab3eed7b 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 @@ -32,7 +32,7 @@ #ifdef MNH_IOCDF4 module mode_io_write_nc4 -use modd_field, only: tfielddata +use modd_field, only: tfieldmetadata use modd_io, only: gsmonoproc, tfiledata use modd_parameters, only: NMNHNAMELGTMAX use modd_precision, only: CDFINT, MNHINT_NF90, MNHREAL32, MNHREAL_MPI, MNHREAL_NF90 @@ -87,7 +87,7 @@ use modd_parameters, only: jphext use mode_tools_ll, only: Get_globaldims_ll type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, intent(in) :: knblocks character(len=len(tpfield%cmnhname)) :: yvarname @@ -177,7 +177,7 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE use modd_field, only: NMNHDIM_ARAKAWA, TYPEINT, TYPEREAL ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER(KIND=CDFINT), INTENT(IN) :: KVARID LOGICAL, INTENT(IN) :: OEXISTED !True if variable was already defined INTEGER(KIND=CDFINT), DIMENSION(:), OPTIONAL, INTENT(IN) :: KSHAPE @@ -373,7 +373,7 @@ use modd_field, only: NMNHDIM_TIME, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TY use modd_precision, only: MNHINT_NF90, MNHREAL_NF90 type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:), intent(in), optional :: kshape character(len=*), intent(in), optional :: hcalendar logical, intent(in), optional :: oiscoord ! Is a coordinate variable (->do not write coordinates attribute) @@ -525,7 +525,7 @@ end subroutine IO_Field_create_nc4 SUBROUTINE IO_Field_write_nc4_X0(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL, INTENT(IN) :: PFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -548,7 +548,7 @@ END SUBROUTINE IO_Field_write_nc4_X0 SUBROUTINE IO_Field_write_nc4_X1(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -574,19 +574,19 @@ END SUBROUTINE IO_Field_write_nc4_X1 SUBROUTINE IO_Field_write_nc4_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE,OISCOORD) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files) INTEGER,OPTIONAL, INTENT(IN) :: KZFILE ! Number of the Z-level split file LOGICAL,OPTIONAL, INTENT(IN) :: OISCOORD ! Is a coordinate variable (->do not write coordinates attribute) ! -INTEGER(KIND=CDFINT) :: istatus -CHARACTER(LEN=4) :: YSUFFIX -INTEGER(KIND=CDFINT) :: IVARID -logical :: gisempty -TYPE(TFIELDDATA), pointer :: TZFIELD -TYPE(TFILEDATA), POINTER :: TZFILE +CHARACTER(LEN=4) :: YSUFFIX +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +logical :: gisempty +CLASS(TFIELDMETADATA), pointer :: TZFIELD +TYPE(TFILEDATA), POINTER :: TZFILE ! KRESP = 0 ! @@ -610,7 +610,7 @@ END SUBROUTINE IO_Field_write_nc4_X2 SUBROUTINE IO_Field_write_nc4_X3(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -636,7 +636,7 @@ END SUBROUTINE IO_Field_write_nc4_X3 SUBROUTINE IO_Field_write_nc4_X4(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -662,7 +662,7 @@ END SUBROUTINE IO_Field_write_nc4_X4 SUBROUTINE IO_Field_write_nc4_X5(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -688,7 +688,7 @@ END SUBROUTINE IO_Field_write_nc4_X5 SUBROUTINE IO_Field_write_nc4_X6(TPFILE,TPFIELD,PFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -723,7 +723,7 @@ USE MODD_PARAMETERS_ll, ONLY: JPVEXT #endif ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, INTENT(IN) :: KFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -773,7 +773,7 @@ USE MODD_PARAMETERS_ll, ONLY: JPVEXT #endif ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -799,7 +799,7 @@ END SUBROUTINE IO_Field_write_nc4_N1 SUBROUTINE IO_Field_write_nc4_N2(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -825,7 +825,7 @@ END SUBROUTINE IO_Field_write_nc4_N2 SUBROUTINE IO_Field_write_nc4_N3(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -851,7 +851,7 @@ END SUBROUTINE IO_Field_write_nc4_N3 SUBROUTINE IO_Field_write_nc4_N4(TPFILE,TPFIELD,KFIELD,KRESP) ! TYPE(TFILEDATA),TARGET, INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field INTEGER, INTENT(OUT):: KRESP ! @@ -877,7 +877,7 @@ END SUBROUTINE IO_Field_write_nc4_N4 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, INTENT(IN) :: OFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -908,7 +908,7 @@ END SUBROUTINE IO_Field_write_nc4_L0 SUBROUTINE IO_Field_write_nc4_L1(TPFILE,TPFIELD,OFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -942,7 +942,7 @@ END SUBROUTINE IO_Field_write_nc4_L1 SUBROUTINE IO_Field_write_nc4_C0(TPFILE,TPFIELD,HFIELD,KRESP) ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*), INTENT(IN) :: HFIELD INTEGER, INTENT(OUT):: KRESP ! @@ -980,7 +980,7 @@ SUBROUTINE IO_Field_write_nc4_C1(TPFILE,TPFIELD,HFIELD,KRESP) ! J.Escobar : 25/04/2018 : missing 'IF ALLOCATED(IVDIMSTMP)' DEALLOCATE !---------------------------------------------------------------- TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD INTEGER, INTENT(OUT) :: KRESP ! @@ -1017,22 +1017,22 @@ USE MODD_TYPE_DATE USE MODE_DATETIME ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), INTENT(IN) :: TPDATA INTEGER, INTENT(OUT):: KRESP ! -INTEGER(KIND=CDFINT) :: istatus -INTEGER(KIND=CDFINT) :: IVARID -TYPE(TFIELDDATA) :: TZFIELD -CHARACTER(LEN=40) :: YUNITS -REAL :: ZDELTATIME !Distance in seconds since reference date and time -TYPE(DATE_TIME) :: TZREF +CHARACTER(LEN=40) :: YUNITS +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +REAL :: ZDELTATIME !Distance in seconds since reference date and time +CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD +TYPE(DATE_TIME) :: TZREF ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! KRESP = 0 ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Model beginning date (TDTMOD%TDATE) is used as the reference date ! Reference time is set to 0. @@ -1071,24 +1071,24 @@ USE MODD_TYPE_DATE USE MODE_DATETIME ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA INTEGER, INTENT(OUT):: KRESP ! -CHARACTER(LEN=40) :: YUNITS -INTEGER :: JI -INTEGER(KIND=CDFINT) :: istatus -INTEGER(KIND=CDFINT) :: IVARID -logical :: gisempty -REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time -TYPE(DATE_TIME) :: TZREF -TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=40) :: YUNITS +INTEGER :: JI +INTEGER(KIND=CDFINT) :: istatus +INTEGER(KIND=CDFINT) :: IVARID +logical :: gisempty +REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time +CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD +TYPE(DATE_TIME) :: TZREF ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! KRESP = 0 ! -TZFIELD = TPFIELD +Allocate( TZFIELD, source = TPFIELD ) ! ! Model beginning date (TDTMOD%TDATE) is used as the reference date ! Reference time is set to 0. @@ -1128,7 +1128,7 @@ END SUBROUTINE IO_Field_write_nc4_T1 subroutine IO_Field_partial_write_nc4_X1( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:), intent(in) :: pfield ! array containing the data field integer, dimension(1), intent(in) :: koffset integer, intent(out) :: kresp @@ -1165,20 +1165,20 @@ end subroutine IO_Field_partial_write_nc4_X1 subroutine IO_Field_partial_write_nc4_X2( tpfile, tpfield, pfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:), intent(in) :: pfield ! array containing the data field integer, dimension(2), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(2) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(2) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1211,7 +1211,7 @@ end subroutine IO_Field_partial_write_nc4_X2 subroutine IO_Field_partial_write_nc4_X3( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:,:), intent(in) :: pfield ! array containing the data field integer, dimension(3), intent(in) :: koffset integer, intent(out) :: kresp @@ -1248,7 +1248,7 @@ end subroutine IO_Field_partial_write_nc4_X3 subroutine IO_Field_partial_write_nc4_X4( tpfile, tpfield, pfield, koffset, kresp ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield real, dimension(:,:,:,:), intent(in) :: pfield ! array containing the data field integer, dimension(4), intent(in) :: koffset integer, intent(out) :: kresp @@ -1285,20 +1285,20 @@ end subroutine IO_Field_partial_write_nc4_X4 subroutine IO_Field_partial_write_nc4_N2( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:), intent(in) :: kfield ! array containing the data field integer, dimension(2), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(2) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(2) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1331,20 +1331,20 @@ end subroutine IO_Field_partial_write_nc4_N2 subroutine IO_Field_partial_write_nc4_N3( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:,:), intent(in) :: kfield ! array containing the data field integer, dimension(3), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(3) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(3) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -1377,20 +1377,20 @@ end subroutine IO_Field_partial_write_nc4_N3 subroutine IO_Field_partial_write_nc4_N4( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile ) type(tfiledata), intent(in) :: tpfile -type(tfielddata), intent(in) :: tpfield +class(tfieldmetadata), intent(in) :: tpfield integer, dimension(:,:,:,:), intent(in) :: kfield ! array containing the data field integer, dimension(4), intent(in) :: koffset integer, intent(out) :: kresp integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file -character(len=4) :: ysuffix -character(len=NMNHNAMELGTMAX) :: yvarname -integer(kind=CDFINT) :: istatus -integer(kind=CDFINT) :: ivarid -integer(kind=CDFINT), dimension(4) :: istarts -type(tfielddata), pointer :: tzfield -type(tfiledata), pointer :: tzfile +character(len=4) :: ysuffix +character(len=NMNHNAMELGTMAX) :: yvarname +integer(kind=CDFINT) :: istatus +integer(kind=CDFINT) :: ivarid +integer(kind=CDFINT), dimension(4) :: istarts +class(tfieldmetadata), pointer :: tzfield +type(tfiledata), pointer :: tzfile kresp = 0 @@ -2454,8 +2454,8 @@ END SUBROUTINE IO_History_append_nc4 subroutine IO_Select_split_file( tpfile, tpfield, tpfileout, tpfieldout, kvertlevel, kzfile ) type(tfiledata), target, intent(in) :: tpfile -type(tfielddata), target, intent(in) :: tpfield -type(tfielddata), pointer, intent(out) :: tpfieldout +class(tfieldmetadata), target, intent(in) :: tpfield +class(tfieldmetadata), pointer, intent(out) :: tpfieldout type(tfiledata), pointer, intent(out) :: tpfileout integer, optional, intent(in) :: kvertlevel ! Number of the vertical level (needed for Z-level split files) integer, optional, intent(in) :: kzfile ! Number of the Z-level split file @@ -2469,9 +2469,8 @@ if ( Present( kvertlevel ) ) then Write( ysuffix, '( i4.4 )' ) kvertlevel tpfileout => tpfile%tfiles_ioz(kzfile)%tfile - !Copy the values of tpfield to the pointer tpfieldout (new tfielddata) - Allocate( tpfieldout ) - tpfieldout = tpfield + !Copy the values of tpfield to the pointer tpfieldout + Allocate( tpfieldout, source = tpfield ) tpfieldout%cmnhname = Trim( tpfieldout%cmnhname ) // ysuffix if ( Len_trim( tpfieldout%cstdname ) > 0 ) tpfieldout%cstdname = Trim( tpfieldout%cstdname ) // '_at_level_' // ysuffix if ( Len_trim( tpfieldout%clongname ) > 0 ) tpfieldout%clongname = Trim( tpfieldout%clongname ) // ' at level ' // ysuffix