1 //============================================================================
2 //  Copyright (c) Kitware, Inc.
3 //  All rights reserved.
4 //  See LICENSE.txt for details.
5 //  This software is distributed WITHOUT ANY WARRANTY; without even
6 //  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
7 //  PURPOSE.  See the above copyright notice for more information.
8 //
9 //  Copyright 2017 National Technology & Engineering Solutions of Sandia, LLC (NTESS).
10 //  Copyright 2017 UT-Battelle, LLC.
11 //  Copyright 2017 Los Alamos National Security.
12 //
13 //  Under the terms of Contract DE-NA0003525 with NTESS,
14 //  the U.S. Government retains certain rights in this software.
15 //
16 //  Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
17 //  Laboratory (LANL), the U.S. Government retains certain rights in
18 //  this software.
19 //============================================================================
20 
21 #ifndef vtk_m_filter_Lagrangian_h
22 #define vtk_m_filter_Lagrangian_h
23 
24 #include <vtkm/filter/FilterDataSetWithField.h>
25 
26 namespace vtkm
27 {
28 namespace filter
29 {
30 
31 class Lagrangian : public vtkm::filter::FilterDataSetWithField<Lagrangian>
32 {
33 public:
34   VTKM_CONT
35   Lagrangian();
36 
37   VTKM_CONT
SetRank(vtkm::Id val)38   void SetRank(vtkm::Id val) { this->rank = val; }
39 
40   VTKM_CONT
SetInitFlag(bool val)41   void SetInitFlag(bool val) { this->initFlag = val; }
42 
43   VTKM_CONT
SetExtractFlows(bool val)44   void SetExtractFlows(bool val) { this->extractFlows = val; }
45 
46   VTKM_CONT
SetResetParticles(bool val)47   void SetResetParticles(bool val) { this->resetParticles = val; }
48 
49   VTKM_CONT
SetStepSize(vtkm::Float32 val)50   void SetStepSize(vtkm::Float32 val) { this->stepSize = val; }
51 
52   VTKM_CONT
SetWriteFrequency(vtkm::Id val)53   void SetWriteFrequency(vtkm::Id val) { this->writeFrequency = val; }
54 
55   VTKM_CONT
SetSeedResolutionInX(vtkm::Id val)56   void SetSeedResolutionInX(vtkm::Id val) { this->x_res = val; }
57 
58   VTKM_CONT
SetSeedResolutionInY(vtkm::Id val)59   void SetSeedResolutionInY(vtkm::Id val) { this->y_res = val; }
60 
61   VTKM_CONT
SetSeedResolutionInZ(vtkm::Id val)62   void SetSeedResolutionInZ(vtkm::Id val) { this->z_res = val; }
63 
64   VTKM_CONT
SetCustomSeedResolution(vtkm::Id val)65   void SetCustomSeedResolution(vtkm::Id val) { this->cust_res = val; }
66 
67   VTKM_CONT
SetSeedingResolution(vtkm::Id3 val)68   void SetSeedingResolution(vtkm::Id3 val) { this->SeedRes = val; }
69 
70   VTKM_CONT
71   void UpdateSeedResolution(vtkm::cont::DataSet input);
72 
73   VTKM_CONT
74   void WriteDataSet(vtkm::Id cycle, std::string filename, vtkm::cont::DataSet dataset);
75 
76   VTKM_CONT
77   void InitializeUniformSeeds(const vtkm::cont::DataSet& input);
78 
79   template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
80   VTKM_CONT vtkm::cont::DataSet DoExecute(
81     const vtkm::cont::DataSet& input,
82     const vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>, StorageType>& field,
83     const vtkm::filter::FieldMetadata& fieldMeta,
84     const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
85     const DeviceAdapter& tag);
86 
87 
88   template <typename T, typename StorageType, typename DerivedPolicy, typename DeviceAdapter>
89   VTKM_CONT bool DoMapField(vtkm::cont::DataSet& result,
90                             const vtkm::cont::ArrayHandle<T, StorageType>& input,
91                             const vtkm::filter::FieldMetadata& fieldMeta,
92                             const vtkm::filter::PolicyBase<DerivedPolicy>& policy,
93                             const DeviceAdapter& tag);
94 
95 private:
96   vtkm::Id rank;
97   bool initFlag;
98   bool extractFlows;
99   bool resetParticles;
100   vtkm::Float32 stepSize;
101   vtkm::Id x_res, y_res, z_res;
102   vtkm::Id cust_res;
103   vtkm::Id3 SeedRes;
104   vtkm::Id writeFrequency;
105 };
106 
107 template <>
108 class FilterTraits<Lagrangian>
109 {
110 public:
111   struct TypeListTagLagrangian
112     : vtkm::ListTagBase<vtkm::Vec<vtkm::Float32, 3>, vtkm::Vec<vtkm::Float64, 3>>
113   {
114   };
115   using InputFieldTypeList = TypeListTagLagrangian;
116 };
117 }
118 } // namespace vtkm::filter
119 
120 #include <vtkm/filter/Lagrangian.hxx>
121 
122 #endif // vtk_m_filter_Lagrangian_h
123