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_process_contourtree_inc_supernode_branch_comperator_h 54 #define vtk_m_worklet_contourtree_augmented_process_contourtree_inc_supernode_branch_comperator_h 55 56 #include <vtkm/Pair.h> 57 #include <vtkm/Types.h> 58 #include <vtkm/cont/ArrayHandle.h> 59 #include <vtkm/cont/ExecutionObjectBase.h> 60 #include <vtkm/worklet/contourtree_augmented/Types.h> 61 62 namespace vtkm 63 { 64 namespace worklet 65 { 66 namespace contourtree_augmented 67 { 68 namespace process_contourtree_inc 69 { 70 71 class SuperNodeBranchComparatorImpl 72 { // SuperNodeBranchComparatorImpl 73 public: 74 using IdPortalType = vtkm::cont::ArrayHandle<vtkm::Id>::ReadPortalType; 75 IdPortalType WhichBranchPortal; 76 IdPortalType SupernodesPortal; 77 78 // constructor SuperNodeBranchComparatorImpl(const IdArrayType & whichBranch,const IdArrayType & supernodes,vtkm::cont::DeviceAdapterId device,vtkm::cont::Token & token)79 SuperNodeBranchComparatorImpl(const IdArrayType& whichBranch, 80 const IdArrayType& supernodes, 81 vtkm::cont::DeviceAdapterId device, 82 vtkm::cont::Token& token) 83 { // constructor 84 this->WhichBranchPortal = whichBranch.PrepareForInput(device, token); 85 this->SupernodesPortal = supernodes.PrepareForInput(device, token); 86 } // constructor 87 88 // () operator - gets called to do comparison 89 VTKM_EXEC operator()90 bool operator()(const vtkm::Id& i, const vtkm::Id& j) const 91 { // operator() 92 // retrieve which branch the supernodes are on 93 vtkm::Id branchI = MaskedIndex(this->WhichBranchPortal.Get(i)); 94 vtkm::Id branchJ = MaskedIndex(this->WhichBranchPortal.Get(j)); 95 96 // and test them 97 if (branchI < branchJ) 98 return true; 99 if (branchJ < branchI) 100 return false; 101 102 // now fall back on regular ID 103 vtkm::Id regularI = this->SupernodesPortal.Get(i); 104 vtkm::Id regularJ = this->SupernodesPortal.Get(j); 105 106 if (regularI < regularJ) 107 return true; 108 if (regularJ < regularI) 109 return false; 110 111 // fallback just in case 112 return false; 113 } // operator() 114 }; // SuperNodeBranchComparatorImpl 115 116 class SuperNodeBranchComparator : public vtkm::cont::ExecutionObjectBase 117 { // SuperNodeBranchComparator 118 public: 119 // constructor SuperNodeBranchComparator(const IdArrayType & whichBranch,const IdArrayType & supernodes)120 SuperNodeBranchComparator(const IdArrayType& whichBranch, const IdArrayType& supernodes) 121 : WhichBranch(whichBranch) 122 , Supernodes(supernodes) 123 { 124 } 125 PrepareForExecution(vtkm::cont::DeviceAdapterId device,vtkm::cont::Token & token)126 VTKM_CONT SuperNodeBranchComparatorImpl PrepareForExecution(vtkm::cont::DeviceAdapterId device, 127 vtkm::cont::Token& token) 128 { 129 return SuperNodeBranchComparatorImpl(this->WhichBranch, this->Supernodes, device, token); 130 } 131 132 private: 133 IdArrayType WhichBranch; 134 IdArrayType Supernodes; 135 }; // SuperNodeBranchComparator 136 137 138 } // namespace process_contourtree_inc 139 } // namespace contourtree_augmented 140 } // namespace worklet 141 } // namespace vtkm 142 143 #endif 144