Read_MultiSetModel3D_t Subroutine

public subroutine Read_MultiSetModel3D_t(this, filename)

Read every set's solution from a file written by WriteModel, then copy it to the device. The file must hold the same element-set partition (setOfElem) and the same number of nodes per element; a variable with no dataset keeps its current value. The host copy is refreshed from the device first, so on GPU builds that value is the device's.

Collective over the global mesh communicator.

Arguments

TypeIntentOptionalAttributesName
class(MultiSetModel3D_t), intent(inout) :: this
character, intent(in) :: filename

Calls

proc~~read_multisetmodel3d_t~~CallsGraph proc~read_multisetmodel3d_t Read_MultiSetModel3D_t interface~open_hdf5 Open_HDF5 proc~read_multisetmodel3d_t->interface~open_hdf5 interface~readarray_hdf5 ReadArray_HDF5 proc~read_multisetmodel3d_t->interface~readarray_hdf5 proc~datasetexists_hdf5 DatasetExists_HDF5 proc~read_multisetmodel3d_t->proc~datasetexists_hdf5 proc~readsetarray_hdf5 ReadSetArray_HDF5 proc~read_multisetmodel3d_t->proc~readsetarray_hdf5 proc~datasetlength1d_hdf5 DatasetLength1D_HDF5 proc~read_multisetmodel3d_t->proc~datasetlength1d_hdf5 proc~close_hdf5 Close_HDF5 proc~read_multisetmodel3d_t->proc~close_hdf5 proc~open_hdf5_parallel Open_HDF5_parallel interface~open_hdf5->proc~open_hdf5_parallel proc~open_hdf5_serial Open_HDF5_serial interface~open_hdf5->proc~open_hdf5_serial proc~readarray_hdf5_real_r3_parallel ReadArray_HDF5_real_r3_parallel interface~readarray_hdf5->proc~readarray_hdf5_real_r3_parallel proc~readarray_hdf5_real_r5_serial ReadArray_HDF5_real_r5_serial interface~readarray_hdf5->proc~readarray_hdf5_real_r5_serial proc~readarray_hdf5_int32_r1_parallel ReadArray_HDF5_int32_r1_parallel interface~readarray_hdf5->proc~readarray_hdf5_int32_r1_parallel proc~readarray_hdf5_real_r2_serial ReadArray_HDF5_real_r2_serial interface~readarray_hdf5->proc~readarray_hdf5_real_r2_serial proc~readarray_hdf5_real_r2_parallel ReadArray_HDF5_real_r2_parallel interface~readarray_hdf5->proc~readarray_hdf5_real_r2_parallel proc~readarray_hdf5_real_r4_parallel ReadArray_HDF5_real_r4_parallel interface~readarray_hdf5->proc~readarray_hdf5_real_r4_parallel proc~readarray_hdf5_real_r1_serial ReadArray_HDF5_real_r1_serial interface~readarray_hdf5->proc~readarray_hdf5_real_r1_serial proc~readarray_hdf5_real_r4_serial ReadArray_HDF5_real_r4_serial interface~readarray_hdf5->proc~readarray_hdf5_real_r4_serial proc~readarray_hdf5_real_r3_serial ReadArray_HDF5_real_r3_serial interface~readarray_hdf5->proc~readarray_hdf5_real_r3_serial proc~readarray_hdf5_int32_r1_serial ReadArray_HDF5_int32_r1_serial interface~readarray_hdf5->proc~readarray_hdf5_int32_r1_serial proc~readarray_hdf5_int32_r2_serial ReadArray_HDF5_int32_r2_serial interface~readarray_hdf5->proc~readarray_hdf5_int32_r2_serial proc~readarray_hdf5_int32_r2_parallel ReadArray_HDF5_int32_r2_parallel interface~readarray_hdf5->proc~readarray_hdf5_int32_r2_parallel proc~readarray_hdf5_real_r1_parallel ReadArray_HDF5_real_r1_parallel interface~readarray_hdf5->proc~readarray_hdf5_real_r1_parallel h5lexists_f h5lexists_f proc~datasetexists_hdf5->h5lexists_f h5dget_space_f h5dget_space_f proc~readsetarray_hdf5->h5dget_space_f h5dclose_f h5dclose_f proc~readsetarray_hdf5->h5dclose_f h5kind_to_type h5kind_to_type proc~readsetarray_hdf5->h5kind_to_type h5pclose_f h5pclose_f proc~readsetarray_hdf5->h5pclose_f h5dread_f h5dread_f proc~readsetarray_hdf5->h5dread_f h5pcreate_f h5pcreate_f proc~readsetarray_hdf5->h5pcreate_f h5pset_dxpl_mpio_f h5pset_dxpl_mpio_f proc~readsetarray_hdf5->h5pset_dxpl_mpio_f h5sget_simple_extent_dims_f h5sget_simple_extent_dims_f proc~readsetarray_hdf5->h5sget_simple_extent_dims_f h5sselect_hyperslab_f h5sselect_hyperslab_f proc~readsetarray_hdf5->h5sselect_hyperslab_f h5sselect_none_f h5sselect_none_f proc~readsetarray_hdf5->h5sselect_none_f h5sclose_f h5sclose_f proc~readsetarray_hdf5->h5sclose_f h5dopen_f h5dopen_f proc~readsetarray_hdf5->h5dopen_f h5sget_simple_extent_ndims_f h5sget_simple_extent_ndims_f proc~readsetarray_hdf5->h5sget_simple_extent_ndims_f h5screate_simple_f h5screate_simple_f proc~readsetarray_hdf5->h5screate_simple_f proc~datasetlength1d_hdf5->h5dget_space_f proc~datasetlength1d_hdf5->h5dclose_f proc~datasetlength1d_hdf5->h5lexists_f proc~datasetlength1d_hdf5->h5sget_simple_extent_dims_f proc~datasetlength1d_hdf5->h5sclose_f proc~datasetlength1d_hdf5->h5dopen_f proc~datasetlength1d_hdf5->h5sget_simple_extent_ndims_f h5close_f h5close_f proc~close_hdf5->h5close_f h5fclose_f h5fclose_f proc~close_hdf5->h5fclose_f proc~readarray_hdf5_real_r3_parallel->h5dget_space_f proc~readarray_hdf5_real_r3_parallel->h5dclose_f proc~readarray_hdf5_real_r3_parallel->h5pclose_f proc~readarray_hdf5_real_r3_parallel->h5dread_f proc~readarray_hdf5_real_r3_parallel->h5pcreate_f proc~readarray_hdf5_real_r3_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_real_r3_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_real_r3_parallel->h5sclose_f proc~readarray_hdf5_real_r3_parallel->h5dopen_f proc~readarray_hdf5_real_r3_parallel->h5screate_simple_f h5dget_type_f h5dget_type_f proc~readarray_hdf5_real_r3_parallel->h5dget_type_f h5tclose_f h5tclose_f proc~readarray_hdf5_real_r3_parallel->h5tclose_f proc~open_hdf5_parallel->h5pclose_f proc~open_hdf5_parallel->h5pcreate_f h5open_f h5open_f proc~open_hdf5_parallel->h5open_f h5fopen_f h5fopen_f proc~open_hdf5_parallel->h5fopen_f h5pset_fapl_mpio_f h5pset_fapl_mpio_f proc~open_hdf5_parallel->h5pset_fapl_mpio_f h5fcreate_f h5fcreate_f proc~open_hdf5_parallel->h5fcreate_f proc~readarray_hdf5_real_r5_serial->h5dclose_f proc~readarray_hdf5_real_r5_serial->h5kind_to_type proc~readarray_hdf5_real_r5_serial->h5dread_f proc~readarray_hdf5_real_r5_serial->h5dopen_f proc~readarray_hdf5_int32_r1_parallel->h5dget_space_f proc~readarray_hdf5_int32_r1_parallel->h5dclose_f proc~readarray_hdf5_int32_r1_parallel->h5pclose_f proc~readarray_hdf5_int32_r1_parallel->h5dread_f proc~readarray_hdf5_int32_r1_parallel->h5pcreate_f proc~readarray_hdf5_int32_r1_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_int32_r1_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_int32_r1_parallel->h5sclose_f proc~readarray_hdf5_int32_r1_parallel->h5dopen_f proc~readarray_hdf5_int32_r1_parallel->h5screate_simple_f proc~readarray_hdf5_int32_r1_parallel->h5dget_type_f proc~readarray_hdf5_int32_r1_parallel->h5tclose_f proc~readarray_hdf5_real_r2_serial->h5dclose_f proc~readarray_hdf5_real_r2_serial->h5kind_to_type proc~readarray_hdf5_real_r2_serial->h5dread_f proc~readarray_hdf5_real_r2_serial->h5dopen_f proc~readarray_hdf5_real_r2_parallel->h5dget_space_f proc~readarray_hdf5_real_r2_parallel->h5dclose_f proc~readarray_hdf5_real_r2_parallel->h5pclose_f proc~readarray_hdf5_real_r2_parallel->h5dread_f proc~readarray_hdf5_real_r2_parallel->h5pcreate_f proc~readarray_hdf5_real_r2_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_real_r2_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_real_r2_parallel->h5sclose_f proc~readarray_hdf5_real_r2_parallel->h5dopen_f proc~readarray_hdf5_real_r2_parallel->h5screate_simple_f proc~readarray_hdf5_real_r2_parallel->h5dget_type_f proc~readarray_hdf5_real_r2_parallel->h5tclose_f proc~readarray_hdf5_real_r4_parallel->h5dget_space_f proc~readarray_hdf5_real_r4_parallel->h5dclose_f proc~readarray_hdf5_real_r4_parallel->h5pclose_f proc~readarray_hdf5_real_r4_parallel->h5dread_f proc~readarray_hdf5_real_r4_parallel->h5pcreate_f proc~readarray_hdf5_real_r4_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_real_r4_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_real_r4_parallel->h5sclose_f proc~readarray_hdf5_real_r4_parallel->h5dopen_f proc~readarray_hdf5_real_r4_parallel->h5screate_simple_f proc~readarray_hdf5_real_r4_parallel->h5dget_type_f proc~readarray_hdf5_real_r4_parallel->h5tclose_f proc~open_hdf5_serial->h5open_f proc~open_hdf5_serial->h5fopen_f proc~open_hdf5_serial->h5fcreate_f proc~readarray_hdf5_real_r1_serial->h5dclose_f proc~readarray_hdf5_real_r1_serial->h5kind_to_type proc~readarray_hdf5_real_r1_serial->h5dread_f proc~readarray_hdf5_real_r1_serial->h5dopen_f proc~readarray_hdf5_real_r4_serial->h5dclose_f proc~readarray_hdf5_real_r4_serial->h5kind_to_type proc~readarray_hdf5_real_r4_serial->h5dread_f proc~readarray_hdf5_real_r4_serial->h5dopen_f proc~readarray_hdf5_real_r3_serial->h5dclose_f proc~readarray_hdf5_real_r3_serial->h5kind_to_type proc~readarray_hdf5_real_r3_serial->h5dread_f proc~readarray_hdf5_real_r3_serial->h5dopen_f proc~readarray_hdf5_int32_r1_serial->h5dclose_f proc~readarray_hdf5_int32_r1_serial->h5kind_to_type proc~readarray_hdf5_int32_r1_serial->h5dread_f proc~readarray_hdf5_int32_r1_serial->h5dopen_f proc~readarray_hdf5_int32_r2_serial->h5dclose_f proc~readarray_hdf5_int32_r2_serial->h5kind_to_type proc~readarray_hdf5_int32_r2_serial->h5dread_f proc~readarray_hdf5_int32_r2_serial->h5dopen_f proc~readarray_hdf5_int32_r2_parallel->h5dget_space_f proc~readarray_hdf5_int32_r2_parallel->h5dclose_f proc~readarray_hdf5_int32_r2_parallel->h5pclose_f proc~readarray_hdf5_int32_r2_parallel->h5dread_f proc~readarray_hdf5_int32_r2_parallel->h5pcreate_f proc~readarray_hdf5_int32_r2_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_int32_r2_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_int32_r2_parallel->h5sclose_f proc~readarray_hdf5_int32_r2_parallel->h5dopen_f proc~readarray_hdf5_int32_r2_parallel->h5screate_simple_f proc~readarray_hdf5_int32_r2_parallel->h5dget_type_f proc~readarray_hdf5_int32_r2_parallel->h5tclose_f proc~readarray_hdf5_real_r1_parallel->h5dget_space_f proc~readarray_hdf5_real_r1_parallel->h5dclose_f proc~readarray_hdf5_real_r1_parallel->h5pclose_f proc~readarray_hdf5_real_r1_parallel->h5dread_f proc~readarray_hdf5_real_r1_parallel->h5pcreate_f proc~readarray_hdf5_real_r1_parallel->h5pset_dxpl_mpio_f proc~readarray_hdf5_real_r1_parallel->h5sselect_hyperslab_f proc~readarray_hdf5_real_r1_parallel->h5sclose_f proc~readarray_hdf5_real_r1_parallel->h5dopen_f proc~readarray_hdf5_real_r1_parallel->h5screate_simple_f proc~readarray_hdf5_real_r1_parallel->h5dget_type_f proc~readarray_hdf5_real_r1_parallel->h5tclose_f

Contents


Source Code

  subroutine Read_MultiSetModel3D_t(this,filename)
    !! Read every set's solution from a file written by WriteModel, then copy it to the
    !! device. The file must hold the same element-set partition (setOfElem) and the
    !! same number of nodes per element; a variable with no dataset keeps its current
    !! value. The host copy is refreshed from the device first, so on GPU builds that
    !! value is the device's.
    !!
    !! Collective over the global mesh communicator.
    implicit none
    class(MultiSetModel3D_t),intent(inout) :: this
    character(*),intent(in) :: filename
    ! Local
    integer(HID_T) :: fileId
    character(4) :: setString
    character(LEN=:),allocatable :: dsetName
    integer,allocatable :: fileSetOfElem(:)
    integer :: k,ivar,elemOffset
    logical :: parallel

    parallel = this%globalMesh%decomp%mpiEnabled
    if(parallel) then
      call Open_HDF5(filename,H5F_ACC_RDONLY_F,fileId,this%globalMesh%decomp%mpiComm)
    else
      call Open_HDF5(filename,H5F_ACC_RDONLY_F,fileId)
    endif

    ! Check the stored extent first: ReadArray_HDF5 reads the whole dataset into the
    ! buffer, so a longer dataset would write past it.
    if(DatasetLength1D_HDF5(fileId,'/elementsets/setOfElem') /= size(this%setOfElem)) then
      print*,__FILE__," : ",trim(filename)," holds no element-set partition for ", &
        size(this%setOfElem)," elements"
      error stop "MultiSetModel3D : ReadModel partition mismatch"
    endif
    allocate(fileSetOfElem(1:size(this%setOfElem)))
    call ReadArray_HDF5(fileId,'/elementsets/setOfElem',fileSetOfElem)
    if(any(fileSetOfElem /= this%setOfElem)) then
      print*,__FILE__," : ",trim(filename)," holds a different element-set partition"
      error stop "MultiSetModel3D : ReadModel partition mismatch"
    endif
    deallocate(fileSetOfElem)

    do k = 1,this%nSets
      call this%sets(k)%model%solution%UpdateHost()
      write(setString,'(I4.4)') k
      elemOffset = this%sets(k)%mesh%decomp%offsetElem(this%globalMesh%decomp%rankId+1)
      do ivar = 1,this%sets(k)%model%solution%nVar
        dsetName = '/set_'//setString//'/controlgrid/solution/'// &
                   trim(this%sets(k)%model%solution%meta(ivar)%name)
        if(.not. DatasetExists_HDF5(fileId,dsetName)) then
          if(this%globalMesh%decomp%rankId == 0) then
            print*,__FILE__," : Pickup file holds no ",dsetName, &
              " - keeping the current value for this variable."
          endif
          cycle
        endif
        call ReadSetArray_HDF5(fileId,dsetName, &
                               this%sets(k)%model%solution%interior(:,:,:,:,ivar), &
                               elemOffset,this%sets(k)%mesh%nGlobalElem,parallel)
      enddo
      call this%sets(k)%model%solution%UpdateDevice()
    enddo

    call Close_HDF5(fileId)

  endsubroutine Read_MultiSetModel3D_t