diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 index 0bff9c725fc49f3bdf4e01e40a8e66866c74bc15..fda6a6e4b5374fa57d5cbe692f8037d8202a0d54 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 @@ -12,6 +12,7 @@ ! P. Wautelet 05/03/2019: rename IO subroutines and modules ! P. Wautelet 18/09/2019: correct support of 64bit integers (MNH_INT=8) ! P. Wautelet 14/09/2020: IO_Knowndims_set_nc4: add new dimensions + remove 'time' dimension in diachronic files +! P. Wautelet 14/09/2020: IO_Vdims_fill_nc4: use ndimlist when provided to fill dimensions ids !----------------------------------------------------------------- #if defined(MNH_IOCDF4) module mode_io_tools_nc4 @@ -440,16 +441,33 @@ END SUBROUTINE IO_Iocdf_dealloc_nc4 SUBROUTINE IO_Vdims_fill_nc4(TPFILE, TPFIELD, KSHAPE, KVDIMS) + +use modd_field, only: NMNHDIM_UNKNOWN, NMNHDIM_ONE, NMNHDIM_COMPLEX, & + NMNHDIM_BUDGET_CART_NI, NMNHDIM_BUDGET_CART_NJ, NMNHDIM_BUDGET_CART_NI_U, & + NMNHDIM_BUDGET_CART_NJ_U, NMNHDIM_BUDGET_CART_NI_V, NMNHDIM_BUDGET_CART_NJ_V, & + NMNHDIM_BUDGET_CART_LEVEL, NMNHDIM_BUDGET_CART_LEVEL_W, & + NMNHDIM_BUDGET_MASK_LEVEL, NMNHDIM_BUDGET_MASK_LEVEL_W, & + NMNHDIM_BUDGET_MASK_TIME, NMNHDIM_BUDGET_MASK_NBUMASK, & + NMNHDIM_BUDGET_LES_AVG_TIME, NMNHDIM_BUDGET_LES_TIME, & + NMNHDIM_BUDGET_LES_LEVEL, NMNHDIM_BUDGET_LES_SV, & + NMNHDIM_SPECTRA_2PTS_NI, NMNHDIM_SPECTRA_2PTS_NJ, & + NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ, & + NMNHDIM_SPECTRA_LEVEL, & + NMNHDIM_UNUSED + TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD INTEGER(KIND=CDFINT),DIMENSION(:), INTENT(IN) :: KSHAPE INTEGER(KIND=CDFINT),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS ! -INTEGER :: IGRID -INTEGER :: JI -CHARACTER(LEN=32) :: YINT -CHARACTER(LEN=2) :: YDIR -TYPE(DIMCDF), POINTER :: PTDIM +CHARACTER(LEN=32) :: YINT +CHARACTER(LEN=2) :: YDIR +character(len=:), allocatable :: ydimname +INTEGER :: IGRID +integer :: iresp +INTEGER :: JI +type(dimcdf) :: tzdim +TYPE(DIMCDF), POINTER :: PTDIM ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Vdims_fill_nc4','called for '//TRIM(TPFIELD%CMNHNAME)) ! @@ -481,35 +499,129 @@ IF(IGRID==0 .AND. YDIR/='--' .AND. YDIR/='' ) THEN CALL PRINT_MSG(NVERB_FATAL,'IO','IO_Vdims_fill_nc4','invalid YDIR ('//TRIM(YDIR)//') with NGRID=0 for field ' & //TRIM(TPFIELD%CMNHNAME)) END IF -! -DO JI=1,SIZE(KSHAPE) - IF (JI == 1) THEN - IF ( (YDIR == 'XX' .OR. YDIR == 'XY') .AND. KSHAPE(1)==TPFILE%TNCCOORDS(1,IGRID)%TDIM%LEN) THEN - KVDIMS(1) = TPFILE%TNCCOORDS(1,IGRID)%TDIM%ID - ELSE IF ( YDIR == 'YY' .AND. KSHAPE(1)==TPFILE%TNCCOORDS(2,IGRID)%TDIM%LEN) THEN - KVDIMS(1) = TPFILE%TNCCOORDS(2,IGRID)%TDIM%ID - ELSE IF ( YDIR == 'ZZ' .AND. KSHAPE(1)==TPFILE%TNCCOORDS(3,IGRID)%TDIM%LEN) THEN - KVDIMS(1) = TPFILE%TNCCOORDS(3,IGRID)%TDIM%ID - ELSE - PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(1)); KVDIMS(1) = PTDIM%ID - END IF - ELSE IF (JI == 2) THEN - IF ( YDIR == 'XY' .AND. KSHAPE(2)==TPFILE%TNCCOORDS(2,IGRID)%TDIM%LEN) THEN - KVDIMS(2) = TPFILE%TNCCOORDS(2,IGRID)%TDIM%ID - ELSE - PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(2)); KVDIMS(2) = PTDIM%ID - END IF - ELSE IF (JI == 3) THEN - IF ( YDIR == 'XY' .AND. KSHAPE(3)==TPFILE%TNCCOORDS(3,IGRID)%TDIM%LEN) THEN - KVDIMS(3) = TPFILE%TNCCOORDS(3,IGRID)%TDIM%ID + +if ( Any( tpfield%ndimlist(:) /= NMNHDIM_UNKNOWN ) ) then + do ji = 1, Size( kvdims ) + if ( tpfield%ndimlist(ji) == NMNHDIM_UNKNOWN ) & + call Print_msg( NVERB_FATAL, 'IO', 'IO_Vdims_fill_nc4', 'ndimlist partially filled for field ' // Trim( tpfield%cmnhname ) ) + + select case ( tpfield%ndimlist(ji) ) + case ( NMNHDIM_ONE ) + ydimname = 'one' + + case ( NMNHDIM_COMPLEX ) + ydimname = 'real_imaginary' + + case ( NMNHDIM_BUDGET_CART_NI ) + ydimname = 'cart_ni' + + case ( NMNHDIM_BUDGET_CART_NJ ) + ydimname = 'cart_nj' + + case ( NMNHDIM_BUDGET_CART_NI_U ) + ydimname = 'cart_ni_u' + + case ( NMNHDIM_BUDGET_CART_NJ_U ) + ydimname = 'cart_nj_u' + + case ( NMNHDIM_BUDGET_CART_NI_V ) + ydimname = 'cart_ni_v' + + case ( NMNHDIM_BUDGET_CART_NJ_V ) + ydimname = 'cart_nj_v' + + case ( NMNHDIM_BUDGET_CART_LEVEL ) + ydimname = 'cart_level' + + case ( NMNHDIM_BUDGET_CART_LEVEL_W ) + ydimname = 'cart_level_w' + + case ( NMNHDIM_BUDGET_MASK_LEVEL ) + ydimname = 'mask_level' + + case ( NMNHDIM_BUDGET_MASK_LEVEL_W ) + ydimname = 'mask_level_w' + + case ( NMNHDIM_BUDGET_MASK_TIME ) + ydimname = 'time_mask' + + case ( NMNHDIM_BUDGET_MASK_NBUMASK ) + ydimname = 'nbumask' + + case ( NMNHDIM_BUDGET_LES_TIME ) + ydimname = 'time_les' + + case ( NMNHDIM_BUDGET_LES_AVG_TIME ) + ydimname = 'time_les_avg' + + case ( NMNHDIM_BUDGET_LES_LEVEL ) + ydimname = 'level_les' + + case ( NMNHDIM_BUDGET_LES_SV ) + ydimname = 'nsv' + + case ( NMNHDIM_SPECTRA_2PTS_NI ) + ydimname = 'nspectra_2pts_ni' + + case ( NMNHDIM_SPECTRA_2PTS_NJ ) + ydimname = 'nspectra_2pts_nj' + + case ( NMNHDIM_SPECTRA_SPEC_NI ) + ydimname = 'nspectra_spec_ni' + + case ( NMNHDIM_SPECTRA_SPEC_NJ ) + ydimname = 'nspectra_spec_nj' + + case ( NMNHDIM_SPECTRA_LEVEL ) + ydimname = 'nspectra_level' + + case default + call Print_msg( NVERB_FATAL, 'IO', 'IO_Vdims_fill_nc4', & + 'ndimlist case not yet implemented for field ' // Trim( tpfield%cmnhname ) ) + end select + + call IO_Dim_find_byname_nc4( tpfile, ydimname, tzdim, iresp ) + kvdims(ji) = tzdim%id + + ! Check if dimension sizes are consistent with the declared dimensions ( skip ji>size(kshape), timedep dimension) + if ( ji <= Size( kshape ) ) then + if ( kshape(ji) /= tzdim%len ) then + call Print_msg( NVERB_FATAL, 'IO', 'IO_Vdims_fill_nc4', & + 'wrong size for dimension '// Trim( tzdim%name ) // ' of field ' // Trim( tpfield%cmnhname ) ) + end if + end if + + end do +else !ndimlist not provided + DO JI=1,SIZE(KSHAPE) + IF (JI == 1) THEN + IF ( (YDIR == 'XX' .OR. YDIR == 'XY') .AND. KSHAPE(1)==TPFILE%TNCCOORDS(1,IGRID)%TDIM%LEN) THEN + KVDIMS(1) = TPFILE%TNCCOORDS(1,IGRID)%TDIM%ID + ELSE IF ( YDIR == 'YY' .AND. KSHAPE(1)==TPFILE%TNCCOORDS(2,IGRID)%TDIM%LEN) THEN + KVDIMS(1) = TPFILE%TNCCOORDS(2,IGRID)%TDIM%ID + ELSE IF ( YDIR == 'ZZ' .AND. KSHAPE(1)==TPFILE%TNCCOORDS(3,IGRID)%TDIM%LEN) THEN + KVDIMS(1) = TPFILE%TNCCOORDS(3,IGRID)%TDIM%ID + ELSE + PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(1)); KVDIMS(1) = PTDIM%ID + END IF + ELSE IF (JI == 2) THEN + IF ( YDIR == 'XY' .AND. KSHAPE(2)==TPFILE%TNCCOORDS(2,IGRID)%TDIM%LEN) THEN + KVDIMS(2) = TPFILE%TNCCOORDS(2,IGRID)%TDIM%ID + ELSE + PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(2)); KVDIMS(2) = PTDIM%ID + END IF + ELSE IF (JI == 3) THEN + IF ( YDIR == 'XY' .AND. KSHAPE(3)==TPFILE%TNCCOORDS(3,IGRID)%TDIM%LEN) THEN + KVDIMS(3) = TPFILE%TNCCOORDS(3,IGRID)%TDIM%ID + ELSE + PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(3)); KVDIMS(3) = PTDIM%ID + END IF ELSE - PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(3)); KVDIMS(3) = PTDIM%ID + PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(JI)); KVDIMS(JI) = PTDIM%ID END IF - ELSE - PTDIM => IO_Dimcdf_get_nc4(TPFILE, KSHAPE(JI)); KVDIMS(JI) = PTDIM%ID - END IF -END DO -! + END DO +end if + END SUBROUTINE IO_Vdims_fill_nc4