A routine to load global informations from the header file in the given directory.
Read the header only on the root process, broadcast to all others
Broadcast the header informations to all processes.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_global_type), | intent(out) | :: | me |
Structure to store header in |
||
character(len=*), | intent(in) | :: | dirname |
Directory containing the mesh informations |
||
integer, | intent(in) | :: | myPart |
The process local part (= MPI Rank in comm) |
||
integer, | intent(in) | :: | nParts |
Number of partitions, the mesh is partitioned into (= Number of MPI processes in comm). |
||
integer, | intent(in) | :: | comm |
MPI Communicator to use |
subroutine load_tem_global( me, dirname, myPart, nParts, comm )
! -------------------------------------------------------------------- !
!> Structure to store header in
type(tem_global_type), intent(out) :: me
!> Directory containing the mesh informations
character(len=*), intent(in) :: dirname
!> The process local part (= MPI Rank in comm)
integer, intent(in) :: myPart
!> Number of partitions, the mesh is partitioned into (= Number of MPI
!! processes in comm).
integer, intent(in) :: nParts
!> MPI Communicator to use
integer, intent(in) :: comm
! -------------------------------------------------------------------- !
character(len=300) :: headname
integer :: iError
integer :: root
integer :: i
logical :: ex
integer :: thandle, sub_handle
type( flu_State ) :: conf ! lua flu state to read lua file
! -------------------------------------------------------------------- !
root = 0
me%comm = comm
me%myPart = myPart
me%nParts = nParts
me%dirname = trim(adjustl(dirname))
headname = trim(me%dirname)//'header.lua'
write(logUnit(1), *) 'Load mesh header from file: '//trim(headname)
if (myPart == root) then
inquire(file=trim(headname), exist=ex)
if (.not. ex) then
write(*,*) 'File ',trim(headname),' not found. Aborting.'
stop
endif
!! Read the header only on the root process, broadcast to all others
! open mesh header file
call open_config_file(L = conf, filename = trim(headname))
! load label
call aot_get_val( L = conf, &
& key = 'label', &
& val = me%label, &
& ErrCode = iError )
call aot_get_val( L = conf, &
& key = 'comment', &
& val = me%comment, &
& ErrCode = iError )
! Open boundingbox table
call aot_table_open( L = conf, thandle = thandle, key='boundingbox' )
! Read the origin
call aot_table_open( L = conf, &
& parent = thandle, &
& thandle = sub_handle, &
& key = 'origin' )
do i = 1,3
call aot_get_val( L = conf, &
& thandle = sub_handle, &
& pos = i, &
& val = me%origin(i), &
& ErrCode = iError )
end do
call aot_table_close( L = conf, thandle = sub_handle )
! Read the bounding cube length
call aot_get_val( L = conf, &
& thandle = thandle, &
& key = 'length', &
& val = me%BoundingCubeLength, &
& ErrCode = iError )
! Close boundingbox table again
call aot_table_close( L = conf, thandle = thandle )
call aot_get_val( L = conf, &
& key = 'nElems', &
& val = me%nElems, &
& ErrCode = iError )
call aot_get_val( L = conf, &
& key = 'minLevel', &
& val = me%minLevel, &
& ErrCode = iError )
call aot_get_val( L = conf, &
& key = 'maxLevel', &
& val = me%maxLevel, &
& ErrCode = iError )
call aot_get_val( L = conf, &
& key = 'nProperties', &
& val = me%nProperties, &
& ErrCode = iError )
! Read the effective bounding cube parameters
! Open the effective bounding box table
call aot_table_open( L = conf, thandle = thandle, key='effBoundingbox' )
! Read the origin
call aot_table_open( L = conf, &
& parent = thandle, &
& thandle = sub_handle, &
& key = 'origin' )
do i = 1,3
call aot_get_val( L = conf, &
& thandle = sub_handle, &
& pos = i, &
& val = me%effboundingcube(i,1), &
& ErrCode = iError )
end do
call aot_table_close( L = conf, thandle = sub_handle )
me%effOrigin = me%effboundingcube(:,1)
! Read the effective length (min and max)
call aot_table_open( L = conf, &
& parent = thandle, &
& thandle = sub_handle, &
& key = 'effLength' )
do i = 1,3
call aot_get_val( L = conf, &
& thandle = sub_handle, &
& pos = i, &
& val = me%effLength(i), &
& ErrCode = iError )
me%effboundingcube(i,2) = me%effboundingcube(i,1) + me%effLength(i)
end do
call aot_table_close( L = conf, thandle = sub_handle )
end if
write(logUnit(1),*) 'The real bounding cube is...'
write(logUnit(1),*) ' min: ',me%effBoundingCube(:,1)
write(logUnit(1),*) ' max: ',me%effBoundingCube(:,2)
!! Broadcast the header informations to all processes.
call MPI_Bcast(me%nElems, 1, long_k_mpi, root, me%comm, iError)
call MPI_Bcast(me%label, LabelLen, MPI_CHARACTER, root, me%comm, iError)
call MPI_Bcast(me%comment, LabelLen, MPI_CHARACTER, root, me%comm, iError)
call MPI_Bcast(me%BoundingCubeLength, 1, rk_mpi, root, me%comm, iError)
call MPI_Bcast(me%Origin, 3, rk_mpi, root, me%comm, iError)
call MPI_Bcast(me%minLevel, 1, MPI_INTEGER, root, me%comm, iError)
call MPI_Bcast(me%maxLevel, 1, MPI_INTEGER, root, me%comm, iError)
call MPI_Bcast(me%nProperties, 1, MPI_INTEGER, root, me%comm, iError)
call MPI_Bcast(me%effBoundingCube, 6, rk_mpi, root, me%comm, iError)
if (associated(me%Property)) deallocate(me%property)
allocate(me%Property(me%nProperties))
call load_tem_prophead( me = me%Property, &
& myPart = myPart, &
& comm = me%comm, &
& conf = conf, &
& root = root )
if (myPart == root) then
call close_config(conf)
end if
end subroutine load_tem_global