Write single log for the right scheme into its ascii file. This routine dumps the element data
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(hvs_ascii_type), | intent(inout) | :: | ascii |
ascii file to write data to. |
||
type(tem_comm_env_type), | intent(in) | :: | outProc |
Parallel environment to use for the output. |
||
integer, | intent(in) | :: | varpos(:) |
Position of the variable to write |
||
type(tem_varSys_type), | intent(in) | :: | varsys |
Description of the available variable system to get the given varnames from. |
||
type(treelmesh_type), | intent(in) | :: | mesh |
Mesh to write the data on. |
||
type(tem_time_type), | intent(in) | :: | time |
Point in time to use for this data. Can be important for space-time function evaluations. |
||
type(tem_subTree_type), | intent(in), | optional | :: | subtree |
Optional restriction of the elements to output. |
|
integer, | intent(in) | :: | nDofs |
The number of dofs for each scalar variable of the equation system |
subroutine hvs_ascii_dump_elem_data( ascii, outProc, varPos, varSys, mesh, &
& time, subTree, nDofs )
! ---------------------------------------------------------------------------
!> ascii file to write data to.
type(hvs_ascii_type), intent(inout) :: ascii
!> Parallel environment to use for the output.
type(tem_comm_env_type ), intent(in) :: outProc
!> Position of the variable to write
integer, intent(in) :: varpos(:)
!> Description of the available variable system to get the given varnames
!! from.
type(tem_varSys_type), intent(in) :: varsys
!> Mesh to write the data on.
type(treelmesh_type), intent(in) :: mesh
!> Point in time to use for this data.
!!
!! Can be important for space-time function evaluations.
type(tem_time_type), intent(in) :: time
!> Optional restriction of the elements to output.
type(tem_subtree_type), optional, intent(in) :: subtree
!> The number of dofs for each scalar variable of the equation system
integer, intent(in) :: nDofs
! ---------------------------------------------------------------------------
integer :: nVars, nElems, nScalars, elemOff, nChunkElems
integer :: nDofs_out
integer :: nScalars_out
integer :: iElem, iChunk, iScalar, iDof
integer :: buf_start, buf_end
real(kind=rk), allocatable :: res(:)
integer, allocatable :: elemPos(:)
character(len=4000) :: log_output ! output buffer
! ---------------------------------------------------------------------------
allocate(res(io_buffer_size))
! Number of variables to dump
nVars = size(varPos)
! Number of scalars in current output
nScalars = sum(varSys%method%val(varPos(:))%nComponents)
if (present(subTree)) then
nElems = subTree%nElems
else
nElems = mesh%nElems
end if
if (ascii%isReduce) then
! open spatial reduction
call tem_reduction_spatial_open( me = ascii%redSpatial, &
& varSys = varSys, &
& varPos = varPos(:nVars) )
end if
! allocate elemPos to size of chunkSize
allocate(elemPos(ascii%chunkSize))
! Process all chunks to derive the quantities defined in the tracking object
do iChunk = 1, ascii%nChunks
! Number of elements read so far in previous chunks.
elemOff = ((iChunk-1)*ascii%chunkSize)
! number of elements written to THIS chunk
nChunkElems = min(ascii%chunkSize, nElems-elemOff)
! Compute the element lower and upper bound for the current chunk
buf_start = elemOff + 1
buf_end = elemOff + nChunkElems
if (present(subTree)) then
elemPos(1:nChunkElems) = subTree%map2Global(buf_start:buf_end)
else
elemPos(1:nChunkElems) = (/ (iElem, iElem=buf_start, buf_end) /)
end if
! evaluate all variables on current chunk
call tem_get_element_chunk(varSys = varSys, &
& varPos = varPos, &
& elemPos = elemPos(1:nChunkElems), &
& time = time, &
& tree = mesh, &
& nElems = nChunkElems, &
& nDofs = nDofs, &
& res = res )
! preform spatial reduction
if (ascii%isReduce) then
call tem_reduction_spatial_append( &
& me = ascii%redSpatial, &
& chunk = res, &
& nElems = nChunkElems, &
& treeID = mesh%treeID( &
& elemPos(1:nChunkElems) ), &
& tree = mesh, &
& varSys = varSys, &
& nDofs = nDofs, &
& varPos = varPos )
end if
end do ! iChunk
ndofs_out = ndofs
nscalars_out = nscalars
! If a reduction is present in the tracking, then the output is
! changed completely to only the reduced values
! For each variable, a reduction has to be assigned
if( ascii%isReduce ) then
! Perform the global reduction on the data which was appended
! inside trackVariable by tem_reduction_spatial_append
call tem_reduction_spatial_close( me = ascii%redSpatial, &
& proc = outProc )
! Re-assign the chunk here to the stuff which was produced in the
! reduction operation
call tem_reduction_spatial_toChunk(me = ascii%redSpatial, &
& chunk = res, &
& nChunkElems = nChunkElems )
ndofs_out = 1
nscalars_out = sum(ascii%redSpatial(:)%nComponents)
end if
! If reduction is active only root of this output
! dumps data else all process writes their own result file
if ( (ascii%isReduce .and. outProc%rank == 0) .or. &
& (.not. ascii%isReduce) ) then
! First assemble the complete row consisting of the time ...
write( log_output, '(e24.16e3)' ) time%sim
! add all the scalars entries of the variable systems for each elements
do iElem = 1, nChunkElems
do iDof = 1, nDofs_out
do iScalar = 1, nScalars_out
write( log_output, '(a,1x,e24.16e3)' ) trim(log_output), &
& res( ((iElem-1)*nDofs_out+ (iDof-1))*nScalars_out + iScalar )
end do
end do
end do
! then write into the ascii file
write ( ascii%outunit , '(a)' ) trim(log_output)
end if
deallocate(elemPos)
deallocate(res)
end subroutine hvs_ascii_dump_elem_data