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_contourtreeblockdata_h 54 #define vtk_m_worklet_contourtree_distributed_contourtreeblockdata_h 55 56 #include <vtkm/Types.h> 57 #include <vtkm/worklet/contourtree_augmented/Types.h> 58 59 // clang-format off 60 VTKM_THIRDPARTY_PRE_INCLUDE 61 #include <vtkm/thirdparty/diy/diy.h> 62 VTKM_THIRDPARTY_POST_INCLUDE 63 // clang-format on 64 65 66 namespace vtkm 67 { 68 namespace worklet 69 { 70 namespace contourtree_distributed 71 { 72 template <typename FieldType> 73 struct ContourTreeBlockData 74 { createContourTreeBlockData75 static void* create() { return new ContourTreeBlockData<FieldType>; } destroyContourTreeBlockData76 static void destroy(void* b) { delete static_cast<ContourTreeBlockData<FieldType>*>(b); } 77 78 // ContourTreeMesh data 79 vtkm::Id NumVertices; 80 vtkm::cont::ArrayHandle<FieldType> SortedValue; 81 vtkm::worklet::contourtree_augmented::IdArrayType GlobalMeshIndex; 82 vtkm::worklet::contourtree_augmented::IdArrayType Neighbours; 83 vtkm::worklet::contourtree_augmented::IdArrayType FirstNeighbour; 84 vtkm::Id MaxNeighbours; 85 86 // Block metadata 87 vtkm::Id3 BlockOrigin; // Origin of the data block 88 vtkm::Id3 BlockSize; // Extends of the data block 89 vtkm::Id3 GlobalSize; // Extends of the global mesh 90 unsigned int ComputeRegularStructure; // pass through augmentation setting 91 }; 92 } // namespace contourtree_distributed 93 } // namespace worklet 94 } // namespace vtkm 95 96 97 namespace vtkmdiy 98 { 99 100 // Struct to serialize ContourBlockData objects (i.e., load/save) needed in parralle for DIY 101 template <typename FieldType> 102 struct Serialization<vtkm::worklet::contourtree_distributed::ContourTreeBlockData<FieldType>> 103 { 104 static void save( 105 vtkmdiy::BinaryBuffer& bb, 106 const vtkm::worklet::contourtree_distributed::ContourTreeBlockData<FieldType>& block) 107 { 108 vtkmdiy::save(bb, block.NumVertices); 109 vtkmdiy::save(bb, block.SortedValue); 110 vtkmdiy::save(bb, block.GlobalMeshIndex); 111 vtkmdiy::save(bb, block.Neighbours); 112 vtkmdiy::save(bb, block.FirstNeighbour); 113 vtkmdiy::save(bb, block.MaxNeighbours); 114 vtkmdiy::save(bb, block.BlockOrigin); 115 vtkmdiy::save(bb, block.BlockSize); 116 vtkmdiy::save(bb, block.GlobalSize); 117 vtkmdiy::save(bb, block.ComputeRegularStructure); 118 } 119 120 static void load(vtkmdiy::BinaryBuffer& bb, 121 vtkm::worklet::contourtree_distributed::ContourTreeBlockData<FieldType>& block) 122 { 123 vtkmdiy::load(bb, block.NumVertices); 124 vtkmdiy::load(bb, block.SortedValue); 125 vtkmdiy::load(bb, block.GlobalMeshIndex); 126 vtkmdiy::load(bb, block.Neighbours); 127 vtkmdiy::load(bb, block.FirstNeighbour); 128 vtkmdiy::load(bb, block.MaxNeighbours); 129 vtkmdiy::load(bb, block.BlockOrigin); 130 vtkmdiy::load(bb, block.BlockSize); 131 vtkmdiy::load(bb, block.GlobalSize); 132 vtkmdiy::load(bb, block.ComputeRegularStructure); 133 } 134 }; 135 136 } // namespace mangled_vtkmdiy_namespace 137 138 139 #endif 140