41 #ifndef MULTI_GRID_OCTREE_DATA_INCLUDED
42 #define MULTI_GRID_OCTREE_DATA_INCLUDED
45 #define NEW_NEW_CODE 0
48 #define WEIGHT_DEGREE 2
49 #define NORMAL_DEGREE 2
52 #define MAX_MEMORY_GB 0
54 #define GRADIENT_DOMAIN_SOLUTION 1
87 #define FORCE_NEUMANN_FIELD 1
90 #if !FORCE_NEUMANN_FIELD
91 #pragma message( "[WARNING] Not zeroing out normal component on boundary" )
146 int end(
int depth ,
int slice )
const{
if(depth<0||depth>=
_levels||slice<0||slice>=(1<<depth)) printf(
"uh oh\n" ) ;
return _sliceStart[depth][slice+1]; }
157 template<
int Indices >
221 template<
int Degree >
222 struct PointSupportKey :
public OctNode< TreeNodeData >::NeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart >
228 template<
int Degree >
229 struct ConstPointSupportKey :
public OctNode< TreeNodeData >::ConstNeighborKey< BSplineEvaluationData< Degree >::SupportEnd , -BSplineEvaluationData< Degree >::SupportStart >
236 template<
class Real >
244 template<
class Data ,
int Degree >
249 template<
class TreeNodeData >
252 int index(
int nodeIndex )
const {
return ( nodeIndex<0 || nodeIndex>=(
int)
indices.size() ) ? -1 :
indices[ nodeIndex ]; }
257 std::vector< int > temp =
indices;
259 for(
size_t i=0 ; i<map.size() ; i++ )
260 if( map[i]<(
int)temp.size() )
indices[i] = temp[ map[i] ];
264 template<
class Data ,
int Degree >
277 template<
int Degree1 ,
int Degree2 >
285 static double GetLaplacian (
const typename FunctionIntegrator:: Integrator& integrator ,
const int off1[3] ,
const int off2[3] );
303 template<
class Real >
319 operator V (){
return w!=0 ?
v/
w :
v*
w; }
355 return ( x>=begin && x<end && y>=begin && y<end && z>=begin && z<end );
361 if( !node )
return false;
364 return _IsInteriorlySupported< FEMDegree >( d , off[0] , off[1] , off[2] );
372 return ( x>=begin && x<end && y>=begin && y<end && z>=begin && z<end );
378 if( !node )
return false;
381 return _IsInteriorlyOverlapped< FEMDegree1 , FEMDegree2 >( d , off[0] , off[1] , off[2] );
389 if( d>=0 )
width = Real( 1.0 / (1<< d ) );
390 else width = Real( 1.0 * (1<<(-d)) );
391 for(
int dd=0 ; dd<
DIMENSION ; dd++ ) start[dd] = Real( off[dd] ) *
width;
397 width = Real( 1.0 / (1<<d) );
398 for(
int dd=0 ; dd<
DIMENSION ; dd++ ) center[dd] = Real( off[dd] + 0.5 ) *
width;
400 template<
int LeftRadius ,
int RightRadius >
401 static typename TreeOctNode::ConstNeighbors< LeftRadius + RightRadius + 1 >&
_Neighbors( TreeOctNode::ConstNeighborKey< LeftRadius , RightRadius >& key ,
int depth ){
return key.neighbors[ depth + 1 ]; }
402 template<
int LeftRadius ,
int RightRadius >
403 static typename TreeOctNode::Neighbors< LeftRadius + RightRadius + 1 >&
_Neighbors( TreeOctNode::NeighborKey< LeftRadius , RightRadius >& key ,
int depth ){
return key.neighbors[ depth + 1 ]; }
404 template<
int LeftRadius ,
int RightRadius >
405 static const typename TreeOctNode::template Neighbors< LeftRadius + RightRadius + 1 >&
_Neighbors(
const typename TreeOctNode::template NeighborKey< LeftRadius , RightRadius >& key ,
int depth ){
return key.neighbors[ depth + 1 ]; }
406 template<
int LeftRadius ,
int RightRadius >
407 static const typename TreeOctNode::template ConstNeighbors< LeftRadius + RightRadius + 1 >&
_Neighbors(
const typename TreeOctNode::template ConstNeighborKey< LeftRadius , RightRadius >& key ,
int depth ){
return key.neighbors[ depth + 1 ]; }
416 template<
int FEMDegree >
418 template<
int FEMDegree >
419 int _SolveSystemGS(
const BSplineData< FEMDegree >& bsData ,
SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
int depth ,
DenseNodeData< Real , FEMDegree >& solution ,
DenseNodeData< Real , FEMDegree >& constraints ,
DenseNodeData< Real , FEMDegree >& metSolutionConstraints ,
int iters ,
bool coarseToFine ,
bool showResidual=
false ,
double* bNorm2=
NULL ,
double* inRNorm2=
NULL ,
double* outRNorm2=
NULL ,
bool forceSilent=
false );
420 template<
int FEMDegree >
421 int _SolveSystemCG(
const BSplineData< FEMDegree >& bsData ,
SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
int depth ,
DenseNodeData< Real , FEMDegree >& solution ,
DenseNodeData< Real , FEMDegree >& constraints ,
DenseNodeData< Real , FEMDegree >& metSolutionConstraints ,
int iters ,
bool coarseToFine ,
bool showResidual=
false ,
double* bNorm2=
NULL ,
double* inRNorm2=
NULL ,
double* outRNorm2=
NULL ,
double accuracy=0 );
422 template<
int FEMDegree >
423 int _SetMatrixRow(
const SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
const typename TreeOctNode::Neighbors<
BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ,
Pointer(
MatrixEntry< Real > ) row ,
int offset ,
const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator ,
const Stencil<
double ,
BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil ,
const BSplineData< FEMDegree >& bsData )
const;
424 template<
int FEMDegree >
427 template<
int FEMDegree1 ,
int FEMDegree2 >
static void _SetParentOverlapBounds(
const TreeOctNode* node ,
int& startX ,
int& endX ,
int& startY ,
int& endY ,
int& startZ ,
int& endZ );
428 template<
int FEMDegree >
429 void _UpdateConstraintsFromCoarser(
const SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
const typename TreeOctNode::Neighbors<
BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& neighbors ,
const typename TreeOctNode::Neighbors<
BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& pNeighbors ,
TreeOctNode* node ,
DenseNodeData< Real , FEMDegree >& constraints ,
const DenseNodeData< Real , FEMDegree >& metSolution ,
const typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator ,
const Stencil<
double ,
BSplineIntegrationData< FEMDegree , FEMDegree >::OverlapSize >& stencil ,
const BSplineData< FEMDegree >& bsData )
const;
431 template<
int FEMDegree >
434 template<
int FEMDegree >
437 template<
int FEMDegree >
439 template<
int FEMDegree >
441 template<
int FEMDegree >
443 template<
int FEMDegree >
444 int _GetSliceMatrixAndUpdateConstraints(
const SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
SparseMatrix< Real >& matrix ,
DenseNodeData< Real , FEMDegree >& constraints ,
typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator ,
typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator ,
const BSplineData< FEMDegree >& bsData ,
int depth ,
int slice ,
const DenseNodeData< Real , FEMDegree >& metSolution ,
bool coarseToFine );
445 template<
int FEMDegree >
446 int _GetMatrixAndUpdateConstraints(
const SparseNodeData<
PointData< Real > , 0 >& pointInfo ,
SparseMatrix< Real >& matrix ,
DenseNodeData< Real , FEMDegree >& constraints ,
typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::Integrator& integrator ,
typename BSplineIntegrationData< FEMDegree , FEMDegree >::FunctionIntegrator::ChildIntegrator& childIntegrator ,
const BSplineData< FEMDegree >& bsData ,
int depth ,
const DenseNodeData< Real , FEMDegree >* metSolution ,
bool coarseToFine );
458 template<
int WeightDegree >
460 template<
int WeightDegree >
462 template<
int WeightDegree >
464 template<
int WeightDegree >
466 template<
int WeightDegree >
469 template<
int WeightDegree >
471 template<
int WeightDegree >
475 template<
int WeightDegree ,
int DataDegree ,
class V > Real
_SplatPointData(
const SparseNodeData< Real , WeightDegree >& densityWeights ,
Point3D< Real > point , V v ,
SparseNodeData< V , DataDegree >& data ,
PointSupportKey< WeightDegree >& weightKey ,
PointSupportKey< DataDegree >& dataKey ,
int minDepth ,
int maxDepth ,
int dim=
DIMENSION );
476 template<
int WeightDegree ,
int DataDegree ,
class V >
void _MultiSplatPointData(
const SparseNodeData< Real , WeightDegree >* densityWeights ,
Point3D< Real > point , V v ,
SparseNodeData< V , DataDegree >& data ,
PointSupportKey< WeightDegree >& weightKey ,
PointSupportKey< DataDegree >& dataKey ,
int maxDepth ,
int dim=
DIMENSION );
494 template<
int FEMDegree >
516 void set(
int depth ,
bool dirichlet );
518 template<
class V ,
int FEMDegree >
520 template<
class V ,
int FEMDegree >
522 template<
class V ,
int FEMDegree >
525 template<
int FEMDegree >
527 template<
int FEMDegree >
547 template<
class Vertex >
565 template<
class Vertex >
581 template<
class Vertex >
591 template<
class Vertex ,
int FEMDegree >
593 template<
class Vertex ,
int FEMDegree >
594 void SetSliceIsoCorners(
const DenseNodeData< Real , FEMDegree >& solution ,
const DenseNodeData< Real , FEMDegree >& coarseSolution , Real isoValue ,
int depth ,
int slice ,
int z , std::vector<
SlabValues< Vertex > >& sValues ,
const _Evaluator< FEMDegree >& evaluator ,
int threads );
595 template<
int WeightDegree ,
int ColorDegree ,
class Vertex >
596 void SetSliceIsoVertices(
const BSplineData< ColorDegree >* colorBSData ,
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData , Real isoValue ,
int depth ,
int slice ,
int& vOffset ,
CoredMeshData< Vertex >& mesh , std::vector<
SlabValues< Vertex > >& sValues ,
int threads );
597 template<
int WeightDegree ,
int ColorDegree ,
class Vertex >
598 void SetSliceIsoVertices(
const BSplineData< ColorDegree >* colorBSData ,
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData , Real isoValue ,
int depth ,
int slice ,
int z ,
int& vOffset ,
CoredMeshData< Vertex >& mesh , std::vector<
SlabValues< Vertex > >& sValues ,
int threads );
599 template<
int WeightDegree ,
int ColorDegree ,
class Vertex >
600 void SetXSliceIsoVertices(
const BSplineData< ColorDegree >* colorBSData ,
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData , Real isoValue ,
int depth ,
int slab ,
int& vOffset ,
CoredMeshData< Vertex >& mesh , std::vector<
SlabValues< Vertex > >& sValues ,
int threads );
601 template<
class Vertex >
603 template<
class Vertex >
605 template<
class Vertex >
607 template<
class Vertex >
609 template<
class Vertex >
611 template<
class Vertex >
614 template<
class Vertex >
617 template<
class Vertex >
620 template<
int WeightDegree ,
int ColorDegree ,
class Vertex >
621 bool GetIsoVertex(
const BSplineData< ColorDegree >* colorBSData ,
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData , Real isoValue ,
ConstPointSupportKey< WeightDegree >& weightKey ,
ConstPointSupportKey< ColorDegree >& colorKey ,
const TreeOctNode* node ,
int edgeIndex ,
int z ,
const SliceValues< Vertex >& sValues ,
Vertex& vertex );
622 template<
int WeightDegree ,
int ColorDegree ,
class Vertex >
623 bool GetIsoVertex(
const BSplineData< ColorDegree >* colorBSData ,
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData , Real isoValue ,
ConstPointSupportKey< WeightDegree >& weightKey ,
ConstPointSupportKey< ColorDegree >& colorKey ,
const TreeOctNode* node ,
int cornerIndex ,
const SliceValues< Vertex >& bValues ,
const SliceValues< Vertex >& fValues ,
Vertex& vertex );
633 template<
class Po
intReal ,
int NormalDegree ,
int WeightDegree ,
int DataDegree ,
class Data ,
class _Data >
635 Real scaleFactor ,
bool useConfidence ,
bool useNormalWeight ,
636 Real constraintWeight ,
int adaptiveExponent ,
643 template<
int FEMDegree ,
int NormalDegree >
645 template<
int FEMDegree >
648 template<
int FEMDegree ,
int NormalDegree >
650 template<
int FEMDegree ,
int WeightDegree ,
int ColorDegree ,
class Vertex >
651 void GetMCIsoSurface(
const SparseNodeData< Real , WeightDegree >* densityWeights ,
const SparseNodeData<
ProjectiveData<
Point3D< Real > > , ColorDegree >* colorData ,
const DenseNodeData< Real , FEMDegree >& solution , Real isoValue ,
CoredMeshData< Vertex >& mesh ,
bool nonLinearFit=
true ,
bool addBarycenter=
false ,
bool polygonMesh=
false );
658 template<
class Real >
665 #include "MultiGridOctreeData.inl"
666 #include "MultiGridOctreeData.SortedTreeNodes.inl"
667 #include "MultiGridOctreeData.WeightedSamples.inl"
668 #include "MultiGridOctreeData.System.inl"
669 #include "MultiGridOctreeData.IsoSurface.inl"
670 #include "MultiGridOctreeData.Evaluation.inl"
#define DeletePointer(...)
#define ConstPointer(...)
int omp_get_num_procs(void)
int omp_get_thread_num(void)
boost::geometry::model::polygon< point_xy > polygon
static int Dimension(int depth)
static void InteriorSupportedSpan(int depth, int &begin, int &end)
static void InteriorOverlappedSpan(int depth, int &begin, int &end)
static const unsigned int EDGES
static const unsigned int FACES
static const unsigned int CORNERS
size_t leaves(void) const
void depthAndOffset(int &depth, int offset[3]) const
static bool _IsInteriorlySupported(int d, int x, int y, int z)
static void _UpSample(int highDepth, const C *lowCoefficients, C *highCoefficients, bool dirichlet, int threads)
void _DownSample(int highDepth, DenseNodeData< C, FEMDegree > &constraints) const
int _SolveSystemGS(const BSplineData< FEMDegree > &bsData, SparseNodeData< PointData< Real >, 0 > &pointInfo, int depth, DenseNodeData< Real, FEMDegree > &solution, DenseNodeData< Real, FEMDegree > &constraints, DenseNodeData< Real, FEMDegree > &metSolutionConstraints, int iters, bool coarseToFine, bool showResidual=false, double *bNorm2=NULL, double *inRNorm2=NULL, double *outRNorm2=NULL, bool forceSilent=false)
static int _Resolution(int depth)
void _setMultiColorIndices(int start, int end, std::vector< std::vector< int > > &indices) const
void _UpdateConstraintsFromFiner(const typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::ChildIntegrator &childIntegrator, const BSplineData< FEMDegree > &bsData, int highDepth, const DenseNodeData< Real, FEMDegree > &fineSolution, DenseNodeData< Real, FEMDegree > &coarseConstraints) const
void _SetPointConstraintsFromFiner(const SparseNodeData< PointData< Real >, 0 > &pointInfo, int highDepth, const BSplineData< FEMDegree > &bsData, const DenseNodeData< Real, FEMDegree > &finerCoefficients, DenseNodeData< Real, FEMDegree > &metConstraints) const
static bool IsValidNode(const TreeOctNode *node, bool dirichlet)
static void FunctionIndex(const TreeOctNode *node, int idx[3])
static bool _IsInteriorlyOverlapped(const TreeOctNode *node)
static void _DepthAndOffset(const TreeOctNode *node, int &d, int off[3])
static double maxMemoryUsage
void SetXSliceIsoEdges(int depth, int slice, std::vector< SlabValues< Vertex > > &slabValues, int threads)
void GetMCIsoSurface(const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, const DenseNodeData< Real, FEMDegree > &solution, Real isoValue, CoredMeshData< Vertex > &mesh, bool nonLinearFit=true, bool addBarycenter=false, bool polygonMesh=false)
void CopyFinerXSliceIsoEdgeKeys(int depth, int slab, std::vector< SlabValues< Vertex > > &sValues, int threads)
static void _StartAndWidth(const TreeOctNode *node, Point3D< Real > &start, Real &width)
static double MemoryUsage(void)
Real _GetSamplesPerNode(const SparseNodeData< Real, WeightDegree > &densityWeights, const TreeOctNode *node, Point3D< Real > position, ConstPointSupportKey< WeightDegree > &weightKey) const
DenseNodeData< Real, FEMDegree > SetLaplacianConstraints(const SparseNodeData< Point3D< Real >, NormalDegree > &normalInfo)
int SetTree(OrientedPointStream< PointReal > *pointStream, int minDepth, int maxDepth, int fullDepth, int splatDepth, Real samplesPerNode, Real scaleFactor, bool useConfidence, bool useNormalWeight, Real constraintWeight, int adaptiveExponent, SparseNodeData< Real, WeightDegree > &densityWeights, SparseNodeData< PointData< Real >, 0 > &pointInfo, SparseNodeData< Point3D< Real >, NormalDegree > &normalInfo, SparseNodeData< Real, NormalDegree > &nodeWeights, SparseNodeData< ProjectiveData< _Data >, DataDegree > *dataValues, XForm4x4< Real > &xForm, bool dirichlet=false, bool makeComplete=false)
void _setFullDepth(int depth)
int _GetMatrixAndUpdateConstraints(const SparseNodeData< PointData< Real >, 0 > &pointInfo, SparseMatrix< Real > &matrix, DenseNodeData< Real, FEMDegree > &constraints, typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::Integrator &integrator, typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::ChildIntegrator &childIntegrator, const BSplineData< FEMDegree > &bsData, int depth, const DenseNodeData< Real, FEMDegree > *metSolution, bool coarseToFine)
static void _SetFullDepth(TreeOctNode *node, int depth)
bool GetIsoVertex(const BSplineData< ColorDegree > *colorBSData, const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, Real isoValue, ConstPointSupportKey< WeightDegree > &weightKey, ConstPointSupportKey< ColorDegree > &colorKey, const TreeOctNode *node, int cornerIndex, const SliceValues< Vertex > &bValues, const SliceValues< Vertex > &fValues, Vertex &vertex)
void SetSliceIsoEdges(int depth, int slice, int z, std::vector< SlabValues< Vertex > > &slabValues, int threads)
Real GetIsoValue(const DenseNodeData< Real, FEMDegree > &solution, const SparseNodeData< Real, NormalDegree > &nodeWeights)
void _AddWeightContribution(SparseNodeData< Real, WeightDegree > &densityWeights, TreeOctNode *node, Point3D< Real > position, PointSupportKey< WeightDegree > &weightKey, Real weight=Real(1.0))
Real _GetSamplesPerNode(const SparseNodeData< Real, WeightDegree > &densityWeights, TreeOctNode *node, Point3D< Real > position, PointSupportKey< WeightDegree > &weightKey)
void SetSliceIsoEdges(int depth, int slice, std::vector< SlabValues< Vertex > > &slabValues, int threads)
void EnableMultigrid(std::vector< int > *map)
static bool _IsInteriorlyOverlapped(int d, int x, int y, int z)
void _MultiSplatPointData(const SparseNodeData< Real, WeightDegree > *densityWeights, Point3D< Real > point, V v, SparseNodeData< V, DataDegree > &data, PointSupportKey< WeightDegree > &weightKey, PointSupportKey< DataDegree > &dataKey, int maxDepth, int dim=DIMENSION)
V * Evaluate(const DenseNodeData< V, DataDegree > &coefficients, int &res, Real isoValue=0.f, int depth=-1, bool primal=false)
static TreeOctNode::ConstNeighbors< LeftRadius+RightRadius+1 > & _Neighbors(TreeOctNode::ConstNeighborKey< LeftRadius, RightRadius > &key, int depth)
bool _IsValidNode(const TreeOctNode *node) const
void _UpSample(int highDepth, DenseNodeData< C, FEMDegree > &coefficients) const
V Evaluate(const DenseNodeData< V, DataDegree > &coefficients, Point3D< Real > p, const BSplineData< DataDegree > &bsData) const
void _ClipTree(const SparseNodeData< Point3D< Real >, NormalDegree > &normalInfo)
Real _FinerFunctionValue(Point3D< Real > p, const PointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, const BSplineData< FEMDegree > &bsData, const DenseNodeData< Real, FEMDegree > &coefficients) const
int _HasNormals(TreeOctNode *node, const SparseNodeData< Point3D< Real >, NormalDegree > &normalInfo)
void _GetSampleDepthAndWeight(const SparseNodeData< Real, WeightDegree > &densityWeights, Point3D< Real > position, PointSupportKey< WeightDegree > &weightKey, Real &depth, Real &weight)
TreeOctNode::ConstNeighborKey< 1, 1 > ConstAdjacenctNodeKey
int _SolveSystemCG(const BSplineData< FEMDegree > &bsData, SparseNodeData< PointData< Real >, 0 > &pointInfo, int depth, DenseNodeData< Real, FEMDegree > &solution, DenseNodeData< Real, FEMDegree > &constraints, DenseNodeData< Real, FEMDegree > &metSolutionConstraints, int iters, bool coarseToFine, bool showResidual=false, double *bNorm2=NULL, double *inRNorm2=NULL, double *outRNorm2=NULL, double accuracy=0)
void CopyFinerSliceIsoEdgeKeys(int depth, int slice, int z, std::vector< SlabValues< Vertex > > &sValues, int threads)
int _GetMatrixRowSize(const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &neighbors) const
int _SetMatrixRow(const SparseNodeData< PointData< Real >, 0 > &pointInfo, const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &neighbors, MatrixEntry< Real > *row, int offset, const typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::Integrator &integrator, const Stencil< double, BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &stencil, const BSplineData< FEMDegree > &bsData) const
void _SplatPointData(TreeOctNode *node, Point3D< Real > point, V v, SparseNodeData< V, DataDegree > &data, PointSupportKey< DataDegree > &dataKey)
void _GetSampleDepthAndWeight(const SparseNodeData< Real, WeightDegree > &densityWeights, TreeOctNode *node, Point3D< Real > position, PointSupportKey< WeightDegree > &weightKey, Real &depth, Real &weight)
void SetSliceIsoCorners(const DenseNodeData< Real, FEMDegree > &solution, const DenseNodeData< Real, FEMDegree > &coarseSolution, Real isoValue, int depth, int slice, int z, std::vector< SlabValues< Vertex > > &sValues, const _Evaluator< FEMDegree > &evaluator, int threads)
V Evaluate(const SparseNodeData< V, DataDegree > &coefficients, Point3D< Real > p, const BSplineData< DataDegree > &bsData) const
void SetXSliceIsoVertices(const BSplineData< ColorDegree > *colorBSData, const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, Real isoValue, int depth, int slab, int &vOffset, CoredMeshData< Vertex > &mesh, std::vector< SlabValues< Vertex > > &sValues, int threads)
static int AddIsoPolygons(CoredMeshData< Vertex > &mesh, std::vector< std::pair< int, Vertex > > &polygon, bool polygonMesh, bool addBarycenter, int &vOffset)
void CopyFinerSliceIsoEdgeKeys(int depth, int slice, std::vector< SlabValues< Vertex > > &sValues, int threads)
void SetSliceIsoVertices(const BSplineData< ColorDegree > *colorBSData, const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, Real isoValue, int depth, int slice, int &vOffset, CoredMeshData< Vertex > &mesh, std::vector< SlabValues< Vertex > > &sValues, int threads)
const TreeOctNode & tree(void) const
static const TreeOctNode::template Neighbors< LeftRadius+RightRadius+1 > & _Neighbors(const typename TreeOctNode::template NeighborKey< LeftRadius, RightRadius > &key, int depth)
void SetSliceIsoCorners(const DenseNodeData< Real, FEMDegree > &solution, const DenseNodeData< Real, FEMDegree > &coarseSolution, Real isoValue, int depth, int slice, std::vector< SlabValues< Vertex > > &sValues, const _Evaluator< FEMDegree > &evaluator, int threads)
void SetSliceIsoVertices(const BSplineData< ColorDegree > *colorBSData, const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, Real isoValue, int depth, int slice, int z, int &vOffset, CoredMeshData< Vertex > &mesh, std::vector< SlabValues< Vertex > > &sValues, int threads)
V _Evaluate(const DenseNodeData< V, DataDegree > &coefficients, Point3D< Real > p, const BSplineData< DataDegree > &bsData, const ConstPointSupportKey< DataDegree > &neighborKey) const
int _GetSliceMatrixAndUpdateConstraints(const SparseNodeData< PointData< Real >, 0 > &pointInfo, SparseMatrix< Real > &matrix, DenseNodeData< Real, FEMDegree > &constraints, typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::Integrator &integrator, typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::ChildIntegrator &childIntegrator, const BSplineData< FEMDegree > &bsData, int depth, int slice, const DenseNodeData< Real, FEMDegree > &metSolution, bool coarseToFine)
static int _Dimension(int depth)
void _SetValidityFlags(void)
V _getEdgeValue(const ConstPointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, int edge, const DenseNodeData< V, FEMDegree > &solution, const DenseNodeData< V, FEMDegree > &metSolution, const _Evaluator< FEMDegree > &evaluator, bool isInterior) const
void SetIsoSurface(int depth, int offset, const SliceValues< Vertex > &bValues, const SliceValues< Vertex > &fValues, const XSliceValues< Vertex > &xValues, CoredMeshData< Vertex > &mesh, bool polygonMesh, bool addBarycenter, int &vOffset, int threads)
Real _CoarserFunctionValue(Point3D< Real > p, const PointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, const BSplineData< FEMDegree > &bsData, const DenseNodeData< Real, FEMDegree > &upSampledCoefficients) const
size_t leaves(void) const
static int _Depth(const TreeOctNode *node)
TreeOctNode::NeighborKey< 1, 1 > AdjacenctNodeKey
static void _SetParentOverlapBounds(const TreeOctNode *node, int &startX, int &endX, int &startY, int &endY, int &startZ, int &endZ)
static TreeOctNode::Neighbors< LeftRadius+RightRadius+1 > & _Neighbors(TreeOctNode::NeighborKey< LeftRadius, RightRadius > &key, int depth)
static const int CHILDREN
static bool _IsInteriorlySupported(const TreeOctNode *node)
Real _SplatPointData(const SparseNodeData< Real, WeightDegree > &densityWeights, Point3D< Real > point, V v, SparseNodeData< V, DataDegree > &data, PointSupportKey< WeightDegree > &weightKey, PointSupportKey< DataDegree > &dataKey, int minDepth, int maxDepth, int dim=DIMENSION)
V _getCornerValue(const ConstPointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, int corner, const DenseNodeData< V, FEMDegree > &solution, const DenseNodeData< V, FEMDegree > &metSolution, const _Evaluator< FEMDegree > &evaluator, bool isInterior) const
void _GetSampleDepthAndWeight(const SparseNodeData< Real, WeightDegree > &densityWeights, const TreeOctNode *node, Point3D< Real > position, ConstPointSupportKey< WeightDegree > &weightKey, Real &depth, Real &weight) const
bool GetIsoVertex(const BSplineData< ColorDegree > *colorBSData, const SparseNodeData< Real, WeightDegree > *densityWeights, const SparseNodeData< ProjectiveData< Point3D< Real > >, ColorDegree > *colorData, Real isoValue, ConstPointSupportKey< WeightDegree > &weightKey, ConstPointSupportKey< ColorDegree > &colorKey, const TreeOctNode *node, int edgeIndex, int z, const SliceValues< Vertex > &sValues, Vertex &vertex)
static const TreeOctNode::template ConstNeighbors< LeftRadius+RightRadius+1 > & _Neighbors(const typename TreeOctNode::template ConstNeighborKey< LeftRadius, RightRadius > &key, int depth)
std::pair< Real, Point3D< Real > > _getEdgeValueAndGradient(const ConstPointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, int edge, const DenseNodeData< Real, FEMDegree > &solution, const DenseNodeData< Real, FEMDegree > &metSolution, const _Evaluator< FEMDegree > &evaluator, bool isInterior) const
std::pair< Real, Point3D< Real > > _getCornerValueAndGradient(const ConstPointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, int corner, const DenseNodeData< Real, FEMDegree > &solution, const DenseNodeData< Real, FEMDegree > &metSolution, const _Evaluator< FEMDegree > &evaluator, bool isInterior) const
void _UpdateConstraintsFromCoarser(const SparseNodeData< PointData< Real >, 0 > &pointInfo, const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &neighbors, const typename TreeOctNode::Neighbors< BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &pNeighbors, TreeOctNode *node, DenseNodeData< Real, FEMDegree > &constraints, const DenseNodeData< Real, FEMDegree > &metSolution, const typename BSplineIntegrationData< FEMDegree, FEMDegree >::FunctionIntegrator::ChildIntegrator &childIntegrator, const Stencil< double, BSplineIntegrationData< FEMDegree, FEMDegree >::OverlapSize > &stencil, const BSplineData< FEMDegree > &bsData) const
void _SetPointValuesFromCoarser(SparseNodeData< PointData< Real >, 0 > &pointInfo, int highDepth, const BSplineData< FEMDegree > &bsData, const DenseNodeData< Real, FEMDegree > &upSampledCoefficients)
V _Evaluate(const SparseNodeData< V, DataDegree > &coefficients, Point3D< Real > p, const BSplineData< DataDegree > &bsData, const ConstPointSupportKey< DataDegree > &dataKey) const
bool _InBounds(Point3D< Real >) const
static void _CenterAndWidth(const TreeOctNode *node, Point3D< Real > ¢er, Real &width)
V _getCenterValue(const ConstPointSupportKey< FEMDegree > &neighborKey, const TreeOctNode *node, const DenseNodeData< V, FEMDegree > &solution, const DenseNodeData< V, FEMDegree > &metSolution, const _Evaluator< FEMDegree > &evaluator, bool isInterior) const
void _GetSampleDepthAndWeight(const SparseNodeData< Real, WeightDegree > &densityWeights, Point3D< Real > position, ConstPointSupportKey< WeightDegree > &weightKey, Real &depth, Real &weight)
DenseNodeData< Real, FEMDegree > SolveSystem(SparseNodeData< PointData< Real >, 0 > &pointInfo, DenseNodeData< Real, FEMDegree > &constraints, bool showResidual, int iters, int maxSolveDepth, int cgDepth=0, double cgAccuracy=0)
void setXSliceTableData(XSliceTableData &sData, int depth, int offset, int threads) const
int begin(int depth) const
_Indices< Square::CORNERS > SquareCornerIndices
int size(int depth) const
_Indices< Square::EDGES > SquareEdgeIndices
int end(int depth, int slice) const
int size(int depth, int slice) const
void set(TreeOctNode &root, std::vector< int > *map)
_Indices< Square::FACES > SquareFaceIndices
void set(TreeOctNode &root)
int begin(int depth, int slice) const
void setSliceTableData(SliceTableData &sData, int depth, int offset, int threads) const
static double GetLaplacian(const typename FunctionIntegrator::Integrator &integrator, const int off1[3], const int off2[3])
static void SetCentralLaplacianStencil(const typename FunctionIntegrator::Integrator &integrator, Stencil< double, OverlapSize > &stencil)
static Point3D< double > GetDivergence1(const typename FunctionIntegrator::ChildIntegrator &integrator, const int off1[3], const int off2[3])
static Point3D< double > GetDivergence1(const typename FunctionIntegrator::Integrator &integrator, const int off1[3], const int off2[3])
static void SetCentralDivergenceStencil(const typename FunctionIntegrator::Integrator &integrator, Stencil< Point3D< double >, OverlapSize > &stencil, bool scatter)
static void SetCentralLaplacianStencils(const typename FunctionIntegrator::ChildIntegrator &integrator, Stencil< double, OverlapSize > stencil[2][2][2])
static double GetDivergence2(const typename FunctionIntegrator::ChildIntegrator &integrator, const int off1[3], const int off2[3], Point3D< double > normal2)
static double GetDivergence1(const typename FunctionIntegrator::ChildIntegrator &integrator, const int off1[3], const int off2[3], Point3D< double > normal1)
static Point3D< double > GetDivergence2(const typename FunctionIntegrator::ChildIntegrator &integrator, const int off1[3], const int off2[3])
static Point3D< double > GetDivergence2(const typename FunctionIntegrator::Integrator &integrator, const int off1[3], const int off2[3])
static double GetDivergence2(const typename FunctionIntegrator::Integrator &integrator, const int off1[3], const int off2[3], Point3D< double > normal2)
static double GetDivergence1(const typename FunctionIntegrator::Integrator &integrator, const int off1[3], const int off2[3], Point3D< double > normal1)
static void SetCentralDivergenceStencils(const typename FunctionIntegrator::ChildIntegrator &integrator, Stencil< Point3D< double >, OverlapSize > stencil[2][2][2], bool scatter)
static double GetLaplacian(const typename FunctionIntegrator::ChildIntegrator &integrator, const int off1[3], const int off2[3])
static long long CenterIndex(const TreeOctNode *node, int maxDepth, int index[DIMENSION])
static long long FaceIndex(const TreeOctNode *node, int fIndex, int maxDepth, int index[DIMENSION])
static long long CenterIndex(int depth, const int offSet[DIMENSION], int maxDepth, int index[DIMENSION])
static long long EdgeIndex(const TreeOctNode *node, int eIndex, int maxDepth, int index[DIMENSION])
static long long CornerIndex(const TreeOctNode *node, int cIndex, int maxDepth, int index[DIMENSION])
static long long CenterIndex(const TreeOctNode *node, int maxDepth)
static const int VERTEX_COORDINATE_SHIFT
static long long CornerIndex(int depth, const int offSet[DIMENSION], int cIndex, int maxDepth, int index[DIMENSION])
static long long EdgeIndex(const TreeOctNode *node, int eIndex, int maxDepth)
static long long CornerIndex(const TreeOctNode *node, int cIndex, int maxDepth)
static long long FaceIndex(const TreeOctNode *node, int fIndex, int maxDepth)
static long long CornerIndexKey(const int index[DIMENSION])
static const int RightRadius
static const int LeftRadius
Data & operator[](int idx)
IsoEdge(long long v1, long long v2)
long long & operator[](int idx)
const long long & operator[](int idx) const
ProjectiveData & operator/=(Real s)
ProjectiveData & operator*=(Real s)
ProjectiveData operator/(Real s) const
ProjectiveData operator*(Real s) const
ProjectiveData operator-(const ProjectiveData &p) const
ProjectiveData & operator-=(const ProjectiveData &p)
ProjectiveData(V vv=V(0), Real ww=Real(0))
ProjectiveData operator+(const ProjectiveData &p) const
ProjectiveData & operator+=(const ProjectiveData &p)
const XSliceValues< Vertex > & xSliceValues(int idx) const
SliceValues< Vertex > _sliceValues[2]
XSliceValues< Vertex > & xSliceValues(int idx)
SliceValues< Vertex > & sliceValues(int idx)
XSliceValues< Vertex > _xSliceValues[2]
const SliceValues< Vertex > & sliceValues(int idx) const
void reset(bool nonLinearFit)
SortedTreeNodes::SliceTableData sliceData
Point3D< Real > * cornerGradients
std::unordered_map< long long, std::pair< int, Vertex > > edgeVertexMap
std::unordered_map< long long, long long > vertexPairMap
std::unordered_map< long long, std::vector< IsoEdge > > faceEdgeMap
std::unordered_map< long long, std::pair< int, Vertex > > edgeVertexMap
SortedTreeNodes::XSliceTableData xSliceData
std::unordered_map< long long, std::vector< IsoEdge > > faceEdgeMap
std::unordered_map< long long, long long > vertexPairMap
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencils[CHILDREN]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencils[CHILDREN][Cube::EDGES]
void set(int depth, bool dirichlet)
BSplineEvaluationData< FEMDegree >::Evaluator evaluator
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencil[Cube::CORNERS]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencil[Cube::FACES]
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > cornerStencils[CHILDREN][Cube::CORNERS]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dCellStencil
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > faceStencils[CHILDREN][Cube::FACES]
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencils[CHILDREN][Cube::EDGES]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencils[CHILDREN][Cube::CORNERS]
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > cellStencils[CHILDREN]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dEdgeStencil[Cube::EDGES]
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > cellStencil
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > edgeStencil[Cube::EDGES]
BSplineEvaluationData< FEMDegree >::ChildEvaluator childEvaluator
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dFaceStencils[CHILDREN][Cube::FACES]
Stencil< double, BSplineEvaluationData< FEMDegree >::SupportSize > faceStencil[Cube::FACES]
Stencil< Point3D< double >, BSplineEvaluationData< FEMDegree >::SupportSize > dCornerStencil[Cube::CORNERS]
Real weightedCoarserDValue
PointData(Point3D< Real > p=Point3D< Real >(), Real w=0)
static const int LeftRadius
static const int RightRadius
SquareFaceIndices & faceIndices(int idx)
SquareFaceIndices * fTable
SquareEdgeIndices & edgeIndices(const TreeOctNode *node)
SquareCornerIndices & cornerIndices(const TreeOctNode *node)
const SquareCornerIndices & cornerIndices(const TreeOctNode *node) const
SquareCornerIndices * cTable
SquareCornerIndices & cornerIndices(int idx)
SquareEdgeIndices * eTable
const SquareFaceIndices & faceIndices(int idx) const
SquareFaceIndices & faceIndices(const TreeOctNode *node)
SquareEdgeIndices & edgeIndices(int idx)
const SquareEdgeIndices & edgeIndices(int idx) const
const SquareCornerIndices & cornerIndices(int idx) const
const SquareEdgeIndices & edgeIndices(const TreeOctNode *node) const
const SquareFaceIndices & faceIndices(const TreeOctNode *node) const
SquareEdgeIndices & faceIndices(int idx)
SquareEdgeIndices & faceIndices(const TreeOctNode *node)
SquareEdgeIndices * fTable
SquareCornerIndices & edgeIndices(int idx)
const SquareCornerIndices & edgeIndices(const TreeOctNode *node) const
const SquareEdgeIndices & faceIndices(int idx) const
SquareCornerIndices * eTable
SquareCornerIndices & edgeIndices(const TreeOctNode *node)
const SquareEdgeIndices & faceIndices(const TreeOctNode *node) const
const SquareCornerIndices & edgeIndices(int idx) const
void remapIndices(const std::vector< int > &map)
std::vector< int > indices
int index(const OctNode< TreeNodeData > *node) const