Particle Status Changes

-Adding comprehensive status tracking for particles
-Updating old code to support reading and updating status
 according to new the ParticleStatusClass.
This commit is contained in:
Yenpure 2017-07-13 13:59:31 -04:00
parent 644a385fb6
commit 98babb5dc6
3 changed files with 47 additions and 33 deletions

@ -31,6 +31,7 @@
#include <vtkm/exec/ExecutionObjectBase.h>
#include <vtkm/worklet/DispatcherMapField.h>
#include <vtkm/worklet/particleadvection/ParticleStatus.h>
#include <vtkm/worklet/particleadvection/Particles.h>
namespace vtkm
@ -67,7 +68,7 @@ public:
}
else
{
ic.SetStatusOutOfBounds(idx);
ic.SetStatusOutOfSpatialBounds(idx);
}
}
}
@ -129,10 +130,10 @@ private:
else
numSeeds = ParticlesPerRound;
std::vector<vtkm::Id> steps(static_cast<size_t>(numSeeds), 0),
status(static_cast<size_t>(numSeeds), ParticleStatus::OK);
std::vector<vtkm::Id> steps((size_t)numSeeds, 0);
std::vector<ParticleStatus> status((size_t)numSeeds, ParticleStatus());
vtkm::cont::ArrayHandle<vtkm::Id> stepArray = vtkm::cont::make_ArrayHandle(&steps[0], numSeeds);
vtkm::cont::ArrayHandle<vtkm::Id> statusArray =
vtkm::cont::ArrayHandle<ParticleStatus> statusArray =
vtkm::cont::make_ArrayHandle(&status[0], numSeeds);
vtkm::cont::ArrayHandleIndex idxArray(numSeeds);
@ -229,9 +230,10 @@ private:
if (NeedParticleRounds && num > ParticlesPerRound)
num = ParticlesPerRound;
std::vector<vtkm::Id> steps((size_t)num, 0), status((size_t)num, ParticleStatus::OK);
std::vector<vtkm::Id> steps((size_t)num, 0);
std::vector<ParticleStatus> status((size_t)num, ParticleStatus());
vtkm::cont::ArrayHandle<vtkm::Id> stepArray = vtkm::cont::make_ArrayHandle(&steps[0], num);
vtkm::cont::ArrayHandle<vtkm::Id> statusArray =
vtkm::cont::ArrayHandle<ParticleStatus> statusArray =
vtkm::cont::make_ArrayHandle(&status[0], num);
vtkm::cont::ArrayHandleIndex idxArray(num);
@ -269,9 +271,10 @@ private:
if (NeedParticleRounds && num > ParticlesPerRound)
num = ParticlesPerRound;
std::vector<vtkm::Id> steps((size_t)num, 0), status((size_t)num, ParticleStatus::OK);
std::vector<vtkm::Id> steps((size_t)num, 0);
std::vector<ParticleStatus> status((size_t)num, ParticleStatus());
vtkm::cont::ArrayHandle<vtkm::Id> stepArray = vtkm::cont::make_ArrayHandle(&steps[0], num);
vtkm::cont::ArrayHandle<vtkm::Id> statusArray =
vtkm::cont::ArrayHandle<ParticleStatus> statusArray =
vtkm::cont::make_ArrayHandle(&status[0], num);
vtkm::cont::ArrayHandleIndex idxArray(num);

@ -53,7 +53,7 @@ public:
}
bool Terminated() const
{
return (Error() || Terminated() || ExitedSpatialBoundary() || ExitedTemporalBoundary());
return (CheckBit(TERMINATED) || Error() || ExitedSpatialBoundary() || ExitedTemporalBoundary());
}
bool Integrateable() const
{

@ -24,6 +24,7 @@
#include <vtkm/Types.h>
#include <vtkm/cont/DeviceAdapter.h>
#include <vtkm/exec/ExecutionObjectBase.h>
#include <vtkm/worklet/particleadvection/ParticleStatus.h>
namespace vtkm
{
@ -32,12 +33,12 @@ namespace worklet
namespace particleadvection
{
enum ParticleStatus
/*enum ParticleStatus
{
OK = 0,
TERMINATE = 1,
OUT_OF_BOUNDS = 2,
};
};*/
template <typename T, typename DeviceAdapterTag>
class Particles : public vtkm::exec::ExecutionObjectBase
@ -46,6 +47,8 @@ private:
typedef
typename vtkm::cont::ArrayHandle<vtkm::Id>::template ExecutionTypes<DeviceAdapterTag>::Portal
IdPortal;
typedef typename vtkm::cont::ArrayHandle<ParticleStatus>::template ExecutionTypes<
DeviceAdapterTag>::Portal StatusPortal;
typedef typename vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>::template ExecutionTypes<
DeviceAdapterTag>::Portal PosPortal;
@ -71,7 +74,7 @@ public:
VTKM_EXEC_CONT
Particles(const PosPortal& _pos,
const IdPortal& _steps,
const IdPortal& _status,
const StatusPortal& _status,
const vtkm::Id& _maxSteps)
: pos(_pos)
, steps(_steps)
@ -83,7 +86,7 @@ public:
VTKM_EXEC_CONT
Particles(vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>& posArray,
vtkm::cont::ArrayHandle<vtkm::Id>& stepsArray,
vtkm::cont::ArrayHandle<vtkm::Id>& statusArray,
vtkm::cont::ArrayHandle<ParticleStatus>& statusArray,
const vtkm::Id& _maxSteps)
: maxSteps(_maxSteps)
{
@ -104,12 +107,12 @@ public:
}
VTKM_EXEC_CONT
void SetStatusTerminate(const vtkm::Id& idx) { status.Set(idx, TERMINATE); }
void SetStatusTerminate(const vtkm::Id& idx) { status.Get(idx).SetTerminated(); }
VTKM_EXEC_CONT
void SetStatusOutOfBounds(const vtkm::Id& idx) { status.Set(idx, OUT_OF_BOUNDS); }
void SetStatusOutOfSpatialBounds(const vtkm::Id& idx) { status.Get(idx).ExitedSpatialBoundary(); }
VTKM_EXEC_CONT
bool Done(const vtkm::Id& idx) { return status.Get(idx) != OK; }
bool Done(const vtkm::Id& idx) { return !(status.Get(idx).Integrateable()); }
VTKM_EXEC_CONT
vtkm::Vec<T, 3> GetPos(const vtkm::Id& idx) const { return pos.Get(idx); }
@ -120,7 +123,8 @@ public:
private:
PosPortal pos;
IdPortal steps, status;
IdPortal steps;
StatusPortal status;
vtkm::Id maxSteps;
};
@ -131,6 +135,8 @@ private:
typedef
typename vtkm::cont::ArrayHandle<vtkm::Id>::template ExecutionTypes<DeviceAdapterTag>::Portal
IdPortal;
typedef typename vtkm::cont::ArrayHandle<ParticleStatus>::template ExecutionTypes<
DeviceAdapterTag>::Portal StatusPortal;
typedef typename vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>::template ExecutionTypes<
DeviceAdapterTag>::Portal PosPortal;
@ -160,7 +166,7 @@ public:
VTKM_EXEC_CONT
StateRecordingParticles(const PosPortal& _pos,
const IdPortal& _steps,
const IdPortal& _status,
const StatusPortal& _status,
const vtkm::Id& _maxSteps)
: pos(_pos)
, steps(_steps)
@ -174,7 +180,7 @@ public:
VTKM_EXEC_CONT
StateRecordingParticles(vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>& posArray,
vtkm::cont::ArrayHandle<vtkm::Id>& stepsArray,
vtkm::cont::ArrayHandle<vtkm::Id>& statusArray,
vtkm::cont::ArrayHandle<ParticleStatus>& statusArray,
const vtkm::Id& _maxSteps)
: maxSteps(_maxSteps)
, histSize(_maxSteps)
@ -189,7 +195,7 @@ public:
VTKM_EXEC_CONT
StateRecordingParticles(vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>& posArray,
vtkm::cont::ArrayHandle<vtkm::Id>& stepsArray,
vtkm::cont::ArrayHandle<vtkm::Id>& statusArray,
vtkm::cont::ArrayHandle<ParticleStatus>& statusArray,
const vtkm::Id& _maxSteps,
vtkm::Id& _histSize)
: maxSteps(_maxSteps)
@ -215,12 +221,12 @@ public:
}
VTKM_EXEC_CONT
void SetStatusTerminate(const vtkm::Id& idx) { status.Set(idx, TERMINATE); }
void SetStatusTerminate(const vtkm::Id& idx) { status.Get(idx).SetTerminated(); }
VTKM_EXEC_CONT
void SetStatusOutOfBounds(const vtkm::Id& idx) { status.Set(idx, OUT_OF_BOUNDS); }
void SetStatusOutOfSpatialBounds(const vtkm::Id& idx) { status.Get(idx).ExitedSpatialBoundary(); }
VTKM_EXEC_CONT
bool Done(const vtkm::Id& idx) { return status.Get(idx) != OK; }
bool Done(const vtkm::Id& idx) { return !(status.Get(idx).Integrateable()); }
VTKM_EXEC_CONT
vtkm::Vec<T, 3> GetPos(const vtkm::Id& idx) const { return pos.Get(idx); }
@ -236,7 +242,8 @@ public:
private:
PosPortal pos;
IdPortal steps, status;
IdPortal steps;
StatusPortal status;
vtkm::Id maxSteps, numPos, histSize;
PosPortal history;
@ -253,6 +260,8 @@ private:
typedef
typename vtkm::cont::ArrayHandle<vtkm::Id>::template ExecutionTypes<DeviceAdapterTag>::Portal
IdPortal;
typedef typename vtkm::cont::ArrayHandle<ParticleStatus>::template ExecutionTypes<
DeviceAdapterTag>::Portal StatusPortal;
typedef typename vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>::template ExecutionTypes<
DeviceAdapterTag>::Portal PosPortal;
@ -285,7 +294,7 @@ public:
VTKM_EXEC_CONT
StateRecordingParticlesRound(const PosPortal& _pos,
const IdPortal& _steps,
const IdPortal& _status,
const StatusPortal& _status,
const vtkm::Id& _maxSteps,
const vtkm::Id& _histSize,
const vtkm::Id& _offset,
@ -303,7 +312,7 @@ public:
VTKM_EXEC_CONT
StateRecordingParticlesRound(vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>>& posArray,
vtkm::cont::ArrayHandle<vtkm::Id>& stepsArray,
vtkm::cont::ArrayHandle<vtkm::Id>& statusArray,
vtkm::cont::ArrayHandle<ParticleStatus>& statusArray,
const vtkm::Id& _maxSteps,
const vtkm::Id& _histSize,
const vtkm::Id& _offset,
@ -334,15 +343,15 @@ public:
}
VTKM_EXEC_CONT
void SetStatusTerminate(const vtkm::Id& idx) { status.Set(idx, TERMINATE); }
void SetStatusTerminate(const vtkm::Id& idx) { status.Get(idx).SetTerminated(); }
VTKM_EXEC_CONT
void SetStatusOutOfBounds(const vtkm::Id& idx) { status.Set(idx, OUT_OF_BOUNDS); }
void SetStatusOutOfSpatialBounds(const vtkm::Id& idx) { status.Get(idx).ExitedSpatialBoundary(); }
VTKM_EXEC_CONT
bool Done(const vtkm::Id& idx)
{
vtkm::Id nSteps = steps.Get(idx);
return (nSteps - offset == histSize) || status.Get(idx) != OK;
return (nSteps - offset == histSize) || !(status.Get(idx).Integrateable());
}
VTKM_EXEC_CONT
@ -359,16 +368,18 @@ public:
private:
PosPortal pos;
IdPortal steps, status;
IdPortal steps;
StatusPortal status;
vtkm::Id maxSteps, numPos, histSize, offset, totalMaxSteps;
PosPortal history;
public:
vtkm::cont::ArrayHandle<vtkm::Vec<T, 3>> historyArray;
};
}
}
}
} //namespace particleadvection
} //namespace worklet
} //namespace vtkm
#endif // vtk_m_worklet_particleadvection_Particles_h