VTK-m  2.3
ArraySetValues.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 
11 #ifndef vtk_m_cont_ArraySetValues_h
12 #define vtk_m_cont_ArraySetValues_h
13 
15 
16 #include <vtkm/cont/ArrayHandle.h>
18 
19 #include <initializer_list>
20 #include <vector>
21 
22 namespace vtkm
23 {
24 namespace cont
25 {
26 
27 namespace internal
28 {
29 
30 VTKM_CONT_EXPORT void ArraySetValuesImpl(const vtkm::cont::UnknownArrayHandle& ids,
31  const vtkm::cont::UnknownArrayHandle& values,
33  std::false_type extractComponentInefficient);
34 
35 template <typename IdsArrayHandle, typename ValuesArrayHandle, typename DataArrayHandle>
36 void ArraySetValuesImpl(const IdsArrayHandle& ids,
37  const ValuesArrayHandle& values,
38  const DataArrayHandle& data,
39  std::true_type vtkmNotUsed(extractComponentInefficient))
40 {
41  // Fallback implementation using control portals when device operations would be inefficient
42  vtkm::Id numValues = ids.GetNumberOfValues();
43  VTKM_ASSERT(values.GetNumberOfValues() == numValues);
44 
45  auto idsPortal = ids.ReadPortal();
46  auto valuesPortal = values.ReadPortal();
47  auto dataPortal = data.WritePortal();
48 
49  for (vtkm::Id index = 0; index < numValues; ++index)
50  {
51  dataPortal.Set(idsPortal.Get(index), valuesPortal.Get(index));
52  }
53 }
54 
55 } // namespace internal
56 
112 template <typename SIds, typename T, typename SValues, typename SData>
116 {
117  using DataArrayHandle = vtkm::cont::ArrayHandle<T, SData>;
118  using InefficientExtract =
119  vtkm::cont::internal::ArrayExtractComponentIsInefficient<DataArrayHandle>;
120  internal::ArraySetValuesImpl(ids, values, data, InefficientExtract{});
121 }
122 
124 template <typename SIds, typename TIn, typename SValues, typename TOut, typename SData>
129 {
131  tempValues.Allocate(values.GetNumberOfValues());
132  auto inp = values.ReadPortal();
133  auto outp = tempValues.WritePortal();
134  for (vtkm::Id i = 0; i < values.GetNumberOfValues(); ++i)
135  {
136  outp.Set(i, static_cast<TIn>(inp.Get(i)));
137  }
138 
140  ArraySetValues(ids, tempValues, castArray.GetSourceArray());
141 }
142 
143 template <typename SIds, typename T, typename SData, typename Alloc>
145  const std::vector<T, Alloc>& values,
147 {
148  const auto valuesAH = vtkm::cont::make_ArrayHandle(values, vtkm::CopyFlag::Off);
149  ArraySetValues(ids, valuesAH, data);
150 }
151 
152 template <typename T, typename SIds, typename SValues, typename SData>
153 VTKM_CONT void ArraySetValues(const std::vector<vtkm::Id, SIds>& ids,
156 {
157  const auto idsAH = vtkm::cont::make_ArrayHandle(ids, vtkm::CopyFlag::Off);
158  ArraySetValues(idsAH, values, data);
159 }
160 
161 template <typename T, typename AllocId, typename AllocVal, typename SData>
162 VTKM_CONT void ArraySetValues(const std::vector<vtkm::Id, AllocId>& ids,
163  const std::vector<T, AllocVal>& values,
165 {
166  const auto idsAH = vtkm::cont::make_ArrayHandle(ids, vtkm::CopyFlag::Off);
167  const auto valuesAH = vtkm::cont::make_ArrayHandle(values, vtkm::CopyFlag::Off);
168  ArraySetValues(idsAH, valuesAH, data);
169 }
170 
171 template <typename T, typename SData, typename Alloc>
172 VTKM_CONT void ArraySetValues(const std::initializer_list<vtkm::Id>& ids,
173  const std::vector<T, Alloc>& values,
175 {
176  const auto idsAH = vtkm::cont::make_ArrayHandle(
177  ids.begin(), static_cast<vtkm::Id>(ids.size()), vtkm::CopyFlag::Off);
178  const auto valuesAH = vtkm::cont::make_ArrayHandle(values, vtkm::CopyFlag::Off);
179  ArraySetValues(idsAH, valuesAH, data);
180 }
181 
182 template <typename T, typename SData>
183 VTKM_CONT void ArraySetValues(const std::initializer_list<vtkm::Id>& ids,
184  const std::initializer_list<T>& values,
186 {
187  const auto idsAH = vtkm::cont::make_ArrayHandle(
188  ids.begin(), static_cast<vtkm::Id>(ids.size()), vtkm::CopyFlag::Off);
189  const auto valuesAH = vtkm::cont::make_ArrayHandle(
190  values.begin(), static_cast<vtkm::Id>(values.size()), vtkm::CopyFlag::Off);
191  ArraySetValues(idsAH, valuesAH, data);
192 }
193 
194 template <typename T, typename SValues, typename SData>
195 VTKM_CONT void ArraySetValues(const std::initializer_list<vtkm::Id>& ids,
198 {
199  const auto idsAH = vtkm::cont::make_ArrayHandle(
200  ids.begin(), static_cast<vtkm::Id>(ids.size()), vtkm::CopyFlag::Off);
201  ArraySetValues(idsAH, values, data);
202 }
203 
204 template <typename T, typename SData>
206  const vtkm::Id numIds,
207  const std::vector<T>& values,
209 {
210  VTKM_ASSERT(numIds == static_cast<vtkm::Id>(values.size()));
211  const auto idsAH = vtkm::cont::make_ArrayHandle(ids, numIds, vtkm::CopyFlag::Off);
212  const auto valuesAH =
213  vtkm::cont::make_ArrayHandle(values.data(), values.size(), vtkm::CopyFlag::Off);
214  ArraySetValues(idsAH, valuesAH, data);
215 }
216 
217 template <typename T, typename SData>
219  const vtkm::Id numIds,
220  const T* values,
221  const vtkm::Id numValues,
223 {
224  VTKM_ASSERT(numIds == numValues);
225  const auto idsAH = vtkm::cont::make_ArrayHandle(ids, numIds, vtkm::CopyFlag::Off);
226  const auto valuesAH = vtkm::cont::make_ArrayHandle(values, numValues, vtkm::CopyFlag::Off);
227  ArraySetValues(idsAH, valuesAH, data);
228 }
229 
230 template <typename T, typename SData>
232  const vtkm::Id numIds,
233  const vtkm::cont::ArrayHandle<T, SData>& values,
235 {
236  VTKM_ASSERT(numIds == values.GetNumberOfValues());
237  const auto idsAH = vtkm::cont::make_ArrayHandle(ids, numIds, vtkm::CopyFlag::Off);
238  ArraySetValues(idsAH, values, data);
239 }
240 
246 template <typename T, typename SData>
248  const T& value,
250 {
251  const auto idAH = vtkm::cont::make_ArrayHandle(&id, 1, vtkm::CopyFlag::Off);
252  const auto valueAH = vtkm::cont::make_ArrayHandle(&value, 1, vtkm::CopyFlag::Off);
253  ArraySetValues(idAH, valueAH, data);
254 }
255 
257 
258 } // namespace cont
259 } // namespace vtkm
260 
261 #endif //vtk_m_cont_ArraySetValues_h
vtkm::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:300
ArrayHandle.h
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
VTKM_ASSERT
#define VTKM_ASSERT(condition)
Definition: Assert.h:43
vtkm::cont::UnknownArrayHandle
An ArrayHandle of an unknown value type and storage.
Definition: UnknownArrayHandle.h:430
vtkm::cont::ArrayHandle::GetNumberOfValues
vtkm::Id GetNumberOfValues() const
Returns the number of entries in the array.
Definition: ArrayHandle.h:468
vtkm::cont::StorageTagCast
Definition: ArrayHandleCast.h:28
vtkm::cont::ArraySetValues
void ArraySetValues(const vtkm::cont::ArrayHandle< vtkm::Id, SIds > &ids, const vtkm::cont::ArrayHandle< T, SValues > &values, const vtkm::cont::ArrayHandle< T, SData > &data)
Set a small set of values in an ArrayHandle with minimal device transfers.
Definition: ArraySetValues.h:113
UnknownArrayHandle.h
vtkm::cont::ArrayHandleCast::GetSourceArray
ArrayHandleType GetSourceArray() const
Returns the ArrayHandle that is being transformed.
Definition: ArrayHandleCast.h:169
VTKM_CONT_EXPORT
#define VTKM_CONT_EXPORT
Definition: vtkm_cont_export.h:44
vtkm_cont_export.h
VTKM_CONT
#define VTKM_CONT
Definition: ExportMacros.h:57
vtkm::Id
vtkm::Int64 Id
Base type to use to index arrays.
Definition: Types.h:227
vtkmNotUsed
#define vtkmNotUsed(parameter_name)
Simple macro to identify a parameter as unused.
Definition: ExportMacros.h:128
vtkm::cont::ArraySetValue
void ArraySetValue(vtkm::Id id, const T &value, const vtkm::cont::ArrayHandle< T, SData > &data)
Set a single value in an ArrayHandle at the specified index.
Definition: ArraySetValues.h:247
vtkm::cont::ArrayHandle::ReadPortal
ReadPortalType ReadPortal() const
Get an array portal that can be used in the control environment.
Definition: ArrayHandle.h:433
vtkm::CopyFlag::Off
@ Off
vtkm::cont::ArrayHandleCast
Cast the values of an array to the specified type, on demand.
Definition: ArrayHandleCast.h:141
vtkm::cont::ArrayHandle< T, vtkm::cont::StorageTagBasic >::Allocate
void Allocate(vtkm::Id numberOfValues, vtkm::CopyFlag preserve, vtkm::cont::Token &token) const
Allocates an array large enough to hold the given number of values.
Definition: ArrayHandle.h:490
vtkm::cont::ArrayHandleBasic
Basic array storage for an array handle.
Definition: ArrayHandleBasic.h:111
vtkm::cont::make_ArrayHandle
vtkm::cont::ArrayHandleBasic< T > make_ArrayHandle(const T *array, vtkm::Id numberOfValues, vtkm::CopyFlag copy)
A convenience function for creating an ArrayHandle from a standard C array.
Definition: ArrayHandleBasic.h:270
vtkm::cont::ArrayHandle< T, vtkm::cont::StorageTagBasic >::WritePortal
WritePortalType WritePortal() const
Get an array portal that can be used in the control environment.
Definition: ArrayHandle.h:454