VTK-m  2.0
ComputeRegularStructure_SetArcs.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_augmented_contourtree_maker_inc_compute_regular_structure_set_arcs_h
54 #define vtk_m_worklet_contourtree_augmented_contourtree_maker_inc_compute_regular_structure_set_arcs_h
55 
58 
59 namespace vtkm
60 {
61 namespace worklet
62 {
63 namespace contourtree_augmented
64 {
65 namespace contourtree_maker_inc
66 {
67 
68 // Worklet for setting the arcs of the contour tree based on the sorted arcs
70 {
71 public:
72  typedef void ControlSignature(WholeArrayIn arcSorter, // (input) arcSorter array
73  WholeArrayIn contourTreeSuperparents, // (input)
74  WholeArrayIn contourTreeSuperarcs, // (input)
75  WholeArrayIn contourTreeSupernodes, // (input)
76  WholeArrayOut contourTreeArcs); // (output)
77  typedef void ExecutionSignature(_1, InputIndex, _2, _3, _4, _5);
78  using InputDomain = _1;
79 
80  vtkm::Id NumArcs; // contourTree.Arcs.GetNumberOfValues()
81 
82  // Default Constructor
85  : NumArcs(numArcs)
86  {
87  }
88 
89  template <typename InFieldPortalType, typename OutFieldPortalType>
90  VTKM_EXEC void operator()(const InFieldPortalType& arcSorterPortal,
91  const vtkm::Id sortedNode,
92  const InFieldPortalType& contourTreeSuperparentsPortal,
93  const InFieldPortalType& contourTreeSuperarcsPortal,
94  const InFieldPortalType& contourTreeSupernodesPortal,
95  const OutFieldPortalType& contourTreeArcsPortal) const
96  {
97  // per node
98  // convert arcSorter to node ID
99  vtkm::Id nodeID = arcSorterPortal.Get(sortedNode);
100  vtkm::Id superparent = contourTreeSuperparentsPortal.Get(nodeID);
101 
102  // the end element is always the last
103  bool isLastOnSuperarc = false;
104  if (sortedNode == NumArcs - 1)
105  {
106  isLastOnSuperarc = true;
107  }
108  // otherwise look for a change in the superparent
109  else
110  {
111  isLastOnSuperarc =
112  (superparent != contourTreeSuperparentsPortal.Get(arcSorterPortal.Get(sortedNode + 1)));
113  }
114 
115  // if it's the last on the superarc
116  if (isLastOnSuperarc)
117  { // last on superarc
118  // retrieve the superarc's far end
119  vtkm::Id superarcEnd = contourTreeSuperarcsPortal.Get(superparent);
120  // this only happens for the root of the tree, but is still needed
121  if (NoSuchElement(superarcEnd))
122  {
123  contourTreeArcsPortal.Set(nodeID, (vtkm::Id)NO_SUCH_ELEMENT);
124  }
125  else
126  {
127  contourTreeArcsPortal.Set(nodeID,
128  contourTreeSupernodesPortal.Get(MaskedIndex(superarcEnd)) |
129  (superarcEnd & IS_ASCENDING));
130  }
131  } // last on superarc
132  else
133  { // not last on superarc
134  vtkm::Id neighbour = arcSorterPortal.Get(sortedNode + 1);
135  contourTreeArcsPortal.Set(nodeID, neighbour | ((neighbour > nodeID) ? IS_ASCENDING : 0));
136  } // not last on superarc
137 
138 
139  // In serial this worklet implements the following operation
140  /*
141  for (vtkm::Id sortedNode = 0; sortedNode < contourTree.Arcs.size(); sortedNode++)
142  { // per node
143  // convert arcSorter to node ID
144  vtkm::Id nodeID = arcSorter[sortedNode];
145  vtkm::Id superparent = contourTree.Superparents[nodeID];
146 
147  // the end element is always the last
148  bool isLastOnSuperarc = false;
149  if (sortedNode == contourTree.Arcs.size()-1)
150  isLastOnSuperarc = true;
151  // otherwise look for a change in the superparent
152  else
153  isLastOnSuperarc = (superparent != contourTree.Superparents[arcSorter[sortedNode + 1]]);
154 
155  // if it's the last on the superarc
156  if (isLastOnSuperarc)
157  { // last on superarc
158  // retrieve the superarc's far end
159  vtkm::Id superarcEnd = contourTree.superarcs[superparent];
160  // this only happens for the root of the tree, but is still needed
161  if (NoSuchElement(superarcEnd))
162  contourTree.Arcs[nodeID] = NO_SUCH_ELEMENT;
163  else
164  contourTree.Arcs[nodeID] = contourTree.Supernodes[MaskedIndex(superarcEnd)] | (superarcEnd & IS_ASCENDING);
165  } // last on superarc
166  else
167  { // not last on superarc
168  vtkm::Id neighbour = arcSorter[sortedNode+1];
169  contourTree.Arcs[nodeID] = neighbour | ((neighbour > nodeID) ? IS_ASCENDING : 0);
170  } // not last on superarc
171 
172  } // per node
173 
174  */
175  }
176 
177 }; // ComputeRegularStructure_SetArcs
178 
179 // Worklet for setting the arcs of the contour tree based on the sorted augmented nodes
181 {
182 public:
183  typedef void ControlSignature(WholeArrayIn arcSorter, // (input) arcSorter array
184  WholeArrayIn contourTreeSuperparents, // (input)
185  WholeArrayIn contourTreeSuperarcs, // (input)
186  WholeArrayIn contourTreeSupernodes, // (input)
187  WholeArrayIn toCompressed, // (input)
188  WholeArrayOut contourTreeArcs); // (output)
189  typedef void ExecutionSignature(_1, InputIndex, _2, _3, _4, _5, _6);
190  using InputDomain = _1;
191 
192  vtkm::Id NumArcs; // contourTree.Arcs.GetNumberOfValues()
193 
194  // Default Constructor
197  : NumArcs(numArcs)
198  {
199  }
200 
201  template <typename InFieldPortalType, typename OutFieldPortalType>
202  VTKM_EXEC void operator()(const InFieldPortalType& arcSorterPortal,
203  const vtkm::Id sortedNode,
204  const InFieldPortalType& contourTreeSuperparentsPortal,
205  const InFieldPortalType& contourTreeSuperarcsPortal,
206  const InFieldPortalType& contourTreeSupernodesPortal,
207  const InFieldPortalType& toCompressedPortal,
208  const OutFieldPortalType& contourTreeArcsPortal) const
209  {
210  // per node
211  // convert arcSorter to node ID
212  vtkm::Id nodeID = arcSorterPortal.Get(sortedNode);
213  vtkm::Id superparent = contourTreeSuperparentsPortal.Get(nodeID);
214 
215  // the end element is always the last
216  bool isLastOnSuperarc = false;
217  if (sortedNode == NumArcs - 1)
218  {
219  isLastOnSuperarc = true;
220  }
221  // otherwise look for a change in the superparent
222  else
223  {
224  isLastOnSuperarc =
225  (superparent != contourTreeSuperparentsPortal.Get(arcSorterPortal.Get(sortedNode + 1)));
226  }
227 
228  // if it's the last on the superarc
229  if (isLastOnSuperarc)
230  { // last on superarc
231  // retrieve the superarc's far end
232  vtkm::Id superarcEnd = contourTreeSuperarcsPortal.Get(superparent);
233  // this only happens for the root of the tree, but is still needed
234  if (NoSuchElement(superarcEnd))
235  {
236  contourTreeArcsPortal.Set(nodeID, (vtkm::Id)NO_SUCH_ELEMENT);
237  }
238  else
239  {
240  contourTreeArcsPortal.Set(
241  nodeID,
242  toCompressedPortal.Get(contourTreeSupernodesPortal.Get(MaskedIndex(superarcEnd))) |
243  (superarcEnd & IS_ASCENDING));
244  }
245  } // last on superarc
246  else
247  { // not last on superarc
248  vtkm::Id neighbour = arcSorterPortal.Get(sortedNode + 1);
249  contourTreeArcsPortal.Set(nodeID, neighbour | ((neighbour > nodeID) ? IS_ASCENDING : 0));
250  } // not last on superarc
251  }
252 
253 }; // ComputeRegularStructure_SetAugmentArcs
254 
255 
256 
257 
258 } // namespace contourtree_maker_inc
259 } // namespace contourtree_augmented
260 } // namespace worklet
261 } // namespace vtkm
262 
263 #endif
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::NumArcs
vtkm::Id NumArcs
Definition: ComputeRegularStructure_SetArcs.h:192
VTKM_EXEC
#define VTKM_EXEC
Definition: ExportMacros.h:51
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::ExecutionSignature
void ExecutionSignature(_1, InputIndex, _2, _3, _4, _5, _6)
Definition: ComputeRegularStructure_SetArcs.h:189
WorkletMapField.h
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::InputDomain
_1 InputDomain
Definition: ComputeRegularStructure_SetArcs.h:190
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs
Definition: ComputeRegularStructure_SetArcs.h:69
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::operator()
VTKM_EXEC void operator()(const InFieldPortalType &arcSorterPortal, const vtkm::Id sortedNode, const InFieldPortalType &contourTreeSuperparentsPortal, const InFieldPortalType &contourTreeSuperarcsPortal, const InFieldPortalType &contourTreeSupernodesPortal, const OutFieldPortalType &contourTreeArcsPortal) const
Definition: ComputeRegularStructure_SetArcs.h:90
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_augmented::NoSuchElement
VTKM_EXEC_CONT bool NoSuchElement(vtkm::Id flaggedIndex)
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:97
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs
Definition: ComputeRegularStructure_SetArcs.h:180
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::NumArcs
vtkm::Id NumArcs
Definition: ComputeRegularStructure_SetArcs.h:80
Types.h
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::ComputeRegularStructure_SetArcs
VTKM_EXEC_CONT ComputeRegularStructure_SetArcs(vtkm::Id numArcs)
Definition: ComputeRegularStructure_SetArcs.h:84
vtkm::worklet::contourtree_augmented::IS_ASCENDING
constexpr vtkm::Id IS_ASCENDING
Definition: filter/scalar_topology/worklet/contourtree_augmented/Types.h:77
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::operator()
VTKM_EXEC void operator()(const InFieldPortalType &arcSorterPortal, const vtkm::Id sortedNode, const InFieldPortalType &contourTreeSuperparentsPortal, const InFieldPortalType &contourTreeSuperarcsPortal, const InFieldPortalType &contourTreeSupernodesPortal, const InFieldPortalType &toCompressedPortal, const OutFieldPortalType &contourTreeArcsPortal) const
Definition: ComputeRegularStructure_SetArcs.h:202
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::InputDomain
_1 InputDomain
Definition: ComputeRegularStructure_SetArcs.h:78
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::ControlSignature
void ControlSignature(WholeArrayIn arcSorter, WholeArrayIn contourTreeSuperparents, WholeArrayIn contourTreeSuperarcs, WholeArrayIn contourTreeSupernodes, WholeArrayIn toCompressed, WholeArrayOut contourTreeArcs)
Definition: ComputeRegularStructure_SetArcs.h:183
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::ExecutionSignature
void ExecutionSignature(_1, InputIndex, _2, _3, _4, _5)
Definition: ComputeRegularStructure_SetArcs.h:77
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_augmented::contourtree_maker_inc::ComputeRegularStructure_SetArcs::ControlSignature
void ControlSignature(WholeArrayIn arcSorter, WholeArrayIn contourTreeSuperparents, WholeArrayIn contourTreeSuperarcs, WholeArrayIn contourTreeSupernodes, WholeArrayOut contourTreeArcs)
Definition: ComputeRegularStructure_SetArcs.h:72
vtkm::worklet::WorkletMapField
Base class for worklets that do a simple mapping of field arrays.
Definition: WorkletMapField.h:38
vtkm::worklet::contourtree_augmented::contourtree_maker_inc::ComputeRegularStructure_SetAugmentArcs::ComputeRegularStructure_SetAugmentArcs
VTKM_EXEC_CONT ComputeRegularStructure_SetAugmentArcs(vtkm::Id numArcs)
Definition: ComputeRegularStructure_SetArcs.h:196