VTK-m  2.0
MeshBoundary2D.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 // This header contains a collection of classes used to describe the boundary
54 // of a mesh, for each main mesh type (i.e., 2D, 3D, and ContourTreeMesh).
55 // For each mesh type, there are two classes, the actual boundary desriptor
56 // class and an ExectionObject class with the PrepareForInput function that
57 // VTKm expects to generate the object for the execution environment.
58 
59 #ifndef vtk_m_worklet_contourtree_augmented_mesh_boundary_mesh_boundary_2d_h
60 #define vtk_m_worklet_contourtree_augmented_mesh_boundary_mesh_boundary_2d_h
61 
62 #include <cstdlib>
63 
66 
68 
69 namespace vtkm
70 {
71 namespace worklet
72 {
73 namespace contourtree_augmented
74 {
75 
76 
78 {
79 public:
80  // Sort indicies types
82 
85  : MeshStructure({ 0, 0 })
86  {
87  }
88 
89  VTKM_CONT
91  const IdArrayType& sortIndices,
93  vtkm::cont::Token& token)
94  : MeshStructure(meshSize)
95  {
96  this->SortIndicesPortal = sortIndices.PrepareForInput(device, token);
97  }
98 
100  bool LiesOnBoundary(const vtkm::Id meshIndex) const
101  {
102  const vtkm::Id2 pos{ this->MeshStructure.VertexPos(meshIndex) };
103  return (pos[0] == 0) || (pos[1] == 0) || (pos[0] == this->MeshStructure.MeshSize[0] - 1) ||
104  (pos[1] == this->MeshStructure.MeshSize[1] - 1);
105  }
106 
108  bool IsNecessary(const vtkm::Id meshIndex) const
109  {
110  vtkm::Id sortIndex = this->SortIndicesPortal.Get(meshIndex);
111  const vtkm::Id2 pos{ this->MeshStructure.VertexPos(meshIndex) };
112 
113  // Keep only when lying on boundary
114  if ((pos[0] == 0) || (pos[1] == 0) || (pos[0] == this->MeshStructure.MeshSize[0] - 1) ||
115  (pos[1] == this->MeshStructure.MeshSize[1] - 1))
116  {
117  // If vertex lies on boundary, keep all corners in any case
118  if (((pos[1] == 0) && ((pos[0] == 0) || (pos[0] == this->MeshStructure.MeshSize[0] - 1))) ||
119  ((pos[1] == this->MeshStructure.MeshSize[1] - 1) &&
120  ((pos[0] == 0) || (pos[0] == this->MeshStructure.MeshSize[0] - 1))))
121  {
122  return true;
123  }
124  else
125  {
126  // if not a corner, keep only vertices that are local extrema
127  vtkm::Id sp, sn;
128  if (pos[1] == 0 || pos[1] == this->MeshStructure.MeshSize[1] - 1)
129  {
130  assert(pos[0] > 0 && pos[0] < this->MeshStructure.MeshSize[0] - 1);
131  assert(meshIndex >= 1);
132  sp = this->SortIndicesPortal.Get(meshIndex - 1);
133  assert(meshIndex + 1 < this->SortIndicesPortal.GetNumberOfValues());
134  sn = this->SortIndicesPortal.Get(meshIndex + 1);
135  }
136  else if (pos[0] == 0 || pos[0] == this->MeshStructure.MeshSize[0] - 1)
137  {
138  assert(pos[1] > 0 && pos[1] < this->MeshStructure.MeshSize[1] - 1);
139  assert(meshIndex >= this->MeshStructure.MeshSize[0]);
140  sp = this->SortIndicesPortal.Get(meshIndex - this->MeshStructure.MeshSize[0]);
141  assert(meshIndex + this->MeshStructure.MeshSize[0] <
142  this->SortIndicesPortal.GetNumberOfValues());
143  sn = this->SortIndicesPortal.Get(meshIndex + this->MeshStructure.MeshSize[0]);
144  }
145  else
146  {
147  return false;
148  }
149  return (sortIndex < sp && sortIndex < sn) || (sortIndex > sp && sortIndex > sn);
150  }
151  }
152  else
153  {
154  // Discard vertices in the interior
155  return false;
156  }
157  }
160 
161 private:
162  // 2D Mesh size parameters
165 };
166 
168 {
169 public:
171  MeshBoundary2DExec(vtkm::Id2 inMeshSize, const IdArrayType& inSortIndices)
172  : MeshSize(inMeshSize)
173  , SortIndices(inSortIndices)
174  {
175  }
176 
177  VTKM_CONT
179  vtkm::cont::Token& token) const
180  {
181  return MeshBoundary2D(this->MeshSize, this->SortIndices, device, token);
182  }
183 
184 private:
185  // 2D Mesh size parameters
188 };
189 
190 
191 } // namespace contourtree_augmented
192 } // worklet
193 } // vtkm
194 
195 #endif
vtkm::worklet::contourtree_augmented::MeshBoundary2D::MeshBoundary2D
VTKM_EXEC_CONT MeshBoundary2D()
Definition: MeshBoundary2D.h:84
vtkm::cont::ArrayHandle< vtkm::Id >
vtkm::worklet::contourtree_augmented::MeshBoundary2D::SortIndicesPortalType
IdArrayType::ReadPortalType SortIndicesPortalType
Definition: MeshBoundary2D.h:81
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
vtkm::cont::ArrayHandle::PrepareForInput
VTKM_CONT ReadPortalType PrepareForInput(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token) const
Prepares this array to be used as an input to an operation in the execution environment.
Definition: ArrayHandle.h:574
vtkm::worklet::contourtree_augmented::MeshBoundary2D::MeshBoundary2D
VTKM_CONT MeshBoundary2D(vtkm::Id2 meshSize, const IdArrayType &sortIndices, vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token)
Definition: MeshBoundary2D.h:90
vtkm::worklet::contourtree_augmented::MeshBoundary2D::MeshStructure
data_set_mesh::MeshStructure2D MeshStructure
Definition: MeshBoundary2D.h:163
vtkm::worklet::contourtree_augmented::data_set_mesh::MeshStructure2D
Definition: MeshStructure2D.h:69
vtkm::worklet::contourtree_augmented::data_set_mesh::MeshStructure2D::VertexPos
VTKM_EXEC vtkm::Id2 VertexPos(vtkm::Id v) const
Get the (x,y) position of the vertex based on its index.
Definition: MeshStructure2D.h:90
vtkm::cont::ArrayHandle< vtkm::Id >::ReadPortalType
typename StorageType::ReadPortalType ReadPortalType
Definition: ArrayHandle.h:294
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
MeshStructure2D.h
vtkm::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:35
vtkm::worklet::contourtree_augmented::MeshBoundary2DExec::MeshSize
vtkm::Id2 MeshSize
Definition: MeshBoundary2D.h:186
vtkm::worklet::contourtree_augmented::MeshBoundary2DExec::PrepareForExecution
VTKM_CONT MeshBoundary2D PrepareForExecution(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token &token) const
Definition: MeshBoundary2D.h:178
vtkm::worklet::contourtree_augmented::MeshBoundary2DExec::MeshBoundary2DExec
VTKM_EXEC_CONT MeshBoundary2DExec(vtkm::Id2 inMeshSize, const IdArrayType &inSortIndices)
Definition: MeshBoundary2D.h:171
vtkm::worklet::contourtree_augmented::MeshBoundary2DExec
Definition: MeshBoundary2D.h:167
Types.h
VTKM_CONT
#define VTKM_CONT
Definition: ExportMacros.h:57
vtkm::cont::ExecutionObjectBase
Base ExecutionObjectBase for execution objects to inherit from so that you can use an arbitrary objec...
Definition: ExecutionObjectBase.h:31
vtkm::cont::DeviceAdapterId
Definition: DeviceAdapterTag.h:52
vtkm::Vec< vtkm::Id, 2 >
vtkm::worklet::contourtree_augmented::MeshBoundary2D
Definition: MeshBoundary2D.h:77
vtkm::worklet::contourtree_augmented::MeshBoundary2D::LiesOnBoundary
VTKM_EXEC_CONT bool LiesOnBoundary(const vtkm::Id meshIndex) const
Definition: MeshBoundary2D.h:100
vtkm::worklet::contourtree_augmented::MeshBoundary2D::IsNecessary
VTKM_EXEC_CONT bool IsNecessary(const vtkm::Id meshIndex) const
Definition: MeshBoundary2D.h:108
vtkm::worklet::contourtree_augmented::data_set_mesh::MeshStructure2D::MeshSize
vtkm::Id2 MeshSize
Definition: MeshStructure2D.h:126
vtkm::worklet::contourtree_augmented::MeshBoundary2D::SortIndicesPortal
SortIndicesPortalType SortIndicesPortal
Definition: MeshBoundary2D.h:164
ExecutionObjectBase.h
vtkm::worklet::contourtree_augmented::MeshBoundary2D::GetMeshStructure
const VTKM_EXEC_CONT data_set_mesh::MeshStructure2D & GetMeshStructure() const
Definition: MeshBoundary2D.h:159
vtkm::worklet::contourtree_augmented::MeshBoundary2DExec::SortIndices
const IdArrayType & SortIndices
Definition: MeshBoundary2D.h:187