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_hyper_and_super_structure_set_first_supernode_per_iteration_worklet_h 54 #define vtk_m_worklet_contourtree_augmented_contourtree_maker_inc_compute_hyper_and_super_structure_set_first_supernode_per_iteration_worklet_h 55 56 #include <vtkm/worklet/WorkletMapField.h> 57 #include <vtkm/worklet/contourtree_augmented/Types.h> 58 59 namespace vtkm 60 { 61 namespace worklet 62 { 63 namespace contourtree_augmented 64 { 65 namespace contourtree_maker_inc 66 { 67 68 // Worklet for settubg the super/hyperarcs fromm the permuted super/hyperarcs vector 69 class ComputeHyperAndSuperStructure_SetFirstSupernodePerIterationWorklet 70 : public vtkm::worklet::WorkletMapField 71 { 72 public: 73 typedef void ControlSignature(FieldIn supernodeIndex, // (input) active super/hyperarcs 74 WholeArrayIn whenTransferred, // (input) 75 WholeArrayOut firstSupernodePerIteration); // (output) 76 typedef void ExecutionSignature(_1, _2, _3); 77 using InputDomain = _1; 78 79 // Default Constructor 80 VTKM_EXEC_CONT ComputeHyperAndSuperStructure_SetFirstSupernodePerIterationWorklet()81 ComputeHyperAndSuperStructure_SetFirstSupernodePerIterationWorklet() {} 82 83 template <typename InFieldPortalType, typename OutFieldPortalType> operator()84 VTKM_EXEC void operator()(const vtkm::Id& supernode, 85 const InFieldPortalType& whenTransferredPortal, 86 const OutFieldPortalType& firstSupernodePerIterationPortal) const 87 { 88 // per supernode 89 vtkm::Id when = 90 vtkm::worklet::contourtree_augmented::MaskedIndex(whenTransferredPortal.Get(supernode)); 91 if (supernode == 0) 92 { // zeroth supernode 93 firstSupernodePerIterationPortal.Set(when, supernode); 94 } // zeroth supernode 95 else 96 { 97 vtkm::Id prevWhen = 98 vtkm::worklet::contourtree_augmented::MaskedIndex(whenTransferredPortal.Get(supernode - 1)); 99 if (when != prevWhen) 100 { // non-matching supernode 101 firstSupernodePerIterationPortal.Set(when, supernode); 102 } // non-matching supernode 103 } 104 // In serial this worklet implements the following operation 105 /* 106 for (indexType supernode = 0; supernode < contourTree.supernodes.size(); supernode++) 107 { // per supernode 108 indexType when = maskedIndex(contourTree.whenTransferred[supernode]); 109 if (supernode == 0) 110 { // zeroth supernode 111 contourTree.firstSupernodePerIteration[when] = supernode; 112 } // zeroth supernode 113 else if (when != maskedIndex(contourTree.whenTransferred[supernode-1])) 114 { // non-matching supernode 115 contourTree.firstSupernodePerIteration[when] = supernode; 116 } // non-matching supernode 117 } // per supernode 118 */ 119 } 120 121 }; // ComputeHyperAndSuperStructure_SetFirstSupernodePerIterationWorklet 122 123 } // namespace contourtree_maker_inc 124 } // namespace contourtree_augmented 125 } // namespace worklet 126 } // namespace vtkm 127 128 #endif 129