VTK-m  2.0
GraftParticles.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) 2016, Los Alamos National Security, LLC
11 // All rights reserved.
12 //
13 // Copyright 2016. Los Alamos National Security, LLC.
14 // This software was produced under U.S. Government contract DE-AC52-06NA25396
15 // for Los Alamos National Laboratory (LANL), which is operated by
16 // Los Alamos National Security, LLC for the U.S. Department of Energy.
17 // The U.S. Government has rights to use, reproduce, and distribute this
18 // software. NEITHER THE GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC
19 // MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE
20 // USE OF THIS SOFTWARE. If software is modified to produce derivative works,
21 // such modified software should be clearly marked, so as not to confuse it
22 // with the version available from LANL.
23 //
24 // Additionally, redistribution and use in source and binary forms, with or
25 // without modification, are permitted provided that the following conditions
26 // are met:
27 //
28 // 1. Redistributions of source code must retain the above copyright notice,
29 // this list of conditions and the following disclaimer.
30 // 2. Redistributions in binary form must reproduce the above copyright notice,
31 // this list of conditions and the following disclaimer in the documentation
32 // and/or other materials provided with the distribution.
33 // 3. Neither the name of Los Alamos National Security, LLC, Los Alamos
34 // National Laboratory, LANL, the U.S. Government, nor the names of its
35 // contributors may be used to endorse or promote products derived from
36 // this software without specific prior written permission.
37 //
38 // THIS SOFTWARE IS PROVIDED BY LOS ALAMOS NATIONAL SECURITY, LLC AND
39 // CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
40 // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
41 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LOS ALAMOS
42 // NATIONAL SECURITY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
43 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
44 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
45 // USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
46 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
47 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
48 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49 //============================================================================
50 
51 #ifndef vtkm_worklet_cosmotools_graft_particle_h
52 #define vtkm_worklet_cosmotools_graft_particle_h
53 
56 
57 namespace vtkm
58 {
59 namespace worklet
60 {
61 namespace cosmotools
62 {
63 
64 // Worklet to graft particles together to form halos
65 template <typename T>
67 {
68 public:
69  using ControlSignature =
70  void(FieldIn index, // (input) index into particles
71  FieldIn partId, // (input) particle id sorted by bin
72  FieldIn binId, // (input) bin id sorted by bin
73  FieldIn activeFlag, // (input) flag indicates which of neighbor ranges are used
74  WholeArrayIn partIdArray, // (input) particle id sorted by bin entire array
75  WholeArrayIn location, // (input) location of particles
76  WholeArrayIn firstParticleId, // (input) first particle index vector
77  WholeArrayIn lastParticleId, // (input) last particle index vector
78  WholeArrayOut haloId);
79  using ExecutionSignature = void(_1, _2, _3, _4, _5, _6, _7, _8, _9);
80  using InputDomain = _1;
81 
85 
86  // Constructor
89  const vtkm::Id YNum,
90  const vtkm::Id ZNum,
91  const vtkm::Id NumNeighbors,
92  const T LinkLen)
93  : xNum(XNum)
94  , yNum(YNum)
95  , zNum(ZNum)
96  , NUM_NEIGHBORS(NumNeighbors)
97  , linkLenSq(LinkLen * LinkLen)
98  {
99  }
100 
101  template <typename InIdPortalType,
102  typename InFieldPortalType,
103  typename InVectorPortalType,
104  typename OutPortalType>
106  const vtkm::Id& iPartId,
107  const vtkm::Id& iBinId,
108  const vtkm::UInt32& activeFlag,
109  const InIdPortalType& partIdArray,
110  const InFieldPortalType& location,
111  const InVectorPortalType& firstParticleId,
112  const InVectorPortalType& lastParticleId,
113  OutPortalType& haloId) const
114  {
115  const vtkm::Id yVal = (iBinId / xNum) % yNum;
116  const vtkm::Id zVal = iBinId / (xNum * yNum);
117  vtkm::UInt32 flag = activeFlag;
118  vtkm::Id cnt = 0;
119 
120  // Iterate on both sides of the bin this particle is in
121  for (vtkm::Id z = zVal - 1; z <= zVal + 1; z++)
122  {
123  for (vtkm::Id y = yVal - 1; y <= yVal + 1; y++)
124  {
125  if (flag & 0x1)
126  {
127  vtkm::Id firstBinId = NUM_NEIGHBORS * i + cnt;
128  vtkm::Id startParticle = firstParticleId.Get(firstBinId);
129  vtkm::Id endParticle = lastParticleId.Get(firstBinId);
130 
131  for (vtkm::Id j = startParticle; j < endParticle; j++)
132  {
133  vtkm::Id jPartId = partIdArray.Get(j);
134  vtkm::Vec<T, 3> iloc = location.Get(iPartId);
135  vtkm::Vec<T, 3> jloc = location.Get(jPartId);
136  T xDist = iloc[0] - jloc[0];
137  T yDist = iloc[1] - jloc[1];
138  T zDist = iloc[2] - jloc[2];
139  if ((xDist * xDist + yDist * yDist + zDist * zDist) <= linkLenSq)
140  {
141  if ((haloId.Get(iPartId) == haloId.Get(haloId.Get(iPartId))) &&
142  (haloId.Get(jPartId) < haloId.Get(iPartId)))
143  {
144  haloId.Set(haloId.Get(iPartId), haloId.Get(jPartId));
145  }
146  }
147  }
148  }
149  flag = flag >> 1;
150  cnt++;
151  }
152  }
153  }
154 }; // GraftParticles
155 }
156 }
157 }
158 
159 #endif
vtkm::worklet::cosmotools::GraftParticles::zNum
vtkm::Id zNum
Definition: GraftParticles.h:82
VTKM_EXEC
#define VTKM_EXEC
Definition: ExportMacros.h:51
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
WorkletMapField.h
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
vtkm::worklet::cosmotools::GraftParticles::yNum
vtkm::Id yNum
Definition: GraftParticles.h:82
vtkm::worklet::cosmotools::GraftParticles::InputDomain
_1 InputDomain
Definition: GraftParticles.h:80
vtkm::worklet::cosmotools::GraftParticles::NUM_NEIGHBORS
vtkm::Id NUM_NEIGHBORS
Definition: GraftParticles.h:83
vtkm::worklet::cosmotools::GraftParticles::xNum
vtkm::Id xNum
Definition: GraftParticles.h:82
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::worklet::cosmotools::GraftParticles::linkLenSq
T linkLenSq
Definition: GraftParticles.h:84
vtkm::worklet::WorkletMapField::FieldIn
A control signature tag for input fields.
Definition: WorkletMapField.h:49
vtkm::worklet::cosmotools::GraftParticles::ExecutionSignature
void(_1, _2, _3, _4, _5, _6, _7, _8, _9) ExecutionSignature
Definition: GraftParticles.h:79
vtkm::worklet::cosmotools::GraftParticles::GraftParticles
VTKM_EXEC_CONT GraftParticles(const vtkm::Id XNum, const vtkm::Id YNum, const vtkm::Id ZNum, const vtkm::Id NumNeighbors, const T LinkLen)
Definition: GraftParticles.h:88
vtkm::worklet::cosmotools::GraftParticles
Definition: GraftParticles.h:66
vtkm::Vec< T, 3 >
Definition: Types.h:975
vtkm::UInt32
uint32_t UInt32
Definition: Types.h:161
TagTypes.h
vtkm::worklet::cosmotools::GraftParticles::operator()
VTKM_EXEC void operator()(const vtkm::Id &i, const vtkm::Id &iPartId, const vtkm::Id &iBinId, const vtkm::UInt32 &activeFlag, const InIdPortalType &partIdArray, const InFieldPortalType &location, const InVectorPortalType &firstParticleId, const InVectorPortalType &lastParticleId, OutPortalType &haloId) const
Definition: GraftParticles.h:105
vtkm::worklet::cosmotools::GraftParticles::ControlSignature
void(FieldIn index, FieldIn partId, FieldIn binId, FieldIn activeFlag, WholeArrayIn partIdArray, WholeArrayIn location, WholeArrayIn firstParticleId, WholeArrayIn lastParticleId, WholeArrayOut haloId) ControlSignature
Definition: GraftParticles.h:78
vtkm::worklet::WorkletMapField
Base class for worklets that do a simple mapping of field arrays.
Definition: WorkletMapField.h:38