VTK-m  2.0
FindSuperArcForUnknownNode.h
Go to the documentation of this file.
1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //============================================================================
10 // Copyright (c) 2018, The Regents of the University of California, through
11 // Lawrence Berkeley National Laboratory (subject to receipt of any required approvals
12 // from the U.S. Dept. of Energy). All rights reserved.
13 //
14 // Redistribution and use in source and binary forms, with or without modification,
15 // are permitted provided that the following conditions are met:
16 //
17 // (1) Redistributions of source code must retain the above copyright notice, this
18 // list of conditions and the following disclaimer.
19 //
20 // (2) Redistributions in binary form must reproduce the above copyright notice,
21 // this list of conditions and the following disclaimer in the documentation
22 // and/or other materials provided with the distribution.
23 //
24 // (3) Neither the name of the University of California, Lawrence Berkeley National
25 // Laboratory, U.S. Dept. of Energy nor the names of its contributors may be
26 // used to endorse or promote products derived from this software without
27 // specific prior written permission.
28 //
29 // THIS SOFTWARE IS PROVIdED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
30 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
32 // IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33 // INDIRECT, INCIdENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
37 // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
38 // OF THE POSSIBILITY OF SUCH DAMAGE.
39 //
40 //=============================================================================
41 //
42 // This code is an extension of the algorithm presented in the paper:
43 // Parallel Peak Pruning for Scalable SMP Contour Tree Computation.
44 // Hamish Carr, Gunther Weber, Christopher Sewell, and James Ahrens.
45 // Proceedings of the IEEE Symposium on Large Data Analysis and Visualization
46 // (LDAV), October 2016, Baltimore, Maryland.
47 //
48 // The PPP2 algorithm and software were jointly developed by
49 // Hamish Carr (University of Leeds), Gunther H. Weber (LBNL), and
50 // Oliver Ruebel (LBNL)
51 //==============================================================================
52 
53 #ifndef vtk_m_worklet_contourtree_distributed_find_superarc_for_unknown_node_h
54 #define vtk_m_worklet_contourtree_distributed_find_superarc_for_unknown_node_h
55 
56 #include <vtkm/Types.h>
58 
59 
60 namespace vtkm
61 {
62 namespace worklet
63 {
64 namespace contourtree_distributed
65 {
66 
67 
69 template <typename FieldType>
71 {
72 public:
73  using IndicesPortalType =
76 
77  VTKM_CONT
80  vtkm::cont::Token& token,
90  const vtkm::worklet::contourtree_augmented::IdArrayType& regularNodeGlobalIds,
91  const vtkm::cont::ArrayHandle<FieldType>& dataValues)
92  {
93  // Prepare the arrays for input and store the array portals
94  // so that they can be used inside a workelt
95  this->Superparents = superparents.PrepareForInput(device, token);
96  this->Supernodes = supernodes.PrepareForInput(device, token);
97  this->Superarcs = superarcs.PrepareForInput(device, token);
98  this->Superchildren = superchildren.PrepareForInput(device, token);
99  this->WhichRound = whichRound.PrepareForInput(device, token);
100  this->WhichIteration = whichIteration.PrepareForInput(device, token);
101  this->Hyperparents = hyperparents.PrepareForInput(device, token);
102  this->Hypernodes = hypernodes.PrepareForInput(device, token);
103  this->Hyperarcs = hyperarcs.PrepareForInput(device, token);
104  this->RegularNodeGlobalIds = regularNodeGlobalIds.PrepareForInput(device, token);
105  this->DataValues = dataValues.PrepareForInput(device, token);
106  }
107 
112  VTKM_EXEC
114  FieldType nodeValue,
115  vtkm::Id above,
116  vtkm::Id below) const
117  { // FindSuperArcForUnknownNode()
118  // the hyperparent which we need to search along
120 
121  // to find the superarc, we will first have to convert the above / below to a pair of super/hypernodes
122  vtkm::Id aboveSuperparent = this->Superparents.Get(above);
123  vtkm::Id belowSuperparent = this->Superparents.Get(below);
124 
125  // if the two superparents match, we must be on the same superarc, and we are done
126  if (aboveSuperparent == belowSuperparent)
127  {
128  return aboveSuperparent;
129  }
130 
131  // now it gets slightly tricky. While we know that the above / below pair straddle the node of interest, it is not guaranteed that
132  // their superparents will. What we do is to take the two ends of the "above" superarc - one of which is guaranteed to be at least as high
133  // as the above node. We choose that, and the inverse at the lower end. We can determine this from the ascending flag for the superarc
134  vtkm::Id aboveSuperarc = this->Superarcs.Get(aboveSuperparent);
135  // there are two possibilities here.
136  // I. It could be null, which means that "aboveSuperparent" is either the root of the tree or an attachment point. This can only happen
137  // if "above" IS the root/attachment point, so we can safely keep it.
138  // II. In all other cases, there is a superarc, and if it's ascending, we take the destination instead of the source.
141  {
142  aboveSuperparent = vtkm::worklet::contourtree_augmented::MaskedIndex(aboveSuperarc);
143  }
144 
145  // and the same at the lower end
146  vtkm::Id belowSuperarc = this->Superarcs.Get(belowSuperparent);
149  {
150  belowSuperparent = vtkm::worklet::contourtree_augmented::MaskedIndex(belowSuperarc);
151  }
152 
153  // we now have as an invariant that the above, below supernodes straddle the node of interest
154 
155  // retrieve the corresponding hyperparents: we no longer need to worry whether we straddle, as the iteration takes care of pruning in
156  // the correct direction
157  vtkm::Id aboveHyperparent = this->Hyperparents.Get(aboveSuperparent);
158  vtkm::Id belowHyperparent = this->Hyperparents.Get(belowSuperparent);
159 
160  // now test to see if we have the same hyperparent:
161  // if we do, choose it and fall through the following while loop
162  if (aboveHyperparent == belowHyperparent)
163  {
164  hyperparent = aboveHyperparent;
165  }
166 
167  // loop until we have matching hyperparents - i.e. until we're on the same hyperarc
168  while (aboveHyperparent != belowHyperparent)
169  { // different hyperparents
170  // otherwise, they must be different, and we can ask which prunes first
171  // the rule is that we do it by hierarchical round first, iteration second, so
172  vtkm::Id belowRound = this->WhichRound.Get(this->Hypernodes.Get(belowHyperparent));
174  this->WhichIteration.Get(this->Hypernodes.Get(belowHyperparent)));
175 
176  vtkm::Id aboveRound = this->WhichRound.Get(this->Hypernodes.Get(aboveHyperparent));
178  this->WhichIteration.Get(this->Hypernodes.Get(aboveHyperparent)));
179 
180  // and a variable for which end prunes first
181  vtkm::Id pruningEnd = PRUNE_LOW;
182 
183  // now search until we find a hyperarc
185  { // until we have set a hyperparent
186  // decide which end prunes first
187  // low round #'s prune first
188  if (belowRound < aboveRound)
189  {
190  pruningEnd = PRUNE_LOW;
191  }
192  else if (belowRound > aboveRound)
193  {
194  pruningEnd = PRUNE_HIGH;
195  }
196  // in the same round, low iterations prune first
197  else if (belowIteration < aboveIteration)
198  {
199  pruningEnd = PRUNE_LOW;
200  }
201  else if (belowIteration > aboveIteration)
202  {
203  pruningEnd = PRUNE_HIGH;
204  }
205  // perfect match
206  else if (aboveHyperparent == belowHyperparent)
207  {
208  pruningEnd = PRUNE_FINAL;
209  }
210  else // prune either end first
211  {
212  pruningEnd = PRUNE_LOW;
213  }
214 
215  // now, depending on the case
216  switch (pruningEnd)
217  { // switch on pruning end
218  case PRUNE_FINAL:
219  { // last hyperarc left can prune both ends simultaneously
220  // in this case, both have the same hyperparent set (& its arbitrary between them)
221  // this will cause the loop to exit
222  hyperparent = aboveHyperparent;
223  break;
224  } // last hyperarc left can prune both ends simultaneously
225  case PRUNE_LOW:
226  { // low end prunes first
227  // here, we test the hyperarc to see if the upper end is higher than the target
228  // if it is, we've overshot, but at least we now know which hyperarc
230  this->Hyperarcs.Get(belowHyperparent));
231  vtkm::Id hyperTargetRegularId = this->Supernodes.Get(hyperTarget);
232  vtkm::Id hyperTargetGlobalId = this->RegularNodeGlobalIds.Get(hyperTargetRegularId);
233  FieldType hyperTargetValue = this->DataValues.Get(hyperTargetRegularId);
234 
235  // now compare, with simulation of simplicity
236  // success means we've found the hyperarc
237  if ((hyperTargetValue > nodeValue) ||
238  ((hyperTargetValue == nodeValue) && (hyperTargetGlobalId > nodeGlobalId)))
239  { // overshoot
240  hyperparent = belowHyperparent;
241  } // overshoot
242  // failure means we update the low end and keep going
243  else
244  { // no overshoot
245  // the next hyperarc is always the hyperparent, even for attachment points
246  belowHyperparent = this->Hyperparents.Get(hyperTarget);
247  // the round and iteration, however, need to be set from the hyperparent
248  // since an attachment point will have a different round / iteration from it's hyperparent
249  belowSuperparent = this->Hypernodes.Get(belowHyperparent);
250  belowRound = this->WhichRound.Get(belowSuperparent);
252  this->WhichIteration.Get(belowSuperparent));
253  } // no overshoot
254  break;
255  } // low end prunes first
256  case PRUNE_HIGH:
257  { // high end prunes first
258  // here, we test the hyperarc to see if the lower end is lower than the target
259  // if it is, we've overshot, but at least we now know which hyperarc
260  // this differs from the hypersweep logic in the regular tree
262  this->Hyperarcs.Get(aboveHyperparent));
263  vtkm::Id hyperTargetRegularId = this->Supernodes.Get(hyperTarget);
264  vtkm::Id hyperTargetGlobalId = this->RegularNodeGlobalIds.Get(hyperTargetRegularId);
265  FieldType hyperTargetValue = this->DataValues.Get(hyperTargetRegularId);
266 
267  // now compare, with simulation of simplicity
268  // success means we've found the hyperarc
269  if ((hyperTargetValue < nodeValue) ||
270  ((hyperTargetValue == nodeValue) && (hyperTargetGlobalId < nodeGlobalId)))
271  { // overshoot
272  hyperparent = aboveHyperparent;
273  } // overshoot
274  // failure means we update the low end and keep going
275  else
276  { // no overshoot
277  // the next hyperarc is always the hyperparent, even for attachment points
278  aboveHyperparent = this->Hyperparents.Get(hyperTarget);
279  // the round and iteration, however, need to be set from the hyperparent
280  // since an attachment point will have a different round / iteration from it's hyperparent
281  // this differs from the hypersweep logic in the regular tree
282  aboveSuperparent = this->Hypernodes.Get(aboveHyperparent);
283  aboveRound = this->WhichRound.Get(aboveSuperparent);
285  this->WhichIteration.Get(aboveSuperparent));
286  } // no overshoot
287  break;
288  } // high end prunes first
289  } // switch on pruning end
290  } // until we have set a hyperparent
291 
292  // if we found one, then we exit this loop too
294  {
295  break;
296  }
297  } // different hyperparents
298 
299  // We are now on the correct hyperarc and "merely" need to find the correct superarc with a binary search.
300  // We are, however, guaranteed to have a data value strictly in the range of the hyperarc
301  // Moreover, we are already guaranteed that the data value is strictly in the range on the hyperarc
303  { // ascending hyperarc
304  // the supernodes on the hyperarc are in sorted low-high order
305  vtkm::Id lowSupernode = this->Hypernodes.Get(hyperparent);
306  // now that we have stored "superchildren", this next bit is easier than it used to be
307  vtkm::Id highSupernode =
308  this->Hypernodes.Get(hyperparent) + this->Superchildren.Get(hyperparent) - 1;
309 
310  // now, the high supernode may be lower than the element, because the node belongs
311  // between it and the high end of the hyperarc. In this case, the high supernode's ascending superarc is the correct one
312  vtkm::Id highSupernodeRegularId = this->Supernodes.Get(highSupernode);
313  vtkm::Id highSupernodeGlobalId = this->RegularNodeGlobalIds.Get(highSupernodeRegularId);
314  FieldType highValue = this->DataValues.Get(highSupernodeRegularId);
315  // simulation of simplicity
316  if ((highValue < nodeValue) ||
317  ((highValue == nodeValue) && (highSupernodeGlobalId < nodeGlobalId)))
318  { // last superarc
319  return highSupernode;
320  } // last superarc
321  // otherwise, we do a binary search of the superarcs
322  else
323  { // node between high & low
324  // keep going until we span exactly
325  while (highSupernode - lowSupernode > 1)
326  { // binary search
327  // find the midway supernode
328  vtkm::Id midSupernode = (lowSupernode + highSupernode) / 2;
329  vtkm::Id midSupernodeRegularId = this->Supernodes.Get(midSupernode);
330  vtkm::Id midSupernodeGlobalId = this->RegularNodeGlobalIds.Get(midSupernodeRegularId);
331  FieldType midValue = this->DataValues.Get(midSupernodeRegularId);
332 
333  // test against the node (with simulation of simplicity)
334  if ((midValue > nodeValue) ||
335  ((midValue == nodeValue) && (midSupernodeGlobalId > nodeGlobalId)))
336  { // mid higher
337  highSupernode = midSupernode;
338  } // mid higher
339  // == can't happen since node is regular
340  else
341  { // mid lower
342  lowSupernode = midSupernode;
343  } // mid lower
344  } // binary search
345  // we've now narrowed down the search and found the superarc we wanted, so return it
346  // for an ascending arc, the Id is that of the lower end
347  return lowSupernode;
348  } // node between high & low
349  } // ascending hyperarc
350  else
351  { // descending hyperarc
352  // the supernodes on the hyperarc are in sorted high-low order
353  vtkm::Id highSupernode = this->Hypernodes.Get(hyperparent);
354  // now that we have stored "superchildren", this next bit is easier than it used to be
355  vtkm::Id lowSupernode =
356  this->Hypernodes.Get(hyperparent) + this->Superchildren.Get(hyperparent) - 1;
357 
358  // now, the low supernode may be higher than the element, because the node belongs
359  // between it and the low end of the hyperarc. In this case, the low supernode's descending superarc is the correct one
360  vtkm::Id lowSupernodeRegularId = this->Supernodes.Get(lowSupernode);
361  vtkm::Id lowSupernodeGlobalId = this->RegularNodeGlobalIds.Get(lowSupernodeRegularId);
362  FieldType lowValue = this->DataValues.Get(lowSupernodeRegularId);
363  // simulation of simplicity
364  if ((lowValue > nodeValue) ||
365  ((lowValue == nodeValue) && (lowSupernodeGlobalId >= nodeGlobalId)))
366  {
367  return lowSupernode;
368  }
369  // otherwise, we do a binary search of the superarcs
370  else
371  { // node between low & high
372  // keep going until we span exactly
373  while (lowSupernode - highSupernode > 1)
374  { // binary search
375  // find the midway supernode
376  vtkm::Id midSupernode = (highSupernode + lowSupernode) / 2;
377  vtkm::Id midSupernodeRegularId = this->Supernodes.Get(midSupernode);
378  vtkm::Id midSupernodeGlobalId = this->RegularNodeGlobalIds.Get(midSupernodeRegularId);
379  FieldType midValue = this->DataValues.Get(midSupernodeRegularId);
380  // test against the node (with simulation of simplicity)
381  if ((midValue > nodeValue) ||
382  ((midValue == nodeValue) && (midSupernodeGlobalId > nodeGlobalId)))
383  { // mid higher
384  highSupernode = midSupernode;
385  } // mid higher
386  // == can't happen since node is regular
387  else
388  { // mid lower
389  lowSupernode = midSupernode;
390  } // mid lower
391  } // binary search
392  // we've now narrowed down the search and found the superarc we wanted, so return it
393  // for an ascending arc, the Id is that of the lower end
394  return highSupernode;
395  } // node between low & high
396  } // descending hyperarc
397  } // FindSuperArcForUnknownNode()
398 
399 private:
400  // these are used to make it simpler to search through the hierarchy
401  static constexpr vtkm::Id PRUNE_LOW = static_cast<vtkm::Id>(0);
402  static constexpr vtkm::Id PRUNE_HIGH = static_cast<vtkm::Id>(1);
403  static constexpr vtkm::Id PRUNE_FINAL = static_cast<vtkm::Id>(2);
404 
405  // Array portals needed by FindSuperArcForUnknownNode
406  // These arrays all originate from the HierarchicalContourTree
418 };
419 
420 
427 template <typename FieldType>
429 {
430 public:
432  VTKM_CONT
443  const vtkm::worklet::contourtree_augmented::IdArrayType& regularNodeGlobalIds,
444  const vtkm::cont::ArrayHandle<FieldType>& dataValues)
445  : Superparents(superparents)
446  , Supernodes(supernodes)
447  , Superarcs(superarcs)
448  , Superchildren(superchildren)
449  , WhichRound(whichRound)
450  , WhichIteration(whichIteration)
451  , Hyperparents(hyperparents)
452  , Hypernodes(hypernodes)
453  , Hyperarcs(hyperarcs)
454  , RegularNodeGlobalIds(regularNodeGlobalIds)
455  , DataValues(dataValues)
456  {
457  }
458 
461  vtkm::cont::Token& token) const
462  {
464  token,
465  this->Superparents,
466  this->Supernodes,
467  this->Superarcs,
468  this->Superchildren,
469  this->WhichRound,
470  this->WhichIteration,
471  this->Hyperparents,
472  this->Hypernodes,
473  this->Hyperarcs,
474  this->RegularNodeGlobalIds,
475  this->DataValues);
476  }
477 
478 private:
479  // Arrays needed by FindSuperArcForUnknownNode
480  // These arrays all originate from the HierarchicalContourTree
492 };
493 
494 
495 } // namespace contourtree_distributed
496 } // namespace worklet
497 } // namespace vtkm
498 
499 #endif
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Hyperarcs
IndicesPortalType Hyperarcs
Definition: FindSuperArcForUnknownNode.h:415
vtkm::cont::ArrayHandle< vtkm::Id >
vtkm::worklet::contourtree_augmented::IsAscending
VTKM_EXEC_CONT bool IsAscending(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:121
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::DataValues
DataPortalType DataValues
Definition: FindSuperArcForUnknownNode.h:417
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Supernodes
vtkm::worklet::contourtree_augmented::IdArrayType Supernodes
Definition: FindSuperArcForUnknownNode.h:482
VTKM_EXEC
#define VTKM_EXEC
Definition: ExportMacros.h:51
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
Types.h
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData
Device implementation of FindSuperArcForUnknownNode for the HierarchicalContourTree.
Definition: FindSuperArcForUnknownNode.h:70
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::DataValues
vtkm::cont::ArrayHandle< FieldType > DataValues
Definition: FindSuperArcForUnknownNode.h:491
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::WhichRound
IndicesPortalType WhichRound
Definition: FindSuperArcForUnknownNode.h:411
vtkm::cont::ArrayHandle::PrepareForInput
VTKM_CONT ReadPortalType PrepareForInput(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token) const
Prepares this array to be used as an input to an operation in the execution environment.
Definition: ArrayHandle.h:574
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::FindSuperArcForUnknownNodeDeviceData
VTKM_CONT FindSuperArcForUnknownNodeDeviceData(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token, const vtkm::worklet::contourtree_augmented::IdArrayType &superparents, const vtkm::worklet::contourtree_augmented::IdArrayType &supernodes, const vtkm::worklet::contourtree_augmented::IdArrayType &superarcs, const vtkm::worklet::contourtree_augmented::IdArrayType &superchildren, const vtkm::worklet::contourtree_augmented::IdArrayType &whichRound, const vtkm::worklet::contourtree_augmented::IdArrayType &whichIteration, const vtkm::worklet::contourtree_augmented::IdArrayType &hyperparents, const vtkm::worklet::contourtree_augmented::IdArrayType &hypernodes, const vtkm::worklet::contourtree_augmented::IdArrayType &hyperarcs, const vtkm::worklet::contourtree_augmented::IdArrayType &regularNodeGlobalIds, const vtkm::cont::ArrayHandle< FieldType > &dataValues)
Definition: FindSuperArcForUnknownNode.h:78
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::WhichIteration
IndicesPortalType WhichIteration
Definition: FindSuperArcForUnknownNode.h:412
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::FindSuperArcForUnknownNode
VTKM_EXEC vtkm::Id FindSuperArcForUnknownNode(vtkm::Id nodeGlobalId, FieldType nodeValue, vtkm::Id above, vtkm::Id below) const
routine to find the superarc to which a given global Id/value pair maps given a known pair of vertice...
Definition: FindSuperArcForUnknownNode.h:113
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::PRUNE_FINAL
static constexpr vtkm::Id PRUNE_FINAL
Definition: FindSuperArcForUnknownNode.h:403
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::WhichIteration
vtkm::worklet::contourtree_augmented::IdArrayType WhichIteration
Definition: FindSuperArcForUnknownNode.h:486
vtkm::worklet::contourtree_augmented::MaskedIndex
VTKM_EXEC_CONT vtkm::Id MaskedIndex(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:127
vtkm::cont::ArrayHandle< vtkm::Id >::ReadPortalType
typename StorageType::ReadPortalType ReadPortalType
Definition: ArrayHandle.h:294
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Superparents
vtkm::worklet::contourtree_augmented::IdArrayType Superparents
Definition: FindSuperArcForUnknownNode.h:481
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Hyperarcs
vtkm::worklet::contourtree_augmented::IdArrayType Hyperarcs
Definition: FindSuperArcForUnknownNode.h:489
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Hypernodes
vtkm::worklet::contourtree_augmented::IdArrayType Hypernodes
Definition: FindSuperArcForUnknownNode.h:488
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::RegularNodeGlobalIds
vtkm::worklet::contourtree_augmented::IdArrayType RegularNodeGlobalIds
Definition: FindSuperArcForUnknownNode.h:490
vtkm::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:35
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::WhichRound
vtkm::worklet::contourtree_augmented::IdArrayType WhichRound
Definition: FindSuperArcForUnknownNode.h:485
vtkm::worklet::contourtree_augmented::NoSuchElement
VTKM_EXEC_CONT bool NoSuchElement(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:97
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Superchildren
IndicesPortalType Superchildren
Definition: FindSuperArcForUnknownNode.h:410
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::PRUNE_LOW
static constexpr vtkm::Id PRUNE_LOW
Definition: FindSuperArcForUnknownNode.h:401
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Hyperparents
vtkm::worklet::contourtree_augmented::IdArrayType Hyperparents
Definition: FindSuperArcForUnknownNode.h:487
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::RegularNodeGlobalIds
IndicesPortalType RegularNodeGlobalIds
Definition: FindSuperArcForUnknownNode.h:416
Types.h
VTKM_CONT
#define VTKM_CONT
Definition: ExportMacros.h:57
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Superarcs
vtkm::worklet::contourtree_augmented::IdArrayType Superarcs
Definition: FindSuperArcForUnknownNode.h:483
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::Superchildren
vtkm::worklet::contourtree_augmented::IdArrayType Superchildren
Definition: FindSuperArcForUnknownNode.h:484
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::DataPortalType
typename vtkm::cont::ArrayHandle< FieldType >::ReadPortalType DataPortalType
Definition: FindSuperArcForUnknownNode.h:75
vtkm::cont::ExecutionObjectBase
Base ExecutionObjectBase for execution objects to inherit from so that you can use an arbitrary objec...
Definition: ExecutionObjectBase.h:31
vtkm::cont::DeviceAdapterId
Definition: DeviceAdapterTag.h:52
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Hypernodes
IndicesPortalType Hypernodes
Definition: FindSuperArcForUnknownNode.h:414
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Superparents
IndicesPortalType Superparents
Definition: FindSuperArcForUnknownNode.h:407
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::IndicesPortalType
typename vtkm::worklet::contourtree_augmented::IdArrayType::ReadPortalType IndicesPortalType
Definition: FindSuperArcForUnknownNode.h:74
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Supernodes
IndicesPortalType Supernodes
Definition: FindSuperArcForUnknownNode.h:408
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::PrepareForExecution
VTKM_CONT FindSuperArcForUnknownNodeDeviceData< FieldType > PrepareForExecution(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token) const
Definition: FindSuperArcForUnknownNode.h:459
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Hyperparents
IndicesPortalType Hyperparents
Definition: FindSuperArcForUnknownNode.h:413
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::PRUNE_HIGH
static constexpr vtkm::Id PRUNE_HIGH
Definition: FindSuperArcForUnknownNode.h:402
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode
ExecutionObject to generate a device object to use FindSuperArcForUnknownNode for the HierarchicalCon...
Definition: FindSuperArcForUnknownNode.h:428
vtkm::worklet::contourtree_augmented::NO_SUCH_ELEMENT
constexpr vtkm::Id NO_SUCH_ELEMENT
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:73
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNodeDeviceData::Superarcs
IndicesPortalType Superarcs
Definition: FindSuperArcForUnknownNode.h:409
vtkm::worklet::contourtree_distributed::FindSuperArcForUnknownNode::FindSuperArcForUnknownNode
VTKM_CONT FindSuperArcForUnknownNode(const vtkm::worklet::contourtree_augmented::IdArrayType &superparents, const vtkm::worklet::contourtree_augmented::IdArrayType &supernodes, const vtkm::worklet::contourtree_augmented::IdArrayType &superarcs, const vtkm::worklet::contourtree_augmented::IdArrayType &superchildren, const vtkm::worklet::contourtree_augmented::IdArrayType &whichRound, const vtkm::worklet::contourtree_augmented::IdArrayType &whichIteration, const vtkm::worklet::contourtree_augmented::IdArrayType &hyperparents, const vtkm::worklet::contourtree_augmented::IdArrayType &hypernodes, const vtkm::worklet::contourtree_augmented::IdArrayType &hyperarcs, const vtkm::worklet::contourtree_augmented::IdArrayType &regularNodeGlobalIds, const vtkm::cont::ArrayHandle< FieldType > &dataValues)
constructor
Definition: FindSuperArcForUnknownNode.h:433