Basic Example
Coming Soon
template <typename NumericType, int D>
class Particle : public rayParticle<Particle<NumericType, D>, NumericType> {
public:
Particle(const NumericType passedSticking,
const NumericType passedSourcePower)
: stickingProbability(passedSticking), sourcePower(passedSourcePower) {}
void surfaceCollision(NumericType rayWeight,
const rayTriple<NumericType> &rayDir,
const rayTriple<NumericType> &geomNormal,
const unsigned int primID, const int materialId,
rayTracingData<NumericType> &localData,
const rayTracingData<NumericType> *globalData,
rayRNG &Rng) override final {
// accumulated flux at surface point
localData.getVectorData(0)[primID] += rayWeight;
}
std::pair<NumericType, rayTriple<NumericType>>
surfaceReflection(NumericType rayWeight, const rayTriple<NumericType> &rayDir,
const rayTriple<NumericType> &geomNormal,
const unsigned int primID, const int materialId,
const rayTracingData<NumericType> *globalData,
rayRNG &Rng) override final {
// diffuse reflections with given sticking probability
auto direction = rayReflectionDiffuse<NumericType, D>(geomNormal, Rng);
return std::pair<NumericType, rayTriple<NumericType>>{stickingProbability,
direction};
}
void initNew(rayRNG &RNG) override final {}
NumericType getSourceDistributionPower() const override final {
return sourcePower;
}
std::vector<std::string> getLocalDataLabels() const override final {
return {"particleFlux"};
}
private:
const NumericType stickingProbability;
const NumericType sourcePower;
};