Write single log for the right scheme into its ascii file. This routine calls the get_point routine and dumps the exact point data for the point specified in the tracking table
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 points to output. Contains array of points passed in the config to output. |
subroutine hvs_ascii_dump_point_data( ascii, outProc, varPos, varSys, mesh, & & time, subTree ) ! --------------------------------------------------------------------------- !> 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 points to output. !! Contains array of points passed in the config to output. type(tem_subtree_type), optional, intent(in) :: subtree ! --------------------------------------------------------------------------- integer :: nVars, nPoints, nScalars, pointsOff, nChunkPoints integer :: iPoint, iChunk, iScalar, counter integer :: buf_start, buf_end real(kind=rk), allocatable :: res(:) character(len=4000) :: log_output ! output buffer real(kind=rk), allocatable :: points(:,:) ! --------------------------------------------------------------------------- if (present(subTree)) then nPoints = subTree%nPoints else nPoints = mesh%nElems end if 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 (ascii%isReduce) then ! open spatial reduction call tem_reduction_spatial_open( me = ascii%redSpatial, & & varSys = varSys, & & varPos = varPos(:nVars) ) end if ! allocate points to size of chunkSize allocate(points(ascii%chunkSize,3)) ! Process all chunks to derive the quantities defined in the tracking object do iChunk = 1, ascii%nChunks ! Number of points read so far in previous chunks. pointsOff = ((iChunk-1)*ascii%chunkSize) ! number of points written to THIS chunk nChunkPoints = min(ascii%chunkSize, nPoints-pointsOff) ! Compute the points lower and upper bound for the current chunk buf_start = pointsOff + 1 buf_end = pointsOff + nChunkPoints if (present(subTree)) then points(1:nChunkPoints,:) = subTree%points(buf_start:buf_end,:) else counter = 0 do iPoint = buf_start, buf_end counter = counter + 1 points(counter, :) = tem_BaryOfId( mesh, & & mesh%treeID(iPoint) ) end do end if ! evaluate all variables on current chunk call tem_get_point_chunk( varSys = varSys, & & varPos = varPos, & & point = points(1:nChunkPoints,:), & & time = time, & & tree = mesh, & & nPnts = nChunkPoints, & & res = res ) ! preform spatial reduction if (ascii%isReduce) then ! NA : The reduction for the get points needs to be thought ! through as we would like at one point to have all the segment paoints ! stored and reduction applied. In that case, l2 norm and weighted sum ! requires the treeID information. Maybe we should write a new routine to ! do that tem_reduction_spatial_append_point ! KM: changed treeID argument optional because for point values ! no need to do volume reduction call tem_reduction_spatial_append( me = ascii%redSpatial, & & chunk = res, & & nElems = nChunkPoints, & & tree = mesh, & & varSys = varSys, & & varPos = varPos ) end if end do ! iChunk ! 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 = nChunkPoints ) 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 iPoint = 1, nChunkPoints do iScalar = 1, nScalars write( log_output, '(a,1x,e24.16e3)' ) trim(log_output), & & res( (iPoint-1)*nScalars + iScalar ) end do end do ! then write into the ascii file write ( ascii%outunit , '(a)' ) trim(log_output) end if deallocate(points) deallocate(res) end subroutine hvs_ascii_dump_point_data