PartMC  2.3.0
integer_rmap2.F90
Go to the documentation of this file.
1 ! Copyright (C) 2011-2012 Matthew West
2 ! Licensed under the GNU General Public License version 2 or (at your
3 ! option) any later version. See the file COPYING for details.
4 
5 !> \file
6 !> The pmc_integer_rmap2 module.
7 
8 !> The integer_rmap2_t structure and assocated subroutines.
10 
12  use pmc_util
13  use pmc_mpi
14 
15  !> A map \f$\mathbb{Z} \to \mathbb{Z} \times \mathbb{Z}\f$, together
16  !> with its multi-valued inverse.
17  !!
18  !! The forward map takes an integer \f$i\f$ in the domain \f$\{1,
19  !! \ldots, N_{\rm d}\}\f$ to integers \f$(j_1,j_2)\f$ in the range
20  !! \f$\{1, \ldots, N_{\rm r,1} \times \{1, \ldots, N_{\rm
21  !! r,2}\}\f$. This is stored with <tt>j_1 =
22  !! integer_rmap2%%forward1%%entry(i)</tt> and <tt>j_2 =
23  !! integer_rmap2%%forward2%%entry(i)</tt>. This map is not assumed to
24  !! be one-to-one or onto.
25  !!
26  !! The inverse map is multi-valued, with
27  !! <tt>integer_rmap2%%inverse(j_1, j_2)</tt> containing all the inverses of
28  !! \f$(j_1, j_2)\f$. The entry numbers in the inverse map are given by
29  !! <tt>inverse_rmap%%index</tt>. The relationships between the
30  !! forward and reverse maps are as follows.
31  !!
32  !! Given \c i, let:
33  !! <pre>
34  !! j_1 = integer_rmap2%%forward1%%entry(i)
35  !! j_2 = integer_rmap2%%forward2%%entry(i)
36  !! k = integer_rmap2%%index%%entry(i)
37  !! </pre>
38  !! Then:
39  !! <pre>
40  !! integer_rmap2%%inverse(j_1, j_2)%%entry(k) == i
41  !! </pre>
42  !!
43  !! Alternatively, given \c j_1, \c j_2 and \c k, let:
44  !! <pre>
45  !! i = integer_rmap2%%inverse(j_1, j_2)%%entry(k)
46  !! </pre>
47  !! Then:
48  !! <pre>
49  !! integer_rmap2%%forward1%%entry(i) == j_1
50  !! integer_rmap2%%forward2%%entry(i) == j_2
51  !! integer_rmap2%%index%%entry(i) == k
52  !! </pre>
54  !> Forward map to first range (single valued).
55  type(integer_varray_t) :: forward1
56  !> Forward map to second range (single valued).
57  type(integer_varray_t) :: forward2
58  !> Inverse map (multi-valued).
59  type(integer_varray_t), allocatable :: inverse(:, :)
60  !> Forward map to inverse map entries (single valued).
61  type(integer_varray_t) :: index
62  end type integer_rmap2_t
63 
64 contains
65 
66 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
67 
68  !> Allocates an empty structure.
69  elemental subroutine integer_rmap2_allocate(integer_rmap2)
70 
71  !> Structure to initialize.
72  type(integer_rmap2_t), intent(out) :: integer_rmap2
73 
74  call integer_varray_allocate(integer_rmap2%forward1)
75  call integer_varray_allocate(integer_rmap2%forward2)
76  allocate(integer_rmap2%inverse(0, 0))
77  call integer_varray_allocate(integer_rmap2%index)
78 
79  end subroutine integer_rmap2_allocate
80 
81 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
82 
83  !> Allocates a structure with the given size.
84  elemental subroutine integer_rmap2_allocate_size(integer_rmap2, n_range_1, &
85  n_range_2)
86 
87  !> Structure to initialize.
88  type(integer_rmap2_t), intent(out) :: integer_rmap2
89  !> Size of first range space.
90  integer, intent(in) :: n_range_1
91  !> Size of second range space.
92  integer, intent(in) :: n_range_2
93 
94  call integer_varray_allocate(integer_rmap2%forward1)
95  call integer_varray_allocate(integer_rmap2%forward2)
96  allocate(integer_rmap2%inverse(n_range_1, n_range_2))
97  call integer_varray_allocate(integer_rmap2%inverse)
98  call integer_varray_allocate(integer_rmap2%index)
99 
100  end subroutine integer_rmap2_allocate_size
101 
102 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
103 
104  !> Deallocates a previously allocated structure.
105  elemental subroutine integer_rmap2_deallocate(integer_rmap2)
106 
107  !> Structure to deallocate.
108  type(integer_rmap2_t), intent(inout) :: integer_rmap2
109 
110  call integer_varray_deallocate(integer_rmap2%forward1)
111  call integer_varray_deallocate(integer_rmap2%forward2)
112  call integer_varray_deallocate(integer_rmap2%inverse)
113  deallocate(integer_rmap2%inverse)
114  call integer_varray_deallocate(integer_rmap2%index)
115 
116  end subroutine integer_rmap2_deallocate
117 
118 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
119 
120  !> Resets an integer_rmap2 to have zero particles per bin.
121  elemental subroutine integer_rmap2_zero(integer_rmap2)
122 
123  !> Structure to zero.
124  type(integer_rmap2_t), intent(inout) :: integer_rmap2
125 
126  call integer_varray_zero(integer_rmap2%forward1)
127  call integer_varray_zero(integer_rmap2%forward2)
128  call integer_varray_zero(integer_rmap2%inverse)
129  call integer_varray_zero(integer_rmap2%index)
130 
131  end subroutine integer_rmap2_zero
132 
133 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
134 
135  !> Set the map value of the next free domain value to
136  !> <tt>(i_range_1, i_range_2</tt>.
137  subroutine integer_rmap2_append(integer_rmap2, i_range_1, i_range_2)
138 
139  !> Map to append to.
140  type(integer_rmap2_t), intent(inout) :: integer_rmap2
141  !> First range value.
142  integer, intent(in) :: i_range_1
143  !> Second range value.
144  integer, intent(in) :: i_range_2
145 
146  call assert(708651144, i_range_1 >= 1)
147  call assert(779828769, i_range_1 <= size(integer_rmap2%inverse, 1))
148  call assert(978259336, i_range_2 >= 1)
149  call assert(238981205, i_range_2 <= size(integer_rmap2%inverse, 2))
150 
151  ! grow map by one element
152  call integer_varray_append(integer_rmap2%forward1, i_range_1)
153  call integer_varray_append(integer_rmap2%forward2, i_range_2)
154  call integer_varray_append(integer_rmap2%inverse(i_range_1, i_range_2), &
155  integer_rmap2%forward1%n_entry)
156  call integer_varray_append(integer_rmap2%index, &
157  integer_rmap2%inverse(i_range_1, i_range_2)%n_entry)
158 
159  end subroutine integer_rmap2_append
160 
161 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
162 
163  !> Change the map value of \c i_domain to <tt>(i_range_1, i_range_2)</tt>.
164  subroutine integer_rmap2_change(integer_rmap2, i_domain, i_range_1, &
165  i_range_2)
166 
167  !> Map to change.
168  type(integer_rmap2_t), intent(inout) :: integer_rmap2
169  !> Domain value.
170  integer, intent(in) :: i_domain
171  !> First range value.
172  integer, intent(in) :: i_range_1
173  !> Second range value.
174  integer, intent(in) :: i_range_2
175 
176  integer :: i_range_1_old, i_range_2_old, i_index_old, i_domain_shifted
177 
178  call assert(191141591, i_domain >= 1)
179  call assert(240079303, i_domain <= integer_rmap2%forward1%n_entry)
180  call assert(671426897, i_range_1 >= 1)
181  call assert(311976942, i_range_1 <= size(integer_rmap2%inverse, 1))
182  call assert(383129645, i_range_2 >= 1)
183  call assert(771283685, i_range_2 <= size(integer_rmap2%inverse, 2))
184 
185  i_range_1_old = integer_rmap2%forward1%entry(i_domain)
186  i_range_2_old = integer_rmap2%forward2%entry(i_domain)
187  if ((i_range_1_old == i_range_1) .and. (i_range_1_old == i_range_1)) return
188  i_index_old = integer_rmap2%index%entry(i_domain)
189 
190  ! remove the old inverse map
192  integer_rmap2%inverse(i_range_1_old, i_range_2_old), i_index_old)
193  if (i_index_old &
194  <= integer_rmap2%inverse(i_range_1_old, i_range_2_old)%n_entry) then
195  ! the removed entry wasn't the last one, so the last entry
196  ! was moved and needs fixing
197  i_domain_shifted = integer_rmap2%inverse(i_range_1_old, &
198  i_range_2_old)%entry(i_index_old)
199  integer_rmap2%index%entry(i_domain_shifted) = i_index_old
200  end if
201 
202  ! set the new map and inverse
203  integer_rmap2%forward1%entry(i_domain) = i_range_1
204  integer_rmap2%forward2%entry(i_domain) = i_range_2
205  call integer_varray_append(integer_rmap2%inverse(i_range_1, i_range_2), &
206  i_domain)
207  integer_rmap2%index%entry(i_domain) &
208  = integer_rmap2%inverse(i_range_1, i_range_2)%n_entry
209 
210  end subroutine integer_rmap2_change
211 
212 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
213 
214  !> Replace the map at the given \c i_domain with the map value of
215  !> the last entry, and delete the last entry.
216  subroutine integer_rmap2_remove(integer_rmap2, i_domain)
217 
218  !> Map to remove from.
219  type(integer_rmap2_t), intent(inout) :: integer_rmap2
220  !> Domain value to replace.
221  integer, intent(in) :: i_domain
222 
223  integer :: i_range_1_old, i_range_2_old, i_index_old, i_domain_shifted
224  integer :: i_range_1_fix, i_range_2_fix, i_index_fix, i_domain_fix
225 
226  call assert(242566612, i_domain >= 1)
227  call assert(110569289, i_domain <= integer_rmap2%forward1%n_entry)
228 
229  ! Deleting particles shifts the end particles into the empty slots
230  ! in the aero_particle_array and the aero_sorted forward and
231  ! reverse indexes. All must be fixed in the right order to
232  ! maintain consistency.
233 
234  i_range_1_old = integer_rmap2%forward1%entry(i_domain)
235  i_range_2_old = integer_rmap2%forward2%entry(i_domain)
236  i_index_old = integer_rmap2%index%entry(i_domain)
237 
238  i_domain_shifted = integer_rmap2%forward1%n_entry ! old shifted value loc
239  if (i_domain_shifted /= i_domain) then
240  i_range_1_fix = integer_rmap2%forward1%entry(i_domain_shifted)
241  i_range_2_fix = integer_rmap2%forward2%entry(i_domain_shifted)
242  i_index_fix = integer_rmap2%index%entry(i_domain_shifted)
243  integer_rmap2%inverse(i_range_1_fix, i_range_2_fix)%entry(i_index_fix) &
244  = i_domain
245  end if
246 
247  ! remove the particle from the forward map (with the side effect
248  ! of fixing the forward map for the shifted value)
249  call integer_varray_remove_entry(integer_rmap2%forward1, i_domain)
250  call integer_varray_remove_entry(integer_rmap2%forward2, i_domain)
251  call integer_varray_remove_entry(integer_rmap2%index, i_domain)
252 
253  ! remove the inverse map
254  i_index_fix = integer_rmap2%inverse(i_range_1_old, i_range_2_old)%n_entry
255  i_domain_fix = integer_rmap2%inverse(i_range_1_old, i_range_2_old)%entry(&
256  i_index_fix)
258  integer_rmap2%inverse(i_range_1_old, i_range_2_old), i_index_old)
259 
260  if (i_index_fix /= i_index_old) then
261  ! fix index map
262  integer_rmap2%index%entry(i_domain_fix) = i_index_old
263  end if
264 
265  end subroutine integer_rmap2_remove
266 
267 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
268 
269  !> Check that the data is consistent.
270  subroutine integer_rmap2_check(integer_rmap2, name, n_domain, n_range_1, &
271  n_range_2, continue_on_error)
272 
273  !> Structure to check.
274  type(integer_rmap2_t) :: integer_rmap2
275  !> Check name.
276  character(len=*), intent(in) :: name
277  !> Size of domain.
278  integer, intent(in) :: n_domain
279  !> Size of first range.
280  integer, intent(in) :: n_range_1
281  !> Size of second range.
282  integer, intent(in) :: n_range_2
283  !> Whether to continue despite error.
284  logical, intent(in) :: continue_on_error
285 
286  integer :: i_domain, i_range_1, i_range_2, i_index
287 
288  if ((n_domain /= integer_rmap2%forward1%n_entry) &
289  .or. (n_domain /= integer_rmap2%forward2%n_entry) &
290  .or. (n_domain /= integer_rmap2%index%n_entry) &
291  .or. (n_range_1 /= size(integer_rmap2%inverse, 1)) &
292  .or. (n_range_2 /= size(integer_rmap2%inverse, 2))) then
293  write(0,*) 'ERROR integer_rmap2 A:', name
294  write(0,*) 'n_domain', n_domain
295  write(0,*) 'n_range_1', n_range_1
296  write(0,*) 'n_range_2', n_range_2
297  write(0,*) 'integer_rmap2%forward1%n_entry', &
298  integer_rmap2%forward1%n_entry
299  write(0,*) 'integer_rmap2%forward2%n_entry', &
300  integer_rmap2%forward2%n_entry
301  write(0,*) 'integer_rmap2%index%n_entry', integer_rmap2%index%n_entry
302  write(0,*) 'size(integer_rmap2%inverse, 1)', &
303  size(integer_rmap2%inverse, 1)
304  write(0,*) 'size(integer_rmap2%inverse, 2)', &
305  size(integer_rmap2%inverse, 2)
306  call assert(786992107, continue_on_error)
307  end if
308 
309  do i_domain = 1,n_domain
310  i_range_1 = integer_rmap2%forward1%entry(i_domain)
311  i_range_2 = integer_rmap2%forward2%entry(i_domain)
312  if ((i_range_1 < 1) .or. (i_range_1 > n_range_1) &
313  .or. (i_range_2 < 1) .or. (i_range_2 > n_range_2)) then
314  write(0,*) 'ERROR integer_rmap2 B:', name
315  write(0,*) 'i_domain', i_domain
316  write(0,*) 'i_range_1', i_range_1
317  write(0,*) 'i_range_2', i_range_2
318  write(0,*) 'n_range_1', n_range_1
319  write(0,*) 'n_range_2', n_range_2
320  call assert(723392756, continue_on_error)
321  end if
322 
323  i_index = integer_rmap2%index%entry(i_domain)
324  if ((i_index < 1) .or. (i_index &
325  > integer_rmap2%inverse(i_range_1, i_range_2)%n_entry)) then
326  write(0,*) 'ERROR integer_rmap2 C:', name
327  write(0,*) 'i_domain', i_domain
328  write(0,*) 'i_range_1', i_range_1
329  write(0,*) 'i_range_2', i_range_2
330  write(0,*) 'i_index', i_index
331  write(0,*) 'integer_rmap2%inverse(i_range_1, i_range_2)%n_entry', &
332  integer_rmap2%inverse(i_range_1, i_range_2)%n_entry
333  call assert(317458796, continue_on_error)
334  end if
335  if (i_domain &
336  /= integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)) then
337  write(0,*) 'ERROR integer_rmap2 D:', name
338  write(0,*) 'i_domain', i_domain
339  write(0,*) 'i_range_1', i_range_1
340  write(0,*) 'i_range_2', i_range_2
341  write(0,*) 'i_index', i_index
342  write(0,*) 'integer_rmap2%inverse(i_range_1, ' &
343  // 'i_range_2)%entry(i_index)', &
344  integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)
345  call assert(662733308, continue_on_error)
346  end if
347  end do
348 
349  do i_range_1 = 1,n_range_1
350  do i_range_2 = 1,n_range_2
351  do i_index = 1,integer_rmap2%inverse(i_range_1, i_range_2)%n_entry
352  i_domain &
353  = integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)
354  if ((i_domain < 1) .or. (i_domain > n_domain)) then
355  write(0,*) 'ERROR integer_rmap2 E:', name
356  write(0,*) 'i_range_1', i_range_1
357  write(0,*) 'i_range_2', i_range_2
358  write(0,*) 'i_index', i_index
359  write(0,*) 'i_domain', i_domain
360  write(0,*) 'n_domain', n_domain
361  call assert(639449827, continue_on_error)
362  end if
363  if ((i_range_1 /= integer_rmap2%forward1%entry(i_domain)) &
364  .or. (i_range_2 /= integer_rmap2%forward2%entry(i_domain)) &
365  .or. (i_index /= integer_rmap2%index%entry(i_domain))) then
366  write(0,*) 'ERROR integer_rmap2 F:', name
367  write(0,*) 'i_domain', i_domain
368  write(0,*) 'i_range_1', i_range_1
369  write(0,*) 'i_range_2', i_range_2
370  write(0,*) 'integer_rmap2%forward1%entry(i_domain)', &
371  integer_rmap2%forward1%entry(i_domain)
372  write(0,*) 'integer_rmap2%forward2%entry(i_domain)', &
373  integer_rmap2%forward2%entry(i_domain)
374  write(0,*) 'i_index', i_index
375  write(0,*) 'integer_rmap2%index%entry(i_domain)', &
376  integer_rmap2%index%entry(i_domain)
377  call assert(636832060, continue_on_error)
378  end if
379  end do
380  end do
381  end do
382 
383  end subroutine integer_rmap2_check
384 
385 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
386 
387  !> Determines the number of bytes required to pack the given value.
388  integer function pmc_mpi_pack_size_integer_rmap2(val)
389 
390  !> Value to pack.
391  type(integer_rmap2_t), intent(in) :: val
392 
393  integer :: i_1, i_2, total_size
394 
395  total_size = 0
396  total_size = total_size + pmc_mpi_pack_size_integer(size(val%inverse, 1))
397  total_size = total_size + pmc_mpi_pack_size_integer(size(val%inverse, 2))
398  total_size = total_size + pmc_mpi_pack_size_integer_varray(val%forward1)
399  total_size = total_size + pmc_mpi_pack_size_integer_varray(val%forward2)
400  do i_1 = 1,size(val%inverse, 1)
401  do i_2 = 1,size(val%inverse, 2)
402  total_size = total_size &
403  + pmc_mpi_pack_size_integer_varray(val%inverse(i_1, i_2))
404  end do
405  end do
406  total_size = total_size + pmc_mpi_pack_size_integer_varray(val%index)
408 
410 
411 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
412 
413  !> Packs the given value into the buffer, advancing position.
414  subroutine pmc_mpi_pack_integer_rmap2(buffer, position, val)
415 
416  !> Memory buffer.
417  character, intent(inout) :: buffer(:)
418  !> Current buffer position.
419  integer, intent(inout) :: position
420  !> Value to pack.
421  type(integer_rmap2_t), intent(in) :: val
422 
423 #ifdef PMC_USE_MPI
424  integer :: prev_position, i_1, i_2
425 
426  prev_position = position
427  call pmc_mpi_pack_integer(buffer, position, size(val%inverse, 1))
428  call pmc_mpi_pack_integer(buffer, position, size(val%inverse, 2))
429  call pmc_mpi_pack_integer_varray(buffer, position, val%forward1)
430  call pmc_mpi_pack_integer_varray(buffer, position, val%forward2)
431  do i_1 = 1,size(val%inverse, 1)
432  do i_2 = 1,size(val%inverse, 2)
433  call pmc_mpi_pack_integer_varray(buffer, position, &
434  val%inverse(i_1, i_2))
435  end do
436  end do
437  call pmc_mpi_pack_integer_varray(buffer, position, val%index)
438  call assert(283629348, &
439  position - prev_position <= pmc_mpi_pack_size_integer_rmap2(val))
440 #endif
441 
442  end subroutine pmc_mpi_pack_integer_rmap2
443 
444 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
445 
446  !> Unpacks the given value from the buffer, advancing position.
447  subroutine pmc_mpi_unpack_integer_rmap2(buffer, position, val)
448 
449  !> Memory buffer.
450  character, intent(inout) :: buffer(:)
451  !> Current buffer position.
452  integer, intent(inout) :: position
453  !> Value to pack.
454  type(integer_rmap2_t), intent(inout) :: val
455 
456 #ifdef PMC_USE_MPI
457  integer :: prev_position, i_1, i_2, n_1, n_2
458 
459  prev_position = position
460  call pmc_mpi_unpack_integer(buffer, position, n_1)
461  call pmc_mpi_unpack_integer(buffer, position, n_2)
462  call integer_rmap2_deallocate(val)
463  call integer_rmap2_allocate_size(val, n_1, n_2)
464  call pmc_mpi_unpack_integer_varray(buffer, position, val%forward1)
465  call pmc_mpi_unpack_integer_varray(buffer, position, val%forward2)
466  do i_1 = 1,size(val%inverse, 1)
467  do i_2 = 1,size(val%inverse, 2)
468  call pmc_mpi_unpack_integer_varray(buffer, position, &
469  val%inverse(i_1, i_2))
470  end do
471  end do
472  call pmc_mpi_unpack_integer_varray(buffer, position, val%index)
473  call assert(796602256, &
474  position - prev_position <= pmc_mpi_pack_size_integer_rmap2(val))
475 #endif
476 
477  end subroutine pmc_mpi_unpack_integer_rmap2
478 
479 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
480 
481 end module pmc_integer_rmap2
elemental subroutine integer_rmap2_allocate(integer_rmap2)
Allocates an empty structure.
integer function pmc_mpi_pack_size_integer_rmap2(val)
Determines the number of bytes required to pack the given value.
subroutine pmc_mpi_pack_integer_rmap2(buffer, position, val)
Packs the given value into the buffer, advancing position.
elemental subroutine integer_rmap2_allocate_size(integer_rmap2, n_range_1, n_range_2)
Allocates a structure with the given size.
elemental subroutine integer_rmap2_deallocate(integer_rmap2)
Deallocates a previously allocated structure.
integer function pmc_mpi_pack_size_integer(val)
Determines the number of bytes required to pack the given value.
Definition: mpi.F90:347
subroutine integer_rmap2_append(integer_rmap2, i_range_1, i_range_2)
Set the map value of the next free domain value to (i_range_1, i_range_2.
subroutine integer_rmap2_check(integer_rmap2, name, n_domain, n_range_1, n_range_2, continue_on_error)
Check that the data is consistent.
subroutine pmc_mpi_unpack_integer_rmap2(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
The integer_varray_t structure and assocated subroutines.
subroutine integer_rmap2_change(integer_rmap2, i_domain, i_range_1, i_range_2)
Change the map value of i_domain to (i_range_1, i_range_2).
subroutine integer_varray_append(integer_varray, val)
Adds the given number to the end of the array.
subroutine integer_varray_remove_entry(integer_varray, index)
Removes the entry at the given index, repacking values to maintain contiguous data.
subroutine pmc_mpi_pack_integer(buffer, position, val)
Packs the given value into the buffer, advancing position.
Definition: mpi.F90:534
Common utility subroutines.
Definition: util.F90:9
elemental subroutine integer_varray_deallocate(integer_varray)
Deallocates a previously allocated structure.
subroutine pmc_mpi_unpack_integer(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
Definition: mpi.F90:771
A map , together with its multi-valued inverse.
elemental subroutine integer_varray_zero(integer_varray)
Resets an integer_varray to have zero particles per bin.
Wrapper functions for MPI.
Definition: mpi.F90:13
elemental subroutine integer_rmap2_zero(integer_rmap2)
Resets an integer_rmap2 to have zero particles per bin.
elemental subroutine integer_varray_allocate(integer_varray)
Allocates an empty structure.
subroutine pmc_mpi_pack_integer_varray(buffer, position, val)
Packs the given value into the buffer, advancing position.
A variable-length 1D array of integers.
The integer_rmap2_t structure and assocated subroutines.
subroutine integer_rmap2_remove(integer_rmap2, i_domain)
Replace the map at the given i_domain with the map value of the last entry, and delete the last entry...
subroutine pmc_mpi_unpack_integer_varray(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
integer function pmc_mpi_pack_size_integer_varray(val)
Determines the number of bytes required to pack the given value.
subroutine assert(code, condition_ok)
Errors unless condition_ok is true.
Definition: util.F90:102