Free the storage not used: each array is reallocated to the points it holds (one copy, an array at a time), and arrays holding none are deallocated. For a trajectory that is complete: growing doubles the storage, so up to about half of it can be unused. The data and what is drawn of them don't change; pointers from times, positions, ... must be fetched again. Points can still be added (storage grows again).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(Trajectory), | intent(inout) | :: | self |
subroutine compact(self) class(Trajectory), intent(inout) :: self real(wp), allocatable :: t(:), posopt(:,:,:), att(:,:) real(c_float), allocatable :: col(:,:) if (allocated(self%t)) then if (size(self%t) /= self%n_times) then allocate(t(self%n_times)) t = self%t(1:self%n_times) call move_alloc(t, self%t) end if if (self%n_times == 0) deallocate(self%t) end if if (allocated(self%posopt)) then if (size(self%posopt, 3) /= self%n_pos) then allocate(posopt(3, 0:self%nopt_, self%n_pos)) posopt = self%posopt(:, :, 1:self%n_pos) call move_alloc(posopt, self%posopt) end if if (self%n_pos == 0) deallocate(self%posopt) end if if (allocated(self%att)) then if (size(self%att, 2) /= self%n_att) then allocate(att(4, self%n_att)) att = self%att(:, 1:self%n_att) call move_alloc(att, self%att) end if if (self%n_att == 0) deallocate(self%att) end if if (allocated(self%col)) then if (size(self%col, 2) /= self%n_col) then allocate(col(4, self%n_col)) col = self%col(:, 1:self%n_col) call move_alloc(col, self%col) end if if (self%n_col == 0) deallocate(self%col) end if end subroutine compact