load bc property header from lua file, boundaryID from bnd.lsb
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_BC_prop_type), | intent(inout) | :: | me |
Boundary condition construct to load the data into |
||
integer(kind=long_k), | intent(in) | :: | offset |
Offset of the local set of elements in the global list |
||
integer, | intent(in) | :: | nElems |
Local number of elements with this property |
||
character(len=*), | intent(in) | :: | basename |
Name of the file, the data is stored in, will be appended with ".ascii" for the header information and ".lsb" or ".msb" for the binary data. |
||
integer, | intent(in) | :: | myPart |
Partition to load |
||
integer, | intent(in) | :: | comm |
Communicator to use |
subroutine load_tem_BC_prop( me, offset, nElems, basename, myPart, comm )
! ---------------------------------------------------------------------------
!> Boundary condition construct to load the data into
type(tem_BC_prop_type), intent(inout) :: me
!> Offset of the local set of elements in the global list
integer(kind=long_k), intent(in) :: offset
!> Local number of elements with this property
integer, intent(in) :: nElems
!> Name of the file, the data is stored in, will be appended with
!! ".ascii" for the header information and ".lsb" or ".msb" for the
!! binary data.
character(len=*), intent(in) :: basename
!> Partition to load
integer, intent(in) :: myPart
!> Communicator to use
integer, intent(in) :: comm
! ---------------------------------------------------------------------------
type( flu_State ) :: conf ! lua flu state to read lua file
integer :: i
integer, parameter :: root = 0
integer :: BCcomm
integer :: color, iError
logical :: participant !< If the local rank is a participant in BC
character(len=4) :: EndianSuffix
character(len=256) :: headerfile
character(len=256) :: datafile
integer :: thandle, typesize
integer(kind=long_k), allocatable :: buffer(:)
integer(kind=long_k), allocatable :: globbuffer(:)
integer(kind=MPI_OFFSET_KIND) :: displacement
integer :: fh, etype, ftype, iostatus( MPI_STATUS_SIZE )
integer :: file_rec_len
integer :: myBCrank
! ---------------------------------------------------------------------------
headerfile = trim(basename)//'.lua'
EndianSuffix = tem_create_EndianSuffix()
datafile = trim(basename)//trim(EndianSuffix)
if (me%header%nElems > 0) then
write(logUnit(1), *) 'Load boundary ID from file: '//trim(datafile)
end if
if (myPart == root) then
! Read the header only on the root process, broadcast to all others
! open mesh header file
call open_config_file( L = conf, filename = headerfile )
call aot_get_val( L = conf, &
& key = 'nSides', &
& val = me%nSides, &
& ErrCode = iError )
call aot_get_val( L = conf, &
& key = 'nBCtypes', &
& val = me%nBCtypes, &
& ErrCode = iError )
end if
call MPI_Bcast(me%nSides, 1, MPI_INTEGER, root, comm, iError)
call MPI_Bcast(me%nBCtypes, 1, MPI_INTEGER, root, comm, iError)
allocate(me%BC_label(me%nBCtypes))
allocate(me%hasQVal(me%nBCtypes))
me%hasQVal(:) = .false.
if (myPart == root) then
! Now read the list of boundary labels
call aot_table_open( L = conf, thandle = thandle, key = 'bclabel' )
do i=1,me%nBCtypes
call aot_get_val( L = conf, &
& thandle = thandle, &
& pos = i, &
& val = me%BC_label(i), &
& ErrCode = iError )
end do
call aot_table_close( L = conf, thandle = thandle )
call close_config( conf )
end if
call MPI_Bcast( me%BC_label, LabelLen*me%nBCtypes, MPI_CHARACTER, &
& root, comm, iError )
allocate(me%boundary_ID(me%nSides, nElems))
participant = ( nElems > 0 )
if (participant) then
color = 1
else
color = MPI_UNDEFINED
end if
! Split the communicator
call MPI_COMM_SPLIT(comm, color, myPart, BCcomm, iError)
if (nElems > 0) then
allocate( buffer(me%nSides * nElems) )
if (me%header%nElems*me%nSides > io_buffer_size) then
write(logUnit(5), *) 'read with MPI'
! Create a contiguous type to describe the vector per element
call MPI_TYPE_CONTIGUOUS( me%nSides, long_k_mpi, etype, iError )
call check_mpi_error(iError,'contiguous etype in load_tem_BC_prop')
call MPI_TYPE_COMMIT( etype, iError )
call check_mpi_error(iError,'commit etype in load_tem_BC_prop')
call MPI_TYPE_SIZE(etype, typesize, iError )
call check_mpi_error(iError,'typesize in load_tem_BC_prop')
! Calculate displacement for file view
displacement = offset * typesize * 1_MPI_OFFSET_KIND
! Create a MPI CONTIGUOUS as ftype for file view
call MPI_TYPE_CONTIGUOUS(nElems, etype, ftype, iError)
call check_mpi_error(iError,'contiguous ftype in load_tem_BC_prop')
call MPI_TYPE_COMMIT( ftype, iError )
call check_mpi_error( iError, 'commit ftype in load_tem_BC_prop')
! Open the binary file for MPI I/O (read)
call MPI_FILE_OPEN( BCcomm, trim(datafile), MPI_MODE_RDONLY, &
& MPI_INFO_NULL, fh, iError )
call check_mpi_error( iError, 'Open File in load_tem_BC_prop')
! Set the view for each process on the file above
call MPI_FILE_SET_VIEW( fh, displacement, etype, ftype, "native", &
& MPI_INFO_NULL, iError )
call check_mpi_error( iError,'Set File view in load_tem_BC_prop')
! Read data from the file
call MPI_FILE_READ_ALL( fh, buffer, nElems, etype, iostatus, iError )
call check_mpi_error( iError,'Read All in load_tem_BC_prop')
!Free the MPI_Datatypes which were created and close the file
call MPI_TYPE_FREE (etype, iError)
call check_mpi_error( iError,'free etype in load_tem_BC_prop')
call MPI_TYPE_FREE (ftype, iError)
call check_mpi_error( iError,'free ftype in load_tem_BC_prop')
call MPI_FILE_CLOSE(fh, iError)
call check_mpi_error( iError,'close file in load_tem_BC_prop')
! END IO-part
else
! File is so small, it probably is faster to read it on a single process
! and broadcast the data.
call MPI_Comm_rank(BCcomm, myBCrank, iError)
allocate(globbuffer(me%header%nElems*me%nSides))
if (myBCrank == 0) then
write(logUnit(5), *) 'read on a single process'
inquire(iolength = file_rec_len) globbuffer
call tem_open( newunit = fh, &
& file = trim(datafile), &
& recl = file_rec_len, &
& action = 'read', &
& access = 'direct', &
& form = 'unformatted' )
read(fh, rec=1) globbuffer
close(fh)
end if
call MPI_Bcast( globbuffer, int(me%nSides*me%header%nElems), &
& long_k_mpi, 0, BCcomm, iError )
buffer = globbuffer(offset*me%nSides+1:(offset+nElems)*me%nSides)
deallocate(globbuffer)
end if
do i=1,nElems
me%boundary_ID(:,i) = buffer( ((i-1)*me%nSides+1) : (i*me%nSides) )
end do
deallocate(buffer)
end if
end subroutine load_tem_BC_prop