2009-03-08 21:01:12 +01:00
|
|
|
#ifndef __COSMO_DINTERPOLATE_HPP
|
|
|
|
#define __COSMO_DINTERPOLATE_HPP
|
|
|
|
|
|
|
|
#include "config.hpp"
|
|
|
|
#include "mykdtree.hpp"
|
2012-06-08 15:49:22 +02:00
|
|
|
#include "kdtree_splitters.hpp"
|
2009-03-08 21:01:12 +01:00
|
|
|
#include <gsl/gsl_eigen.h>
|
|
|
|
|
|
|
|
namespace CosmoTool {
|
|
|
|
|
|
|
|
template<typename PType, typename IType, int N>
|
|
|
|
class DelaunayInterpolate {
|
|
|
|
public:
|
|
|
|
struct SimplexAccess {
|
|
|
|
int32_t *simplex_list;
|
|
|
|
};
|
|
|
|
|
2012-06-08 15:49:22 +02:00
|
|
|
typedef KDTree<N, SimplexAccess, PType, KD_homogeneous_cell_splitter<N, SimplexAccess> > QuickTree;
|
2009-03-08 21:01:12 +01:00
|
|
|
typedef typename QuickTree::Cell QuickCell;
|
|
|
|
typedef PType CoordType[N];
|
|
|
|
|
|
|
|
QuickTree *quickAccess;
|
|
|
|
QuickCell *cells;
|
|
|
|
PType *all_preweight;
|
|
|
|
int32_t *point_to_simplex_list_base;
|
|
|
|
IType *values;
|
|
|
|
CoordType *positions;
|
|
|
|
uint32_t numPoints;
|
|
|
|
uint32_t numSimplex;
|
|
|
|
uint32_t *simplex_list;
|
|
|
|
gsl_eigen_symmv_workspace *eigen_work;
|
2012-10-30 18:58:46 +01:00
|
|
|
bool *disable_simplex;
|
2009-03-08 21:01:12 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This construct the interpolator. The construction is time consuming so
|
|
|
|
* please do it the less possible number of times, especially if you have
|
|
|
|
* a large number of points.
|
|
|
|
*
|
|
|
|
* @param positions list of the positions
|
|
|
|
* @param values list of the values taken at each position
|
|
|
|
* @param simplex_list list of points for each simplex. The packing
|
|
|
|
* is the following:
|
|
|
|
* [t(0,1),t(0,2),...,t(0,n+1),t(1,0),t(1,1),...,t(1,n+1),..],
|
|
|
|
* with t(i,j) the i-th simplex and j-th point of the simplex. The indexes
|
|
|
|
* refer to the previous list of points.
|
|
|
|
* @param numPoints the number of points
|
|
|
|
*/
|
|
|
|
DelaunayInterpolate(CoordType *positions, IType *values, uint32_t *simplex_list,
|
|
|
|
uint32_t numPoints, uint32_t numSimplex)
|
2009-03-09 06:05:15 +01:00
|
|
|
throw (InvalidArgumentException)
|
2009-03-08 21:01:12 +01:00
|
|
|
{
|
|
|
|
this->positions = positions;
|
|
|
|
this->values = values;
|
|
|
|
this->simplex_list = simplex_list;
|
|
|
|
this->numPoints = numPoints;
|
|
|
|
this->numSimplex = numSimplex;
|
2012-10-30 18:58:46 +01:00
|
|
|
this->disable_simplex = new bool[numSimplex];
|
2009-03-08 21:01:12 +01:00
|
|
|
|
|
|
|
buildPreweight();
|
|
|
|
buildQuickAccess();
|
|
|
|
|
|
|
|
eigen_work = gsl_eigen_symmv_alloc(N);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
~DelaunayInterpolate()
|
|
|
|
{
|
|
|
|
delete[] cells;
|
|
|
|
delete quickAccess;
|
|
|
|
delete[] point_to_simplex_list_base;
|
|
|
|
delete[] all_preweight;
|
2012-10-30 18:58:46 +01:00
|
|
|
delete[] disable_simplex;
|
2009-03-08 21:01:12 +01:00
|
|
|
|
|
|
|
gsl_eigen_symmv_free(eigen_work);
|
|
|
|
}
|
|
|
|
|
2009-03-09 06:05:15 +01:00
|
|
|
void buildPreweight()
|
|
|
|
throw (InvalidArgumentException);
|
2009-03-08 21:01:12 +01:00
|
|
|
void buildQuickAccess();
|
|
|
|
void buildHyperplane(const PType *v, CoordType& hyper);
|
|
|
|
|
|
|
|
bool checkPointInSimplex(const CoordType& pos, uint32_t simplex);
|
|
|
|
|
|
|
|
uint32_t findSimplex(const CoordType& pos)
|
|
|
|
throw (InvalidArgumentException);
|
|
|
|
|
|
|
|
IType computeValue(const CoordType& pos)
|
|
|
|
throw (InvalidArgumentException);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
#include "dinterpolate.tcc"
|
|
|
|
|
|
|
|
#endif
|