Load the subresolution property from disk.
Before this can be done, the coloring information has to have been loaded.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_subres_prop_type), | intent(out) | :: | me |
Color definitions to load. |
||
type(treelmesh_type), | intent(in) | :: | tree |
Tree to build the polynomial subresolution information for |
||
type(tem_color_prop_type), | intent(in) | :: | coloring |
Information on the colors in the mesh. |
subroutine tem_subres_prop_load( me, tree, coloring )
! -----------------------------------------------------------------------!
!> Color definitions to load.
type(tem_subres_prop_type), intent(out) :: me
!> Tree to build the polynomial subresolution information for
type(treelmesh_type), intent(in) :: tree
!> Information on the colors in the mesh.
type(tem_color_prop_type), intent(in) :: coloring
! -----------------------------------------------------------------------!
integer :: rl
integer :: fUnit
character(len=pathLen) :: datafile
integer :: iColor
integer :: iProp
integer :: colChar, colBit
integer(kind=long_k), allocatable :: long_counts(:)
integer :: iError
integer :: iElem
integer :: ice
! -----------------------------------------------------------------------!
prp_loop: do iprop=1, tree%global%nProperties
if (tree%global%Property(iprop)%bitpos == prp_hasPolynomial) then
me%header => tree%global%Property(iprop)
me%property => tree%property(iprop)
datafile = trim(tree%global%dirname)//'subres.ascii'
allocate(me%subresolved_colors(coloring%nChars, me%property%nElems))
allocate(me%nElems(coloring%nColors))
allocate(me%Offset(coloring%nColors))
me%Offset = 0_long_k
! If there are actually subresolved elements on the local process,
! read them now.
if (me%property%nElems > 0) then
allocate(me%elem(coloring%nColors))
inquire(iolength=rl) me%subresolved_colors(:,1)
call tem_open( newunit = fUnit, &
& file = datafile, &
& action = 'read', &
& access = 'stream', &
& form = 'unformatted', &
& status = 'old' )
read(fUnit, pos=me%property%offset+1) me%subresolved_colors
close(fUnit)
do iColor=1,coloring%nColors
colChar = (iColor-1)/colors_per_char + 1
colBit = mod(iColor-1, colors_per_char)
me%nElems(iColor) &
& = count( btest(ichar(me%subresolved_colors(ColChar,:)), &
& ColBit) )
allocate( me%elem(iColor)%id(me%nElems(iColor)) )
! Store the element link for each color.
if (me%nElems(iColor) > 0) then
ice = 0
do iElem=1,me%property%nElems
if ( btest(ichar(me%subresolved_colors(ColChar,iElem)), &
& colBit) ) then
ice = ice + 1
me%elem(iColor)%id(ice) = me%property%elemid(iElem)
end if
end do
end if
end do
else
! No subresolved elements on the local partition:
me%nElems = 0
end if
allocate( long_counts(coloring%nColors) )
long_counts = me%nElems
call MPI_Exscan( long_counts, me%Offset, coloring%nColors, &
& MPI_INTEGER8, MPI_SUM, tree%global%comm, iError )
EXIT prp_loop
end if
end do prp_loop
end subroutine tem_subres_prop_load