Updated gradient scalar output to use new execution obejct

gradient scalar output now has a prepare for execution function for creating the execution object based on the device adaptor.
This commit is contained in:
Matthew Letter 2018-05-15 16:47:22 -06:00
parent ffe7f67e52
commit 86f3ffa76e
2 changed files with 128 additions and 48 deletions

@ -129,7 +129,7 @@ struct GradientOutputFields : public vtkm::cont::ExecutionObjectBase
template <typename DeviceAdapter>
struct ExecutionTypes
{
using Portal = vtkm::exec::GradientOutput<T, DeviceAdapter>;
using Portal = vtkm::exec::GradientOutput<T>;
};
GradientOutputFields()
@ -181,18 +181,17 @@ struct GradientOutputFields : public vtkm::cont::ExecutionObjectBase
bool GetComputeGradient() const { return StoreGradient; }
//todo fix this for scalar
template <typename DeviceAdapter>
vtkm::exec::GradientOutput<T, DeviceAdapter> PrepareForOutput(vtkm::Id size, DeviceAdapter)
vtkm::exec::GradientOutput<T> PrepareForOutput(vtkm::Id size)
{
vtkm::exec::GradientOutput<T, DeviceAdapter> portal(this->StoreGradient,
this->ComputeDivergence,
this->ComputeVorticity,
this->ComputeQCriterion,
this->Gradient,
this->Divergence,
this->Vorticity,
this->QCriterion,
size);
vtkm::exec::GradientOutput<T> portal(this->StoreGradient,
this->ComputeDivergence,
this->ComputeVorticity,
this->ComputeQCriterion,
this->Gradient,
this->Divergence,
this->Vorticity,
this->QCriterion,
size);
return portal;
}

@ -37,9 +37,8 @@ namespace vtkm
{
namespace exec
{
template <typename T, typename DeviceAdapter>
struct GradientScalarOutput : public vtkm::cont::ExecutionObjectBase
struct GradientScalarOutputExecutionObject
{
using ValueType = vtkm::Vec<T, 3>;
using BaseTType = typename vtkm::BaseComponent<T>::Type;
@ -51,17 +50,9 @@ struct GradientScalarOutput : public vtkm::cont::ExecutionObjectBase
using Portal = typename ExecutionTypes::Portal;
};
GradientScalarOutput() = default;
GradientScalarOutputExecutionObject() = default;
GradientScalarOutput(bool,
bool,
bool,
bool,
vtkm::cont::ArrayHandle<ValueType>& gradient,
vtkm::cont::ArrayHandle<BaseTType>&,
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>>&,
vtkm::cont::ArrayHandle<BaseTType>&,
vtkm::Id size)
GradientScalarOutputExecutionObject(vtkm::cont::ArrayHandle<ValueType> gradient, vtkm::Id size)
{
this->GradientPortal = gradient.PrepareForOutput(size, DeviceAdapter());
}
@ -76,8 +67,40 @@ struct GradientScalarOutput : public vtkm::cont::ExecutionObjectBase
typename PortalTypes::Portal GradientPortal;
};
template <typename T>
struct GradientScalarOutput : public vtkm::cont::ExecutionObjectBase
{
using ValueType = vtkm::Vec<T, 3>;
using BaseTType = typename vtkm::BaseComponent<T>::Type;
template <typename Device>
VTKM_CONT vtkm::exec::GradientScalarOutputExecutionObject<T, Device> PrepareForExecution(
Device) const
{
return vtkm::exec::GradientScalarOutputExecutionObject<T, Device>(this->Gradient, this->Size);
}
GradientScalarOutput() = default;
GradientScalarOutput(bool,
bool,
bool,
bool,
vtkm::cont::ArrayHandle<ValueType>& gradient,
vtkm::cont::ArrayHandle<BaseTType>&,
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>>&,
vtkm::cont::ArrayHandle<BaseTType>&,
vtkm::Id size)
: Size(size)
, Gradient(gradient)
{
}
vtkm::Id Size;
vtkm::cont::ArrayHandle<ValueType> Gradient;
};
template <typename T, typename DeviceAdapter>
struct GradientVecOutput : public vtkm::cont::ExecutionObjectBase
struct GradientVecOutputExecutionObject
{
using ValueType = vtkm::Vec<T, 3>;
using BaseTType = typename vtkm::BaseComponent<T>::Type;
@ -90,17 +113,17 @@ struct GradientVecOutput : public vtkm::cont::ExecutionObjectBase
using Portal = typename ExecutionTypes::Portal;
};
GradientVecOutput() = default;
GradientVecOutputExecutionObject() = default;
GradientVecOutput(bool g,
bool d,
bool v,
bool q,
vtkm::cont::ArrayHandle<ValueType>& gradient,
vtkm::cont::ArrayHandle<BaseTType>& divergence,
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>>& vorticity,
vtkm::cont::ArrayHandle<BaseTType>& qcriterion,
vtkm::Id size)
GradientVecOutputExecutionObject(bool g,
bool d,
bool v,
bool q,
vtkm::cont::ArrayHandle<ValueType> gradient,
vtkm::cont::ArrayHandle<BaseTType> divergence,
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>> vorticity,
vtkm::cont::ArrayHandle<BaseTType> qcriterion,
vtkm::Id size)
{
this->SetGradient = g;
this->SetDivergence = d;
@ -168,24 +191,79 @@ struct GradientVecOutput : public vtkm::cont::ExecutionObjectBase
typename PortalTypes<BaseTType>::Portal QCriterionPortal;
};
template <typename T, typename DeviceAdapter>
struct GradientOutput : public GradientScalarOutput<T, DeviceAdapter>
template <typename T>
struct GradientVecOutput : public vtkm::cont::ExecutionObjectBase
{
using GradientScalarOutput<T, DeviceAdapter>::GradientScalarOutput;
using ValueType = vtkm::Vec<T, 3>;
using BaseTType = typename vtkm::BaseComponent<T>::Type;
template <typename Device>
VTKM_CONT vtkm::exec::GradientVecOutputExecutionObject<T, Device> PrepareForExecution(
Device) const
{
return vtkm::exec::GradientVecOutputExecutionObject<T, Device>(this->G,
this->D,
this->V,
this->Q,
this->Gradient,
this->Divergence,
this->Vorticity,
this->Qcriterion,
this->Size);
}
GradientVecOutput() = default;
GradientVecOutput(bool g,
bool d,
bool v,
bool q,
vtkm::cont::ArrayHandle<ValueType>& gradient,
vtkm::cont::ArrayHandle<BaseTType>& divergence,
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>>& vorticity,
vtkm::cont::ArrayHandle<BaseTType>& qcriterion,
vtkm::Id size)
{
this->G = g;
this->D = d;
this->V = v;
this->Q = q;
this->Gradient = gradient;
this->Divergence = divergence;
this->Vorticity = vorticity;
this->Qcriterion = qcriterion;
this->Size = size;
}
bool G;
bool D;
bool V;
bool Q;
vtkm::cont::ArrayHandle<ValueType> Gradient;
vtkm::cont::ArrayHandle<BaseTType> Divergence;
vtkm::cont::ArrayHandle<vtkm::Vec<BaseTType, 3>> Vorticity;
vtkm::cont::ArrayHandle<BaseTType> Qcriterion;
vtkm::Id Size;
};
template <typename DeviceAdapter>
struct GradientOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>
: public GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>
template <typename T>
struct GradientOutput : public GradientScalarOutput<T>
{
using GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>, DeviceAdapter>::GradientVecOutput;
using GradientScalarOutput<T>::GradientScalarOutput;
};
template <typename DeviceAdapter>
struct GradientOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>
: public GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>
template <>
struct GradientOutput<vtkm::Vec<vtkm::Float32, 3>>
: public GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>>
{
using GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>, DeviceAdapter>::GradientVecOutput;
using GradientVecOutput<vtkm::Vec<vtkm::Float32, 3>>::GradientVecOutput;
};
template <>
struct GradientOutput<vtkm::Vec<vtkm::Float64, 3>>
: public GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>>
{
using GradientVecOutput<vtkm::Vec<vtkm::Float64, 3>>::GradientVecOutput;
};
}
} // namespace vtkm::exec
@ -210,7 +288,9 @@ struct TransportTagGradientOut
template <typename ContObjectType, typename Device>
struct Transport<vtkm::cont::arg::TransportTagGradientOut, ContObjectType, Device>
{
using ExecObjectType = vtkm::exec::GradientOutput<typename ContObjectType::ValueType, Device>;
using ExecObjectFacotryType = vtkm::exec::GradientOutput<typename ContObjectType::ValueType>;
using ExecObjectType =
decltype(std::declval<ExecObjectFacotryType>().PrepareForExecution(Device()));
template <typename InputDomainType>
VTKM_CONT ExecObjectType operator()(ContObjectType object,
@ -218,7 +298,8 @@ struct Transport<vtkm::cont::arg::TransportTagGradientOut, ContObjectType, Devic
vtkm::Id vtkmNotUsed(inputRange),
vtkm::Id outputRange) const
{
return object.PrepareForOutput(outputRange, Device());
ExecObjectFacotryType ExecutionObjectFacotry = object.PrepareForOutput(outputRange);
return ExecutionObjectFacotry.PrepareForExecution(Device());
}
};
}