VTK-m  2.0
CopyNewSupernodesWorklet.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_tree_grafter_copy_new_supernodes_worklet_h
54 #define vtk_m_worklet_contourtree_distributed_tree_grafter_copy_new_supernodes_worklet_h
55 
56 
59 
60 namespace vtkm
61 {
62 namespace worklet
63 {
64 namespace contourtree_distributed
65 {
66 namespace tree_grafter
67 {
68 
69 // Worklet implementing TreeGrafter.CopyNewSupernodes
71 {
72 public:
73  using ControlSignature = void(WholeArrayIn newSupernode, // input and iteration index
74  WholeArrayIn contourTreeSupernodes, // input
75  WholeArrayIn meshSorterOrder, // input
76  WholeArrayIn hierarchicalTreeId, // input
77  WholeArrayIn whenTransferred, // input
78  WholeArrayIn hierarchicalSuperparent, // input
79  WholeArrayIn hierarchicalHyperparent, //input
80  WholeArrayIn hierarchicalSuperId, // input
81  WholeArrayIn hierarchicalHyperId, // input
82  WholeArrayIn hierarchicalHyperarc, // input
83  WholeArrayOut hierarchicalTreeSupernodes, // output
84  WholeArrayOut hierarchicalTreeWhichRound, // output
85  WholeArrayOut hierarchicalTreeWhichIteration, // output
86  WholeArrayOut hierarchicalTreeSuperarcs, // output
87  WholeArrayInOut hierarchicalRegularId, // input/output
88  WholeArrayInOut hierarchicalTreeHyperparents, // input/output
89  WholeArrayInOut hierarchicalTreeSuperparents // input/output
90  );
91 
92  using ExecutionSignature =
93  void(InputIndex, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17);
94  using InputDomain = _1;
95 
96  // Default Constructor
98  CopyNewSupernodesWorklet(vtkm::Id theRound, vtkm::Id numOldSupernodes)
99  : TheRound(theRound)
100  , NumOldSupernodes(numOldSupernodes)
101  {
102  }
103 
104  template <typename InFieldPortalType,
105  typename SortOrderPortalType,
106  typename OutFieldPortalType,
107  typename InOutFieldPortalType>
109  const vtkm::Id& newSupernode,
110  const InFieldPortalType& newSupernodesPortal,
111  const InFieldPortalType& contourTreeSupernodesPortal,
112  const SortOrderPortalType&
113  meshSortOrderPortal, // depending on the mesh type these may be differnt fancy arrays
114  const InFieldPortalType& hierarchicalTreeIdPortal,
115  const InFieldPortalType& whenTransferredPortal,
116  const InFieldPortalType& hierarchicalSuperparentPortal,
117  const InFieldPortalType& hierarchicalHyperparentPortal,
118  const InFieldPortalType& hierarchicalSuperIdPortal,
119  const InFieldPortalType& hierarchicalHyperIdPortal,
120  const InFieldPortalType& hierarchicalHyperarcPortal,
121  const OutFieldPortalType& hierarchicalTreeSupernodesPortal,
122  const OutFieldPortalType& hierarchicalTreeWhichRoundPortal,
123  const OutFieldPortalType& hierarchicalTreeWhichIterationPortal,
124  const OutFieldPortalType& hierarchicalTreeSuperarcsPortal,
125  const InOutFieldPortalType& hierarchicalRegularIdPortal,
126  const InOutFieldPortalType& hierarchicalTreeHyperparentsPortal,
127  const InOutFieldPortalType& hierarchicalTreeSuperparentsPortal
128 
129  ) const
130  { // operator ()
131  // per new supernode
132  // retrieve the old supernode & regular node Ids
133  vtkm::Id oldSupernodeId = newSupernodesPortal.Get(newSupernode);
134  vtkm::Id oldSortId = contourTreeSupernodesPortal.Get(oldSupernodeId);
135  vtkm::Id oldRegularId = meshSortOrderPortal.Get(oldSortId);
136 
137  // convert to new Ids
138  vtkm::Id newRegularId = hierarchicalTreeIdPortal.Get(oldRegularId);
139  vtkm::Id newSupernodeId = this->NumOldSupernodes + newSupernode;
140 
141  // set the supernode accordingly
142  hierarchicalTreeSupernodesPortal.Set(newSupernodeId, newRegularId);
143 
144  // and set the round and iteration
145  hierarchicalTreeWhichRoundPortal.Set(newSupernodeId, this->TheRound);
146  hierarchicalTreeWhichIterationPortal.Set(newSupernodeId,
147  whenTransferredPortal.Get(oldSupernodeId));
148 
149  // We want to set the superarc and hyperparent. At this point, supernodes fall into four groups:
150  // I. Present in the hierarchical tree as supernodes No work required (not in newSupernodes)
151  // II. Present in the hierarchical tree as regular nodes only Added as supernode. Hyperparent only needs to be set.
152  // III. Not present in the hierarchical tree: attachment point Super/hyper parent stored in hierarchical Ids
153  // IV. Not present, and not an attachment point Super/hyper parent stored in local Ids
154  // Note that I. is already taken care of, so we test whether the supernode was previously in the hierarchical tree at all
155  vtkm::Id storedRegularId = hierarchicalRegularIdPortal.Get(oldSupernodeId);
156 
157  // and set the regular Id in the hierarchical tree (even if it is already set)
158  hierarchicalRegularIdPortal.Set(oldSupernodeId, newRegularId);
159 
160  // now we sort out hyperparent
162  { // present: II
163  // if it isn't already a supernode, it is "only" a regular node
164  if (newSupernodeId >= this->NumOldSupernodes)
165  { // regular but not super
166  // in this case, it already has a superparent (because it is already present in the tree as a regular node)
167  // so we look up the relevant hyperparent
168  hierarchicalTreeHyperparentsPortal.Set(
169  newSupernodeId,
170  hierarchicalTreeHyperparentsPortal.Get(
171  hierarchicalTreeSuperparentsPortal.Get(storedRegularId)));
172  // we set this to indicate that it's an attachment point
173  hierarchicalTreeSuperarcsPortal.Set(
175  } // regular but not super
176  } // present: actually II
177  else
178  { // not present: III or IV
179  // attachment point (III) or free point (IV)
181  hierarchicalSuperparentPortal.Get(oldSupernodeId)))
182  { // attachment point
183  // we've already captured the super-/hyper- parent in an earlier stage
184  hierarchicalTreeSuperparentsPortal.Set(newRegularId,
185  hierarchicalSuperparentPortal.Get(oldSupernodeId));
186  hierarchicalTreeHyperparentsPortal.Set(newSupernodeId,
187  hierarchicalHyperparentPortal.Get(oldSupernodeId));
188  // and the superarc should indicate an attachment point
189  hierarchicalTreeSuperarcsPortal.Set(
191  } // attachment point
192  // otherwise, we have a brand new free supernode, which is it's own superparent
193  else
194  { // free point
195  // this is a supernode that was never in the hierarchical tree in the first place
196  // it is its own superparent, and has a new hyperparent in old supernode Ids (often itself)
197  // and can use that to look up the new hyperId
198  vtkm::Id hierarchicalHyperparentOldSuperId =
199  hierarchicalHyperparentPortal.Get(oldSupernodeId);
200  vtkm::Id hierarchicalHyperparentNewHyperId =
201  hierarchicalHyperIdPortal.Get(hierarchicalHyperparentOldSuperId);
202  hierarchicalTreeHyperparentsPortal.Set(newSupernodeId, hierarchicalHyperparentNewHyperId);
203  // since it is its own superparent, this is easy . . .
204  hierarchicalTreeSuperparentsPortal.Set(newRegularId, newSupernodeId);
205 
206  // now the hard part: fill in the superarc
207  vtkm::Id hierarchicalHyperarcOldSuperId =
208  hierarchicalHyperarcPortal.Get(hierarchicalHyperparentOldSuperId);
209  vtkm::Id isAscendingHyperarc =
210  vtkm::worklet::contourtree_augmented::IsAscending(hierarchicalHyperarcOldSuperId)
212  : 0x0;
213  hierarchicalHyperarcOldSuperId =
214  vtkm::worklet::contourtree_augmented::MaskedIndex(hierarchicalHyperarcOldSuperId);
215  vtkm::Id hierarchicalHyperarcNewSuperId =
216  hierarchicalSuperIdPortal.Get(hierarchicalHyperarcOldSuperId);
217 
218  // we have located each supernode on a hyperarc
219  // and we have to work out the supernode each connects to
220  // unfortunately, the attachment points complicate this compared to the old code
221  // for sweeping later, we will set the # of superchildren, but we don't have that yet
222 
223  // So the test will have to be the following:
224  // i. the "neighbour" is the +1 index
225  // ii. if the neighbour is off the end, we take the end of the hyperarc
226  // iii. if the neighbour has flagged as an attachment point, we take the end of the hyperarc
227  // iv. in all other cases, we take the neighbour
228  // Note that we are saved some trouble by the fact that this code only applies to free points
229 
230  // the superarc is now set by checking to see if the neighbour has the same hyperparent:
231  // if it does, our superarc goes to the next element
232  // if not (or we're at array end), we go to the hyperarc's target
233  // NOTE: we will store the OLD superarc Id at this stage, since we need it to sort out regular arcs
234  // this means we will have to add a final loop to reset to hierarchical Ids
235  vtkm::Id neighbour = newSupernode + 1;
236 
237  // special case at end of array: map the old hyperarc Id to a new one
238  if (neighbour >= newSupernodesPortal.GetNumberOfValues())
239  { // end of array
240  hierarchicalTreeSuperarcsPortal.Set(newSupernodeId,
241  hierarchicalHyperarcNewSuperId | isAscendingHyperarc);
242  } // end of array
243  else
244  { // not at the end of the array
245  vtkm::Id nbrSuperId = newSupernodesPortal.Get(neighbour);
246 
247  // immediately check for case iii. by looking at the hierarchicalSuperparent of the neighbour's old Id
248  // if it's already set, it's because it's an attachment point
250  hierarchicalSuperparentPortal.Get(nbrSuperId)))
251  { // attachment point
252  hierarchicalTreeSuperarcsPortal.Set(
253  newSupernodeId, hierarchicalHyperarcNewSuperId | isAscendingHyperarc);
254  } // attachment point
255  else
256  { // not attachment point
257  vtkm::Id nbrHyperparent = hierarchicalHyperparentPortal.Get(nbrSuperId);
258 
259  // if they share a hyperparent, just take the neighbour
260  if (nbrHyperparent == hierarchicalHyperparentOldSuperId)
261  { // shared hyperparent
262  hierarchicalTreeSuperarcsPortal.Set(
263  newSupernodeId, hierarchicalSuperIdPortal.Get(nbrSuperId) | isAscendingHyperarc);
264  } // shared hyperparent
265  // if not, take the target of the hyperarc
266  else
267  { // not shared hyperparent
268  hierarchicalTreeSuperarcsPortal.Set(
269  newSupernodeId, hierarchicalHyperarcNewSuperId | isAscendingHyperarc);
270  } // not shared hyperparent
271  } // not attachment point
272  } // not at the end of the array
273  } // free point
274  } // attachment point (III) or free point (IV)
275 
276 
277  // In serial this worklet implements the following operation
278  /*
279  for (indexType newSupernode = 0; newSupernode < nNewSupernodes; newSupernode++)
280  { // per new supernode
281  // retrieve the old supernode & regular node IDs
282  indexType oldSupernodeID = newSupernodes[newSupernode];
283  indexType oldSortID = contourTree->supernodes[oldSupernodeID];
284  indexType oldRegularID = mesh->SortOrder(oldSortID);
285 
286  // convert to new IDs
287  indexType newRegularID = hierarchicalTreeID[oldRegularID];
288  indexType newSupernodeID = nOldSupernodes + newSupernode;
289 
290  // set the supernode accordingly
291  hierarchicalTree.supernodes[newSupernodeID] = newRegularID;
292 
293  // and set the round and iteration
294  hierarchicalTree.whichRound[newSupernodeID] = theRound;
295  hierarchicalTree.whichIteration[newSupernodeID] = whenTransferred[oldSupernodeID];
296 
297  // We want to set the superarc and hyperparent. At this point, supernodes fall into four groups:
298  // I. Present in the hierarchical tree as supernodes No work required (not in newSupernodes)
299  // II. Present in the hierarchical tree as regular nodes only Added as supernode. Hyperparent only needs to be set.
300  // III. Not present in the hierarchical tree: attachment point Super/hyper parent stored in hierarchical IDs
301  // IV. Not present, and not an attachment point Super/hyper parent stored in local IDs
302  // Note that I. is already taken care of, so we test whether the supernode was previously in the hierarchical tree at all
303  indexType storedRegularID = hierarchicalRegularID[oldSupernodeID];
304 
305  // and set the regular ID in the hierarchical tree (even if it is already set)
306  hierarchicalRegularID[oldSupernodeID] = newRegularID;
307 
308  // now we sort out hyperparent
309  if (!noSuchElement(storedRegularID))
310  { // present: II
311  // if it isn't already a supernode, it is "only" a regular node
312  if (newSupernodeID >= nOldSupernodes)
313  { // regular but not super
314  // in this case, it already has a superparent (because it is already present in the tree as a regular node)
315  // so we look up the relevant hyperparent
316  hierarchicalTree.hyperparents[newSupernodeID] = hierarchicalTree.hyperparents[hierarchicalTree.superparents[storedRegularID]];
317  // we set this to indicate that it's an attachment point
318  hierarchicalTree.superarcs[newSupernodeID] = NO_SUCH_ELEMENT;
319  } // regular but not super
320  } // present: actually II
321  else
322  { // not present: III or IV
323  // attachment point (III) or free point (IV)
324  if (!noSuchElement(hierarchicalSuperparent[oldSupernodeID]))
325  { // attachment point
326  // we've already captured the super-/hyper- parent in an earlier stage
327  hierarchicalTree.superparents[newRegularID] = hierarchicalSuperparent[oldSupernodeID];
328  hierarchicalTree.hyperparents[newSupernodeID] = hierarchicalHyperparent[oldSupernodeID];
329  // and the superarc should indicate an attachment point
330  hierarchicalTree.superarcs[newSupernodeID] = NO_SUCH_ELEMENT;
331  } // attachment point
332  // otherwise, we have a brand new free supernode, which is it's own superparent
333  else
334  { // free point
335  // this is a supernode that was never in the hierarchical tree in the first place
336  // it is its own superparent, and has a new hyperparent in old supernode IDs (often itself)
337  // and can use that to look up the new hyperID
338  indexType hierarchicalHyperparentOldSuperID = hierarchicalHyperparent[oldSupernodeID];
339  indexType hierarchicalHyperparentNewHyperID = hierarchicalHyperID[hierarchicalHyperparentOldSuperID];
340  hierarchicalTree.hyperparents[newSupernodeID] = hierarchicalHyperparentNewHyperID;
341  // since it is its own superparent, this is easy . . .
342  hierarchicalTree.superparents[newRegularID] = newSupernodeID;
343 
344  // now the hard part: fill in the superarc
345  indexType hierarchicalHyperarcOldSuperID = hierarchicalHyperarc[hierarchicalHyperparentOldSuperID];
346  indexType isAscendingHyperarc = isAscending(hierarchicalHyperarcOldSuperID) ? IS_ASCENDING : 0x0;
347  hierarchicalHyperarcOldSuperID = maskedIndex(hierarchicalHyperarcOldSuperID);
348  indexType hierarchicalHyperarcNewSuperID = hierarchicalSuperID[hierarchicalHyperarcOldSuperID];
349 
350  // we have located each supernode on a hyperarc
351  // and we have to work out the supernode each connects to
352  // unfortunately, the attachment points complicate this compared to the old code
353  // for sweeping later, we will set the # of superchildren, but we don't have that yet
354 
355  // So the test will have to be the following:
356  // i. the "neighbour" is the +1 index
357  // ii. if the neighbour is off the end, we take the end of the hyperarc
358  // iii. if the neighbour has flagged as an attachment point, we take the end of the hyperarc
359  // iv. in all other cases, we take the neighbour
360  // Note that we are saved some trouble by the fact that this code only applies to free points
361 
362  // the superarc is now set by checking to see if the neighbour has the same hyperparent:
363  // if it does, our superarc goes to the next element
364  // if not (or we're at array end), we go to the hyperarc's target
365  // NOTE: we will store the OLD superarc ID at this stage, since we need it to sort out regular arcs
366  // this means we will have to add a final loop to reset to hierarchical IDs
367  indexType neighbour = newSupernode+1;
368 
369  // special case at end of array: map the old hyperarc ID to a new one
370  if (neighbour >= newSupernodes.size())
371  { // end of array
372  hierarchicalTree.superarcs[newSupernodeID] = hierarchicalHyperarcNewSuperID | isAscendingHyperarc;
373  } // end of array
374  else
375  { // not at the end of the array
376  indexType nbrSuperID = newSupernodes[neighbour];
377 
378  // immediately check for case iii. by looking at the hierarchicalSuperparent of the neighbour's old ID
379  // if it's already set, it's because it's an attachment point
380  if (!noSuchElement(hierarchicalSuperparent[nbrSuperID]))
381  { // attachment point
382  hierarchicalTree.superarcs[newSupernodeID] = hierarchicalHyperarcNewSuperID | isAscendingHyperarc;
383  } // attachment point
384  else
385  { // not attachment point
386  indexType nbrHyperparent = hierarchicalHyperparent[nbrSuperID];
387 
388  // if they share a hyperparent, just take the neighbour
389  if (nbrHyperparent == hierarchicalHyperparentOldSuperID)
390  { // shared hyperparent
391  hierarchicalTree.superarcs[newSupernodeID] = hierarchicalSuperID[nbrSuperID] | isAscendingHyperarc;
392  } // shared hyperparent
393  // if not, take the target of the hyperarc
394  else
395  { // not shared hyperparent
396  hierarchicalTree.superarcs[newSupernodeID] = hierarchicalHyperarcNewSuperID | isAscendingHyperarc;
397  } // not shared hyperparent
398  } // not attachment point
399  } // not at the end of the array
400  } // free point
401  } // attachment point (III) or free point (IV)
402  } // per new supernode
403  */
404  } // operator ()
405 
406 private:
409 
410 }; // CopyNewHypernodes
411 
412 } // namespace tree_grafter
413 } // namespace contourtree_distributed
414 } // namespace worklet
415 } // namespace vtkm
416 
417 #endif
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::InputDomain
_1 InputDomain
Definition: CopyNewSupernodesWorklet.h:94
vtkm::worklet::contourtree_augmented::IsAscending
VTKM_EXEC_CONT bool IsAscending(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:121
VTKM_EXEC
#define VTKM_EXEC
Definition: ExportMacros.h:51
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
WorkletMapField.h
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
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::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::operator()
VTKM_EXEC void operator()(const vtkm::Id &newSupernode, const InFieldPortalType &newSupernodesPortal, const InFieldPortalType &contourTreeSupernodesPortal, const SortOrderPortalType &meshSortOrderPortal, const InFieldPortalType &hierarchicalTreeIdPortal, const InFieldPortalType &whenTransferredPortal, const InFieldPortalType &hierarchicalSuperparentPortal, const InFieldPortalType &hierarchicalHyperparentPortal, const InFieldPortalType &hierarchicalSuperIdPortal, const InFieldPortalType &hierarchicalHyperIdPortal, const InFieldPortalType &hierarchicalHyperarcPortal, const OutFieldPortalType &hierarchicalTreeSupernodesPortal, const OutFieldPortalType &hierarchicalTreeWhichRoundPortal, const OutFieldPortalType &hierarchicalTreeWhichIterationPortal, const OutFieldPortalType &hierarchicalTreeSuperarcsPortal, const InOutFieldPortalType &hierarchicalRegularIdPortal, const InOutFieldPortalType &hierarchicalTreeHyperparentsPortal, const InOutFieldPortalType &hierarchicalTreeSuperparentsPortal) const
Definition: CopyNewSupernodesWorklet.h:108
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::ControlSignature
void(WholeArrayIn newSupernode, WholeArrayIn contourTreeSupernodes, WholeArrayIn meshSorterOrder, WholeArrayIn hierarchicalTreeId, WholeArrayIn whenTransferred, WholeArrayIn hierarchicalSuperparent, WholeArrayIn hierarchicalHyperparent, WholeArrayIn hierarchicalSuperId, WholeArrayIn hierarchicalHyperId, WholeArrayIn hierarchicalHyperarc, WholeArrayOut hierarchicalTreeSupernodes, WholeArrayOut hierarchicalTreeWhichRound, WholeArrayOut hierarchicalTreeWhichIteration, WholeArrayOut hierarchicalTreeSuperarcs, WholeArrayInOut hierarchicalRegularId, WholeArrayInOut hierarchicalTreeHyperparents, WholeArrayInOut hierarchicalTreeSuperparents) ControlSignature
Definition: CopyNewSupernodesWorklet.h:90
vtkm::worklet::contourtree_augmented::NoSuchElement
VTKM_EXEC_CONT bool NoSuchElement(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:97
Types.h
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::ExecutionSignature
void(InputIndex, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) ExecutionSignature
Definition: CopyNewSupernodesWorklet.h:93
vtkm::worklet::contourtree_augmented::IS_ASCENDING
constexpr vtkm::Id IS_ASCENDING
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:77
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet
Definition: CopyNewSupernodesWorklet.h:70
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::CopyNewSupernodesWorklet
VTKM_EXEC_CONT CopyNewSupernodesWorklet(vtkm::Id theRound, vtkm::Id numOldSupernodes)
Definition: CopyNewSupernodesWorklet.h:98
vtkm::exec::arg::InputIndex
The ExecutionSignature tag to use to get the input index.
Definition: InputIndex.h:42
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::tree_grafter::CopyNewSupernodesWorklet::TheRound
vtkm::Id TheRound
Definition: CopyNewSupernodesWorklet.h:407
vtkm::worklet::contourtree_distributed::tree_grafter::CopyNewSupernodesWorklet::NumOldSupernodes
vtkm::Id NumOldSupernodes
Definition: CopyNewSupernodesWorklet.h:408
vtkm::worklet::WorkletMapField
Base class for worklets that do a simple mapping of field arrays.
Definition: WorkletMapField.h:38