PartMC  2.6.1
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  !> Sets the maximum ranges of the forward map.
69  elemental subroutine integer_rmap2_set_ranges(integer_rmap2, n_range_1, &
70  n_range_2)
71 
72  !> Structure to initialize.
73  type(integer_rmap2_t), intent(out) :: integer_rmap2
74  !> Size of first range space.
75  integer, intent(in) :: n_range_1
76  !> Size of second range space.
77  integer, intent(in) :: n_range_2
78 
79  if (allocated(integer_rmap2%inverse)) then
80  deallocate(integer_rmap2%inverse)
81  end if
82  allocate(integer_rmap2%inverse(n_range_1, n_range_2))
83 
84  end subroutine integer_rmap2_set_ranges
85 
86 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
87 
88  !> Resets an integer_rmap2 to have no mappings.
89  elemental subroutine integer_rmap2_zero(integer_rmap2)
90 
91  !> Structure to zero.
92  type(integer_rmap2_t), intent(inout) :: integer_rmap2
93 
94  call integer_varray_zero(integer_rmap2%forward1)
95  call integer_varray_zero(integer_rmap2%forward2)
96  if (allocated(integer_rmap2%inverse)) then
97  call integer_varray_zero(integer_rmap2%inverse)
98  end if
99  call integer_varray_zero(integer_rmap2%index)
100 
101  end subroutine integer_rmap2_zero
102 
103 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
104 
105  !> Set the map value of the next free domain value to
106  !> <tt>(i_range_1, i_range_2</tt>.
107  subroutine integer_rmap2_append(integer_rmap2, i_range_1, i_range_2)
108 
109  !> Map to append to.
110  type(integer_rmap2_t), intent(inout) :: integer_rmap2
111  !> First range value.
112  integer, intent(in) :: i_range_1
113  !> Second range value.
114  integer, intent(in) :: i_range_2
115 
116  call assert(438521606, allocated(integer_rmap2%inverse))
117  call assert(708651144, i_range_1 >= 1)
118  call assert(779828769, i_range_1 <= size(integer_rmap2%inverse, 1))
119  call assert(978259336, i_range_2 >= 1)
120  call assert(238981205, i_range_2 <= size(integer_rmap2%inverse, 2))
121 
122  ! grow map by one element
123  call integer_varray_append(integer_rmap2%forward1, i_range_1)
124  call integer_varray_append(integer_rmap2%forward2, i_range_2)
125  call integer_varray_append(integer_rmap2%inverse(i_range_1, i_range_2), &
126  integer_varray_n_entry(integer_rmap2%forward1))
127  call integer_varray_append(integer_rmap2%index, &
128  integer_varray_n_entry(integer_rmap2%inverse(i_range_1, i_range_2)))
129 
130  end subroutine integer_rmap2_append
131 
132 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
133 
134  !> Change the map value of \c i_domain to <tt>(i_range_1, i_range_2)</tt>.
135  subroutine integer_rmap2_change(integer_rmap2, i_domain, i_range_1, &
136  i_range_2)
137 
138  !> Map to change.
139  type(integer_rmap2_t), intent(inout) :: integer_rmap2
140  !> Domain value.
141  integer, intent(in) :: i_domain
142  !> First range value.
143  integer, intent(in) :: i_range_1
144  !> Second range value.
145  integer, intent(in) :: i_range_2
146 
147  integer :: i_range_1_old, i_range_2_old, i_index_old, i_domain_shifted
148 
149  call assert(897948211, allocated(integer_rmap2%inverse))
150  call assert(191141591, i_domain >= 1)
151  call assert(240079303, &
152  i_domain <= integer_varray_n_entry(integer_rmap2%forward1))
153  call assert(671426897, i_range_1 >= 1)
154  call assert(311976942, i_range_1 <= size(integer_rmap2%inverse, 1))
155  call assert(383129645, i_range_2 >= 1)
156  call assert(771283685, i_range_2 <= size(integer_rmap2%inverse, 2))
157 
158  i_range_1_old = integer_rmap2%forward1%entry(i_domain)
159  i_range_2_old = integer_rmap2%forward2%entry(i_domain)
160  if ((i_range_1_old == i_range_1) .and. (i_range_1_old == i_range_1)) return
161  i_index_old = integer_rmap2%index%entry(i_domain)
162 
163  ! remove the old inverse map
165  integer_rmap2%inverse(i_range_1_old, i_range_2_old), i_index_old)
166  if (i_index_old &
167  <= integer_varray_n_entry(integer_rmap2%inverse(i_range_1_old, &
168  i_range_2_old))) then
169  ! the removed entry wasn't the last one, so the last entry
170  ! was moved and needs fixing
171  i_domain_shifted = integer_rmap2%inverse(i_range_1_old, &
172  i_range_2_old)%entry(i_index_old)
173  integer_rmap2%index%entry(i_domain_shifted) = i_index_old
174  end if
175 
176  ! set the new map and inverse
177  integer_rmap2%forward1%entry(i_domain) = i_range_1
178  integer_rmap2%forward2%entry(i_domain) = i_range_2
179  call integer_varray_append(integer_rmap2%inverse(i_range_1, i_range_2), &
180  i_domain)
181  integer_rmap2%index%entry(i_domain) &
182  = integer_varray_n_entry(integer_rmap2%inverse(i_range_1, i_range_2))
183 
184  end subroutine integer_rmap2_change
185 
186 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
187 
188  !> Replace the map at the given \c i_domain with the map value of
189  !> the last entry, and delete the last entry.
190  subroutine integer_rmap2_remove(integer_rmap2, i_domain)
191 
192  !> Map to remove from.
193  type(integer_rmap2_t), intent(inout) :: integer_rmap2
194  !> Domain value to replace.
195  integer, intent(in) :: i_domain
196 
197  integer :: i_range_1_old, i_range_2_old, i_index_old, i_domain_shifted
198  integer :: i_range_1_fix, i_range_2_fix, i_index_fix, i_domain_fix
199 
200  call assert(902132756, allocated(integer_rmap2%inverse))
201  call assert(242566612, i_domain >= 1)
202  call assert(110569289, &
203  i_domain <= integer_varray_n_entry(integer_rmap2%forward1))
204 
205  ! Deleting particles shifts the end particles into the empty slots
206  ! in the aero_particle_array and the aero_sorted forward and
207  ! reverse indexes. All must be fixed in the right order to
208  ! maintain consistency.
209 
210  i_range_1_old = integer_rmap2%forward1%entry(i_domain)
211  i_range_2_old = integer_rmap2%forward2%entry(i_domain)
212  i_index_old = integer_rmap2%index%entry(i_domain)
213 
214  ! old shifted value loc
215  i_domain_shifted = integer_varray_n_entry(integer_rmap2%forward1)
216  if (i_domain_shifted /= i_domain) then
217  i_range_1_fix = integer_rmap2%forward1%entry(i_domain_shifted)
218  i_range_2_fix = integer_rmap2%forward2%entry(i_domain_shifted)
219  i_index_fix = integer_rmap2%index%entry(i_domain_shifted)
220  integer_rmap2%inverse(i_range_1_fix, i_range_2_fix)%entry(i_index_fix) &
221  = i_domain
222  end if
223 
224  ! remove the particle from the forward map (with the side effect
225  ! of fixing the forward map for the shifted value)
226  call integer_varray_remove_entry(integer_rmap2%forward1, i_domain)
227  call integer_varray_remove_entry(integer_rmap2%forward2, i_domain)
228  call integer_varray_remove_entry(integer_rmap2%index, i_domain)
229 
230  ! remove the inverse map
231  i_index_fix = integer_varray_n_entry(integer_rmap2%inverse(i_range_1_old, &
232  i_range_2_old))
233  i_domain_fix = integer_rmap2%inverse(i_range_1_old, i_range_2_old)%entry(&
234  i_index_fix)
236  integer_rmap2%inverse(i_range_1_old, i_range_2_old), i_index_old)
237 
238  if (i_index_fix /= i_index_old) then
239  ! fix index map
240  integer_rmap2%index%entry(i_domain_fix) = i_index_old
241  end if
242 
243  end subroutine integer_rmap2_remove
244 
245 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
246 
247  !> Check that the data is consistent.
248  subroutine integer_rmap2_check(integer_rmap2, name, n_domain, n_range_1, &
249  n_range_2, continue_on_error)
250 
251  !> Structure to check.
252  type(integer_rmap2_t) :: integer_rmap2
253  !> Check name.
254  character(len=*), intent(in) :: name
255  !> Size of domain.
256  integer, intent(in) :: n_domain
257  !> Size of first range.
258  integer, intent(in) :: n_range_1
259  !> Size of second range.
260  integer, intent(in) :: n_range_2
261  !> Whether to continue despite error.
262  logical, intent(in) :: continue_on_error
263 
264  integer :: i_domain, i_range_1, i_range_2, i_index
265 
266  if (.not. allocated(integer_rmap2%inverse)) then
267  return
268  end if
269 
270  if ((n_domain /= integer_varray_n_entry(integer_rmap2%forward1)) &
271  .or. (n_domain /= integer_varray_n_entry(integer_rmap2%forward2)) &
272  .or. (n_domain /= integer_varray_n_entry(integer_rmap2%index)) &
273  .or. (n_range_1 /= size(integer_rmap2%inverse, 1)) &
274  .or. (n_range_2 /= size(integer_rmap2%inverse, 2))) then
275  write(0,*) 'ERROR integer_rmap2 A:', name
276  write(0,*) 'n_domain', n_domain
277  write(0,*) 'n_range_1', n_range_1
278  write(0,*) 'n_range_2', n_range_2
279  write(0,*) 'integer_varray_n_entry(integer_rmap2%forward1)', &
280  integer_varray_n_entry(integer_rmap2%forward1)
281  write(0,*) 'integer_varray_n_entry(integer_rmap2%forward2)', &
282  integer_varray_n_entry(integer_rmap2%forward2)
283  write(0,*) 'integer_varray_n_entry(integer_rmap2%index)', &
284  integer_varray_n_entry(integer_rmap2%index)
285  write(0,*) 'size(integer_rmap2%inverse, 1)', &
286  size(integer_rmap2%inverse, 1)
287  write(0,*) 'size(integer_rmap2%inverse, 2)', &
288  size(integer_rmap2%inverse, 2)
289  call assert(786992107, continue_on_error)
290  end if
291 
292  do i_domain = 1,n_domain
293  i_range_1 = integer_rmap2%forward1%entry(i_domain)
294  i_range_2 = integer_rmap2%forward2%entry(i_domain)
295  if ((i_range_1 < 1) .or. (i_range_1 > n_range_1) &
296  .or. (i_range_2 < 1) .or. (i_range_2 > n_range_2)) then
297  write(0,*) 'ERROR integer_rmap2 B:', name
298  write(0,*) 'i_domain', i_domain
299  write(0,*) 'i_range_1', i_range_1
300  write(0,*) 'i_range_2', i_range_2
301  write(0,*) 'n_range_1', n_range_1
302  write(0,*) 'n_range_2', n_range_2
303  call assert(723392756, continue_on_error)
304  end if
305 
306  i_index = integer_rmap2%index%entry(i_domain)
307  if ((i_index < 1) .or. (i_index &
308  > integer_varray_n_entry(integer_rmap2%inverse(i_range_1, &
309  i_range_2)))) then
310  write(0,*) 'ERROR integer_rmap2 C:', name
311  write(0,*) 'i_domain', i_domain
312  write(0,*) 'i_range_1', i_range_1
313  write(0,*) 'i_range_2', i_range_2
314  write(0,*) 'i_index', i_index
315  write(0,*) 'integer_varray_n_entry(' &
316  // 'integer_rmap2%inverse(i_range_1, i_range_2))', &
317  integer_varray_n_entry(integer_rmap2%inverse(i_range_1, &
318  i_range_2))
319  call assert(317458796, continue_on_error)
320  end if
321  if (i_domain &
322  /= integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)) then
323  write(0,*) 'ERROR integer_rmap2 D:', name
324  write(0,*) 'i_domain', i_domain
325  write(0,*) 'i_range_1', i_range_1
326  write(0,*) 'i_range_2', i_range_2
327  write(0,*) 'i_index', i_index
328  write(0,*) 'integer_rmap2%inverse(i_range_1, ' &
329  // 'i_range_2)%entry(i_index)', &
330  integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)
331  call assert(662733308, continue_on_error)
332  end if
333  end do
334 
335  do i_range_1 = 1,n_range_1
336  do i_range_2 = 1,n_range_2
337  do i_index = 1,integer_varray_n_entry( &
338  integer_rmap2%inverse(i_range_1, i_range_2))
339  i_domain &
340  = integer_rmap2%inverse(i_range_1, i_range_2)%entry(i_index)
341  if ((i_domain < 1) .or. (i_domain > n_domain)) then
342  write(0,*) 'ERROR integer_rmap2 E:', name
343  write(0,*) 'i_range_1', i_range_1
344  write(0,*) 'i_range_2', i_range_2
345  write(0,*) 'i_index', i_index
346  write(0,*) 'i_domain', i_domain
347  write(0,*) 'n_domain', n_domain
348  call assert(639449827, continue_on_error)
349  end if
350  if ((i_range_1 /= integer_rmap2%forward1%entry(i_domain)) &
351  .or. (i_range_2 /= integer_rmap2%forward2%entry(i_domain)) &
352  .or. (i_index /= integer_rmap2%index%entry(i_domain))) then
353  write(0,*) 'ERROR integer_rmap2 F:', name
354  write(0,*) 'i_domain', i_domain
355  write(0,*) 'i_range_1', i_range_1
356  write(0,*) 'i_range_2', i_range_2
357  write(0,*) 'integer_rmap2%forward1%entry(i_domain)', &
358  integer_rmap2%forward1%entry(i_domain)
359  write(0,*) 'integer_rmap2%forward2%entry(i_domain)', &
360  integer_rmap2%forward2%entry(i_domain)
361  write(0,*) 'i_index', i_index
362  write(0,*) 'integer_rmap2%index%entry(i_domain)', &
363  integer_rmap2%index%entry(i_domain)
364  call assert(636832060, continue_on_error)
365  end if
366  end do
367  end do
368  end do
369 
370  end subroutine integer_rmap2_check
371 
372 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
373 
374  !> Determines the number of bytes required to pack the given value.
375  integer function pmc_mpi_pack_size_integer_rmap2(val)
376 
377  !> Value to pack.
378  type(integer_rmap2_t), intent(in) :: val
379 
380  integer :: i_1, i_2, total_size
381  logical :: is_allocated
382 
383  total_size = 0
384  is_allocated = allocated(val%inverse)
385  total_size = total_size + pmc_mpi_pack_size_logical(is_allocated)
386  if (is_allocated) then
387  total_size = total_size &
388  + pmc_mpi_pack_size_integer(size(val%inverse, 1))
389  total_size = total_size &
390  + pmc_mpi_pack_size_integer(size(val%inverse, 2))
391  do i_1 = 1,size(val%inverse, 1)
392  do i_2 = 1,size(val%inverse, 2)
393  total_size = total_size &
394  + pmc_mpi_pack_size_integer_varray(val%inverse(i_1, i_2))
395  end do
396  end do
397  end if
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  total_size = total_size + pmc_mpi_pack_size_integer_varray(val%index)
402 
404 
405 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
406 
407  !> Packs the given value into the buffer, advancing position.
408  subroutine pmc_mpi_pack_integer_rmap2(buffer, position, val)
409 
410  !> Memory buffer.
411  character, intent(inout) :: buffer(:)
412  !> Current buffer position.
413  integer, intent(inout) :: position
414  !> Value to pack.
415  type(integer_rmap2_t), intent(in) :: val
416 
417 #ifdef PMC_USE_MPI
418  integer :: prev_position, i_1, i_2
419  logical :: is_allocated
420 
421  prev_position = position
422  is_allocated = allocated(val%inverse)
423  call pmc_mpi_pack_logical(buffer, position, is_allocated)
424  if (is_allocated) then
425  call pmc_mpi_pack_integer(buffer, position, size(val%inverse, 1))
426  call pmc_mpi_pack_integer(buffer, position, size(val%inverse, 2))
427  do i_1 = 1,size(val%inverse, 1)
428  do i_2 = 1,size(val%inverse, 2)
429  call pmc_mpi_pack_integer_varray(buffer, position, &
430  val%inverse(i_1, i_2))
431  end do
432  end do
433  end if
434  call pmc_mpi_pack_integer_varray(buffer, position, val%forward1)
435  call pmc_mpi_pack_integer_varray(buffer, position, val%forward2)
436  call pmc_mpi_pack_integer_varray(buffer, position, val%index)
437  call assert(283629348, &
438  position - prev_position <= pmc_mpi_pack_size_integer_rmap2(val))
439 #endif
440 
441  end subroutine pmc_mpi_pack_integer_rmap2
442 
443 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
444 
445  !> Unpacks the given value from the buffer, advancing position.
446  subroutine pmc_mpi_unpack_integer_rmap2(buffer, position, val)
447 
448  !> Memory buffer.
449  character, intent(inout) :: buffer(:)
450  !> Current buffer position.
451  integer, intent(inout) :: position
452  !> Value to pack.
453  type(integer_rmap2_t), intent(inout) :: val
454 
455 #ifdef PMC_USE_MPI
456  integer :: prev_position, i_1, i_2, n_1, n_2
457  logical :: is_allocated
458 
459  prev_position = position
460  call pmc_mpi_unpack_logical(buffer, position, is_allocated)
461  if (is_allocated) then
462  call pmc_mpi_unpack_integer(buffer, position, n_1)
463  call pmc_mpi_unpack_integer(buffer, position, n_2)
464  call integer_rmap2_set_ranges(val, n_1, n_2)
465  do i_1 = 1,size(val%inverse, 1)
466  do i_2 = 1,size(val%inverse, 2)
467  call pmc_mpi_unpack_integer_varray(buffer, position, &
468  val%inverse(i_1, i_2))
469  end do
470  end do
471  else
472  if (allocated(val%inverse)) then
473  deallocate(val%inverse)
474  end if
475  end if
476  call pmc_mpi_unpack_integer_varray(buffer, position, val%forward1)
477  call pmc_mpi_unpack_integer_varray(buffer, position, val%forward2)
478  call pmc_mpi_unpack_integer_varray(buffer, position, val%index)
479  call assert(796602256, &
480  position - prev_position <= pmc_mpi_pack_size_integer_rmap2(val))
481 #endif
482 
483  end subroutine pmc_mpi_unpack_integer_rmap2
484 
485 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
486 
487 end module pmc_integer_rmap2
pmc_mpi
Wrapper functions for MPI.
Definition: mpi.F90:13
pmc_integer_varray::integer_varray_zero
elemental subroutine integer_varray_zero(integer_varray)
Resets an integer_varray to have zero entries.
Definition: integer_varray.F90:76
pmc_integer_rmap2
The integer_rmap2_t structure and assocated subroutines.
Definition: integer_rmap2.F90:9
pmc_integer_rmap2::pmc_mpi_pack_integer_rmap2
subroutine pmc_mpi_pack_integer_rmap2(buffer, position, val)
Packs the given value into the buffer, advancing position.
Definition: integer_rmap2.F90:409
pmc_mpi::pmc_mpi_pack_logical
subroutine pmc_mpi_pack_logical(buffer, position, val)
Packs the given value into the buffer, advancing position.
Definition: mpi.F90:638
pmc_util::assert
subroutine assert(code, condition_ok)
Errors unless condition_ok is true.
Definition: util.F90:103
pmc_integer_rmap2::integer_rmap2_append
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.
Definition: integer_rmap2.F90:108
pmc_integer_varray::pmc_mpi_pack_size_integer_varray
integer function pmc_mpi_pack_size_integer_varray(val)
Determines the number of bytes required to pack the given value.
Definition: integer_varray.F90:177
pmc_integer_varray::integer_varray_n_entry
elemental integer function integer_varray_n_entry(integer_varray)
Return the current number of entries.
Definition: integer_varray.F90:31
pmc_mpi::pmc_mpi_pack_size_logical
integer function pmc_mpi_pack_size_logical(val)
Determines the number of bytes required to pack the given value.
Definition: mpi.F90:407
pmc_integer_varray
The integer_varray_t structure and assocated subroutines.
Definition: integer_varray.F90:9
pmc_integer_rmap2::integer_rmap2_t
A map , together with its multi-valued inverse.
Definition: integer_rmap2.F90:53
pmc_integer_varray::integer_varray_t
A variable-length 1D array of integers.
Definition: integer_varray.F90:18
pmc_integer_rmap2::integer_rmap2_check
subroutine integer_rmap2_check(integer_rmap2, name, n_domain, n_range_1, n_range_2, continue_on_error)
Check that the data is consistent.
Definition: integer_rmap2.F90:250
pmc_integer_rmap2::integer_rmap2_change
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).
Definition: integer_rmap2.F90:137
pmc_integer_rmap2::pmc_mpi_unpack_integer_rmap2
subroutine pmc_mpi_unpack_integer_rmap2(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
Definition: integer_rmap2.F90:447
pmc_integer_varray::integer_varray_remove_entry
subroutine integer_varray_remove_entry(integer_varray, index)
Removes the entry at the given index, repacking values to maintain contiguous data.
Definition: integer_varray.F90:152
pmc_integer_varray::pmc_mpi_pack_integer_varray
subroutine pmc_mpi_pack_integer_varray(buffer, position, val)
Packs the given value into the buffer, advancing position.
Definition: integer_varray.F90:200
pmc_integer_rmap2::pmc_mpi_pack_size_integer_rmap2
integer function pmc_mpi_pack_size_integer_rmap2(val)
Determines the number of bytes required to pack the given value.
Definition: integer_rmap2.F90:376
pmc_mpi::pmc_mpi_unpack_integer
subroutine pmc_mpi_unpack_integer(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
Definition: mpi.F90:818
pmc_mpi::pmc_mpi_unpack_logical
subroutine pmc_mpi_unpack_logical(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
Definition: mpi.F90:896
pmc_integer_varray::pmc_mpi_unpack_integer_varray
subroutine pmc_mpi_unpack_integer_varray(buffer, position, val)
Unpacks the given value from the buffer, advancing position.
Definition: integer_varray.F90:230
pmc_util
Common utility subroutines.
Definition: util.F90:9
pmc_integer_varray::integer_varray_append
subroutine integer_varray_append(integer_varray, val)
Adds the given number to the end of the array.
Definition: integer_varray.F90:132
pmc_mpi::pmc_mpi_pack_size_integer
integer function pmc_mpi_pack_size_integer(val)
Determines the number of bytes required to pack the given value.
Definition: mpi.F90:345
pmc_mpi::pmc_mpi_pack_integer
subroutine pmc_mpi_pack_integer(buffer, position, val)
Packs the given value into the buffer, advancing position.
Definition: mpi.F90:561
pmc_integer_rmap2::integer_rmap2_zero
elemental subroutine integer_rmap2_zero(integer_rmap2)
Resets an integer_rmap2 to have no mappings.
Definition: integer_rmap2.F90:90
pmc_integer_rmap2::integer_rmap2_set_ranges
elemental subroutine integer_rmap2_set_ranges(integer_rmap2, n_range_1, n_range_2)
Sets the maximum ranges of the forward map.
Definition: integer_rmap2.F90:71
pmc_integer_rmap2::integer_rmap2_remove
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...
Definition: integer_rmap2.F90:191