@brief Re-sizeable array type that can be filled elementwise to build up a contiguous data chunk that can then be dumped to an allocatable
@details For multidimensional buffers only the last dimension can grow. (i.e. it is only possible to add columns.)
The buffer has to be initiliazed before first use.
After dumping (dump_reset
) it is automatically resetted.
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
real(kind=dp), | private, | dimension(:, :), allocatable | :: | buf | |||
integer(kind=int64), | private | :: | pos | ||||
real(kind=dp), | private | :: | grow_factor | = | 1.5_dp | ||
integer(kind=int64), | private | :: | start_size | = | 100_int64 |
@brief Set up the re-sizeable array (buffer) with a given start size and grow_factor.
@details Has to be called before first use and can be called any time.
@param[in] rows Number of rows in the first dimension. @param[in] start_size Initial size of the buffer along the last dimension. @param[in] grow_factor Factor about which to grow the buffer along the last dimension, if the capacity is not sufficient.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this | |||
integer, | intent(in) | :: | rows | |||
real, | intent(in), | optional | :: | grow_factor | ||
integer, | intent(in), | optional | :: | start_size |
@brief Deallocate the resource.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this |
@brief Reset an already initiliazed buffer.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this |
@brief Returns the number of already stored elements in the buffer along the last dimension.
@return n_els Number of elements already added to the buffer.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(in) | :: | this |
@brief Returns the capacity of the buffer along the last dimension.
@return n_els Number of elements already added to the buffer.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(in) | :: | this |
@brief Append a value to the buffer, expanding the capacity if necessary.
@param[in] val Value to be added
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this | |||
real(kind=dp), | intent(in), | dimension(:) | :: | val |
@brief Dump the buffer to an allocatable array.
@param[out] tgt Allocatable array (reset upon entry), contains the stored elements of the buffer on return. The buffer has to be reinitialized if used again.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this | |||
real(kind=dp), | intent(out), | dimension(:, :), allocatable | :: | tgt |
Dump the buffer to an allocatable array and reset the buffer.
@param[out] tgt Allocatable array (reset upon entry), contains the stored elements of the buffer on return. The buffer is writable afterwards.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_real_2D_t), | intent(inout) | :: | this | |||
real(kind=dp), | intent(out), | dimension(:, :), allocatable | :: | tgt |
type :: buffer_real_2D_t
private
real(dp), dimension(:, :), allocatable :: buf
! Internal position of the buffer
integer(int64) :: pos
real(dp) :: grow_factor = 1.5_dp
integer(int64) :: start_size = 100_int64
contains
procedure :: init => init_real_2D
procedure :: finalize => finalize_real_2D
procedure, private :: reset => reset_real_2D
procedure :: size => get_size_real_2D
procedure :: capacity => get_capacity_real_2D
procedure :: push_back => add_val_real_2D
procedure, private :: dump => dump_real_2D
procedure :: dump_reset => dump_reset_real_2D
end type buffer_real_2D_t