calculate the maximum number of elements which fit into the output buffer = chunk
for a given set of variable systems with their nScalar values to dump Also, calculate the number of local chunks required to dump all the data = nChunks Finally find the globally largest number of nChunks
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_restart_type), | intent(inout) | :: | restart |
the restart type |
||
integer, | intent(in) | :: | nElems |
mesh, provided in treelm format optional subTree |
||
integer, | intent(in) | :: | comm |
mesh, provided in treelm format optional subTree |
||
integer, | intent(in), | optional | :: | chunkSize |
optional predefined chunksize |
subroutine tem_restart_getTotalChunks( restart, nElems, comm, chunkSize ) ! -------------------------------------------------------------------- ! !> the restart type type( tem_restart_type ), intent(inout) :: restart !> mesh, provided in treelm format !type(treelmesh_type), intent(in) :: tree !> optional subTree ! type(tem_subTree_type), optional, intent(in) :: subTree integer, intent(in) :: nElems, comm !> optional predefined chunksize integer, optional, intent(in) :: chunkSize ! -------------------------------------------------------------------- ! integer :: nTotalScalars integer :: iError ! MPI error integer :: rank ! -------------------------------------------------------------------- ! ! Get the number of total scalars. nTotalScalars = restart%varMap%nScalars if ( nTotalScalars == 0 ) then write(logUnit(0),*) '!! Error !! No variable found in restart varSys !!' write(logUnit(0),*) 'May be variable label in requested system is not ' & & // 'found in global varsys' call tem_abort() endif if( present( chunkSize ))then restart%read_file%chunkSize = chunkSize restart%write_file%chunkSize = chunkSize else ! Get the number of elements that fit into the IO buffer. restart%read_file%chunkSize & & = min( io_buffer_size & & / (nTotalScalars*restart%read_file%nDofs), & & nElems ) restart%write_file%chunkSize & & = min( io_buffer_size & & / (nTotalScalars*restart%write_file%nDofs), & & nElems ) end if ! check if at least one complete element fits into the buffer ! if not abort since no valid output can be garanteed if (restart%write_file%chunkSize <= 0) then write(logUnit(0),*) 'The chosen io_buffer_size of ', io_buffer_size write(logUnit(0),*) 'is too small for outputting ', nTotalScalars write(logUnit(0),*) 'scalar values with ', restart%write_file%nDofs write(logUnit(0),*) 'degrees of freedom!' write(logUnit(0),*) 'Please increase the io_buffer_size to' & & // ' at least (MB) ', & & real(nTotalScalars*restart%write_file%nDofs) & & / real(131072) call tem_abort() end if if (restart%read_file%chunkSize <= 0) then write(logUnit(0),*) 'The chosen io_buffer_size of ', io_buffer_size write(logUnit(0),*) 'is too small for reading ', nTotalScalars write(logUnit(0),*) 'scalar values with ', restart%read_file%nDofs write(logUnit(0),*) 'degrees of freedom!' write(logUnit(0),*) 'Please increase the io_buffer_size to' & & // ' at least (MB) ', & & real(nTotalScalars*restart%read_file%nDofs) & & / real(131072) call tem_abort() end if ! Get the number of chunks which are needed to dump all values to disk. ! This needs to be rounded up, to cover also a possible last incomplete ! chunk. restart%write_file%nChunks & & = ceiling( real(nElems, kind=rk) & & / real(restart%write_file%chunkSize, kind=rk) ) restart%read_file%nChunks & & = ceiling( real(nElems, kind=rk) & & / real(restart%read_file%chunkSize, kind=rk) ) ! identify the maximum number of chunks throughout all processes ! and store that into restart%maxnChunks call MPI_Allreduce( restart%write_file%nChunks, & & restart%write_file%maxnChunks, 1, & & MPI_INTEGER, MPI_MAX, comm, iError ) call MPI_Allreduce( restart%read_file%nChunks, & & restart%read_file%maxnChunks, 1, & & MPI_INTEGER, MPI_MAX, comm, iError ) call MPI_Comm_Rank( comm, rank, iError ) end subroutine tem_restart_getTotalChunks