#ifndef __COSMOTOOL_SPH_SMOOTH_HPP #define __COSMOTOOL_SPH_SMOOTH_HPP #include "config.hpp" #include "mykdtree.hpp" namespace CosmoTool { template class SPHSmooth { public: typedef struct { ComputePrecision weight; ValType pValue; } FullType; typedef KDTree SPHTree; typedef KDTreeNode SPHNode; typedef KDCell SPHCell; typedef typename KDTree::CoordType CoordType; typedef ComputePrecision (*computeParticleValue)(const ValType& t); typedef void (*runParticleValue)(ValType& t); public: SPHSmooth(SPHTree *tree, uint32_t Nsph, uint32_t deltaN); virtual ~SPHSmooth(); void fetchNeighbours(const typename SPHTree::coords& c); void fetchNeighboursOnVolume(const typename SPHTree::coords& c, ComputePrecision radius); const typename SPHTree::coords& getCurrentCenter() const { return currentCenter; } ComputePrecision computeSmoothedValue(const typename SPHTree::coords& c, computeParticleValue fun); ComputePrecision computeInterpolatedValue(const typename SPHTree::coords& c, computeParticleValue fun); ComputePrecision getMaxDistance(const typename SPHTree::coords& c, SPHNode *node) const; ComputePrecision getSmoothingLen() const { return smoothRadius; } // TO USE WITH EXTREME CARE ! void setSmoothingLen(ComputePrecision len) { smoothRadius = len; } // END void runForEachNeighbour(runParticleValue fun); void addGridSite(const typename SPHTree::coords& c); bool hasNeighbours() const; virtual ComputePrecision getKernel(ComputePrecision d) const; SPHTree *getTree() { return tree; } protected: SPHCell **ngb; CoordType *distances; uint32_t Nsph; uint32_t deltaNsph; uint32_t maxNgb; uint32_t currentNgb; SPHTree *tree; ComputePrecision smoothRadius; typename SPHTree::coords currentCenter; ComputePrecision computeWValue(const typename SPHTree::coords & c, SPHCell& cell, CoordType d, computeParticleValue fun); void runUnrollNode(SPHNode *node, runParticleValue fun); }; template bool operator<(const SPHSmooth& s1, const SPHSmooth& s2); }; #include "sphSmooth.tcc" #endif