Allocate the scatter arrays to be proper length.

The previous code would over allocate all the scatter arrays since
it was computing the output range, than using that as the input range.
This commit is contained in:
Robert Maynard 2016-03-15 13:13:34 -04:00
parent e9040745e0
commit 40896e2bab

@ -445,6 +445,7 @@ protected:
{ {
this->InvokeTransportParameters( this->InvokeTransportParameters(
invocation, invocation,
numInstances,
this->Worklet.GetScatter().GetOutputRange(numInstances), this->Worklet.GetScatter().GetOutputRange(numInstances),
device); device);
} }
@ -469,6 +470,7 @@ protected:
{ {
this->InvokeTransportParameters( this->InvokeTransportParameters(
invocation, invocation,
dimensions,
this->Worklet.GetScatter().GetOutputRange(dimensions), this->Worklet.GetScatter().GetOutputRange(dimensions),
device); device);
} }
@ -480,10 +482,11 @@ private:
DispatcherBase(const MyType &); DispatcherBase(const MyType &);
void operator=(const MyType &); void operator=(const MyType &);
template<typename Invocation, typename RangeType, typename DeviceAdapter> template<typename Invocation, typename InputRangeType, typename OutputRangeType, typename DeviceAdapter>
VTKM_CONT_EXPORT VTKM_CONT_EXPORT
void InvokeTransportParameters(const Invocation &invocation, void InvokeTransportParameters(const Invocation &invocation,
RangeType range, const InputRangeType& inputRange,
const OutputRangeType& outputRange,
DeviceAdapter device) const DeviceAdapter device) const
{ {
// The first step in invoking a worklet is to transport the arguments to // The first step in invoking a worklet is to transport the arguments to
@ -504,13 +507,13 @@ private:
TransportFunctorType>::type ExecObjectParameters; TransportFunctorType>::type ExecObjectParameters;
ExecObjectParameters execObjectParameters = ExecObjectParameters execObjectParameters =
parameters.StaticTransformCont(TransportFunctorType(range)); parameters.StaticTransformCont(TransportFunctorType(outputRange));
// Get the arrays used for scattering input to output. // Get the arrays used for scattering input to output.
typename WorkletType::ScatterType::OutputToInputMapType outputToInputMap = typename WorkletType::ScatterType::OutputToInputMapType outputToInputMap =
this->Worklet.GetScatter().GetOutputToInputMap(range); this->Worklet.GetScatter().GetOutputToInputMap(inputRange);
typename WorkletType::ScatterType::VisitArrayType visitArray = typename WorkletType::ScatterType::VisitArrayType visitArray =
this->Worklet.GetScatter().GetVisitArray(range); this->Worklet.GetScatter().GetVisitArray(inputRange);
// Replace the parameters in the invocation with the execution object and // Replace the parameters in the invocation with the execution object and
// pass to next step of Invoke. Also add the scatter information. // pass to next step of Invoke. Also add the scatter information.
@ -519,7 +522,7 @@ private:
.ChangeParameters(execObjectParameters) .ChangeParameters(execObjectParameters)
.ChangeOutputToInputMap(outputToInputMap.PrepareForInput(device)) .ChangeOutputToInputMap(outputToInputMap.PrepareForInput(device))
.ChangeVisitArray(visitArray.PrepareForInput(device)), .ChangeVisitArray(visitArray.PrepareForInput(device)),
range, outputRange,
device); device);
} }