8#ifndef model_Simplex_cpp_
9#define model_Simplex_cpp_
28template<
short int dim>
33 P0(
m->simplexReader().get_P0(this->xID))
41template<
short int dim>
48template<
short int dim>
51 return std::set<const Simplex<dim,0>*>();
55template<
short int dim>
62template<
short int dim>
71template<
short int dim,
short int order>
87template<
short int dim,
short int order>
140template<
short int dim,
short int order>
147template<
short int dim,
short int order>
150 std::vector<int>
temp;
152 for (
int n=0;n<
nFaces;++n)
164template<
short int dim,
short int order>
168 std::set<const Simplex<dim,order>*>
temp;
173 if(
parent.second.get()!=
this)
183template<
short int dim,
short int order>
186 std::set<const Simplex<dim,order>*>
temp;
189 if(
child->isBoundarySimplex())
193 if(
parent.second->isBoundarySimplex())
204template<
short int dim,
short int order>
207 std::set<const Simplex<dim,order>*>
temp;
210 if(
child->isRegionBoundarySimplex())
214 if(
parent.second->isRegionBoundarySimplex())
226template<
short int dim,
short int order>
233template<
short int dim,
short int order>
242template<
short int dim>
245 Eigen::Matrix<double,dim,dim+1> vP(this->vertexPositionMatrix());
246 Eigen::Matrix<double,dim,dim> F(vP.template block<dim,dim>(0,0));
247 F.colwise() -= vP.col(dim);
248 const double jFabs(std::fabs(F.determinant()));
249 if(jFabs<DBL_EPSILON)
251 std::cout<<this->xID<<
", volume="<<jFabs<<std::endl;
252 std::cout<<F<<std::endl;
253 assert(0 &&
"SIMPLEX HAS ZERO VOLUME");
260template<
short int dim>
265,region(
m->getSharedRegion(regionID))
266,p2b(this->b2p.fullPivLu().solve(Eigen::Matrix<double,
dim+1,
dim+1>::Identity()))
274 region->simplices().emplace(
this);
279template<
short int dim>
286 region->simplices().erase(
this);
336template<
short int dim>
343template<
short int dim>
346 std::vector<int>
temp;
348 for (
int n=0;n<
nFaces;++n)
359template<
short int dim>
366template<
short int dim>
373template<
short int dim>
374Eigen::Matrix<double,dim+1,1> Simplex<dim,dim>::pos2bary(
const Eigen::Matrix<double,dim,1>& P)
const
376 return p2b*(Eigen::Matrix<double,dim+1,1>()<<P,1.0).finished();
380template<
short int dim>
381void Simplex<dim,dim>::convexDelaunaynSearch(
const bool& searchAllRegions,
382 const Eigen::Matrix<double,dim,1>& P,
383 std::pair<
bool,
const Simplex<dim,dim>*>& lastSearched,
384 std::set<
const Simplex<dim,dim>*>& searchSet)
const
386 if(searchSet.find(
this)==searchSet.end())
388 searchSet.insert(
this);
389 lastSearched.second=
this;
392 const double baryMin=
pos2bary(P).minCoeff(&kMin);
394#ifdef _MODEL_BENCH_BARYSEARCH_
395 std::cout<<
"Searching "<<this->
xID<<std::endl;
396 std::cout<<
"bary= "<<
pos2bary(P)<<std::endl;
397 searchFile<<this->
bary2pos(Eigen::Matrix<double,dim+1,1>::Ones()/(
dim+1)).transpose()<<
" "
401 if (baryMin>=-FLT_EPSILON)
403 lastSearched.first=
true;
410 if(pParent.second->region->regionID==
region->regionID || searchAllRegions)
412 pParent.second->convexDelaunaynSearch(searchAllRegions,P,lastSearched,searchSet);
413 if (lastSearched.first)
423template<
short int dim>
424Eigen::Matrix<double,dim+1,1> Simplex<dim,dim>::faceLineIntersection(
const Eigen::Matrix<double,dim+1,1>& bary0,
425 const Eigen::Matrix<double,dim+1,1>& bary1,
426 const int& faceID)
const
435 assert((faceID>=0) && (faceID<=
dim) &&
"0 <= faceID <= dim");
439 assert(std::fabs(bary0.sum()-1.0)<=FLT_EPSILON &&
"bary0 must sum to 1");
440 assert(std::fabs(bary1.sum()-1.0)<=FLT_EPSILON &&
"bary1 must sum to 1");
442 Eigen::Matrix<double,dim+1,1>
temp(bary0*0.5+bary1*0.5);
443 const double den(bary1(faceID)-bary0(faceID));
444 if (std::fabs(
den)>DBL_EPSILON)
446 double u(-bary0(faceID)/
den);
448 temp=bary0*(1.0-
u)+bary1*
u;
453 std::cout<<
"Parallel faceLineIntersection"<<std::endl;
459template<
short int dim>
462 std::set<size_t>
temp;
bool isBoundarySimplex() const
SimplexTraits< dim, order-1 >::SimplexIDType ChildIDType
Eigen::Matrix< double, dim+1, 1 > pos2bary(const Eigen::Matrix< double, dim, 1 > &P) const
const std::shared_ptr< MeshRegionType > region
Shared pointer to MeshRegioin containing *this.
const Eigen::Matrix< double, dim+1, dim+1 > p2b
The position to barycentric-coordinate transformation matrix.
ParentContainerType parents() const
bool isBoundarySimplex() const
bool isRegionBoundarySimplex() const
std::set< size_t > regionIDs() const
Eigen::Matrix< double, dim, 1 > outNormal() const
static constexpr int nFaces
std::set< const Simplex< dim, order > * > boundaryNeighbors() const
std::set< const Simplex< dim, order > * > regionBoundaryNeighbors() const
size_t childOrder(const ChildIDType &childID) const
SimplexTraits< dim, order-1 >::SimplexIDType ChildIDType
std::set< const Simplex< dim, order > * > spouses() const
std::vector< int > boundaryFaces() const
static const MatrixDimHigherDimD NdA
static Eigen::Matrix< double, dim, 1 > outNormal(const Simplex< dim, dim-dmo > &simplexChild)
static bool isBoundarySimplex(const SimplexChild< dim, dim-dmo > &simplexChild)
static bool isRegionBoundarySimplex(const SimplexChild< dim, dim-dmo > &simplexChild)
static constexpr short int dim
ChildSimplexType & child(const int &n)
Eigen::Matrix< double, dim, SimplexTraits< dim, order >::nVertices > vertexPositionMatrix() const
Eigen::Matrix< double, dim, 1 > bary2pos(const Eigen::Matrix< double, SimplexTraits< dim, order >::nVertices, 1 > &bary) const
BaseArrayType & children()
static size_t faceOrder(const SimplexIDType &parentID, const typename SimplexTraits< dim, order-1 >::SimplexIDType &childID)
static double volume(const Eigen::Matrix< double, dim, SimplexTraits< dim, order >::nVertices > &posM)