Checks the current size of the storage object against the required size and extends it by a factor of 2 more than
requested if it is too small.
Note: The reason to extend it by a factor of 2 is for performance. When there are many enounters per step, resizing
every time you want to add an encounter takes significant computational effort. Resizing by a factor of 2 is a tradeoff
between performance (fewer resize calls) and memory managment. Memory usage grows by a factor of 2 each time it fills
up, but no more.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(base_storage), | intent(inout) | :: | self | Storage encounter storage object |
||
| class(*), | intent(in) | :: | snapshot | Object to snapshot |
subroutine base_util_snapshot_save(self, snapshot)
!! author: David A. Minton
!!
!! Checks the current size of the storage object against the required size and extends it by a factor of 2 more than
!! requested if it is too small.
!! Note: The reason to extend it by a factor of 2 is for performance. When there are many enounters per step, resizing
!! every time you want to add an encounter takes significant computational effort. Resizing by a factor of 2 is a tradeoff
!! between performance (fewer resize calls) and memory managment. Memory usage grows by a factor of 2 each time it fills
!! up, but no more.
implicit none
! Arguments
class(base_storage), intent(inout) :: self
!! Storage encounter storage object
class(*), intent(in) :: snapshot
!! Object to snapshot
! Internals
integer(I4B) :: nnew, nold
! Advance the snapshot frame counter
self%iframe = self%iframe + 1
nnew = self%iframe
nold = self%nframes
! Check to make sure the current storage object is big enough. If not, grow it by a factor of 2
if (nnew > nold) call self%resize(nnew)
self%frame(nnew) = snapshot
return
end subroutine base_util_snapshot_save