65 constexpr static int dim=_dim;
66 constexpr static int order=degree;
71 typedef Eigen::Matrix<double,1,dim+1>
BaryType;
77 static Eigen::Matrix<double,1,Eigen::Dynamic> shapeFunctionCoeff(
const int&
N)
83 Eigen::Matrix<int,1,Eigen::Dynamic> prod(1,1);
89 Eigen::Matrix<int,1,2> temp2(-n,degree);
90 Eigen::Matrix<int,1,Eigen::Dynamic> temp1(1,prod.cols()+1);
92 for (
int i = 0;
i < prod.cols();++
i)
94 for (
int j = 0;
j < temp2.cols();++
j)
96 temp1(
i +
j) += prod(
i) * temp2(
j);
109 return prod.cast<
double>()/
f;
113 static Eigen::Matrix<double,dim+1,degree+1> getSFcoeffs(
const Eigen::Matrix<int,1,dim+1>& bary)
118 Eigen::Matrix<double,dim+1,degree+1>
temp(Eigen::Matrix<double,dim+1,degree+1>::Zero());
121 temp.row(
k).segment(0,bary(
k)+1)=shapeFunctionCoeff(bary(
k));
127 static std::vector<Eigen::Matrix<double,dim+1,degree+1>> get_sfCoeffsVector()
131 std::vector<Eigen::Matrix<double,dim+1,degree+1>>
temp;
140 static Eigen::Matrix<double,1,dim+1> sfcTimesBary(
const int& n,
const BaryType& bary)
142 Eigen::Matrix<double,1,dim+1>
temp(Eigen::Matrix<double,1,dim+1>::Zero());
143 for(
int d=0;d<
dim+1;++d)
145 Eigen::Matrix<double,degree+1,1> bPow(Eigen::Matrix<double,degree+1,1>::Ones());
146 for (
int p=1;
p<degree+1;++
p)
149 bPow(
p)=bPow(
p-1)*bary(d);
157 static Eigen::Matrix<double,1,dim+1> sfcTimesBaryDiff(
const int& n,
const BaryType& bary)
159 Eigen::Matrix<double,1,dim+1>
temp(Eigen::Matrix<double,1,dim+1>::Zero());
160 for(
int d=0;d<
dim+1;++d)
163 Eigen::Matrix<double,degree+1,1> bPow(Eigen::Matrix<double,degree+1,1>::Ones());
164 for (
int p=2;
p<degree+1;++
p)
166 bPow(
p)=
p*std::pow(bary(d),
p-1);
169 temp(d)=
sfCoeffsVector[
n].template block<1,degree>(d,1).dot(bPow.template segment<degree>(1));
175 static Eigen::Matrix<double,dim,dim> get_FL(
const Simplex<dim,dim>& s)
177 Eigen::Matrix<double,dim,dim>
temp;
187 temp.col(
k) <<
s.mesh->template simplexFactory<0>().getRef(
current).P0 -
s.mesh->template simplexFactory<0>().getRef(last).P0;
196 static const Eigen::Matrix<int ,CombinationWithRepetition<_dim+1,degree>::value,_dim+1>
baryStarsAndBars;
197 static const Eigen::Matrix<double,CombinationWithRepetition<_dim+1,degree>::value,_dim+1>
baryNodalCoordinates;
204 Eigen::Matrix<double,_dim,nodesPerElement>
Xe;
209 std::deque<NodeType>& nodeContainer,
210 std::map<Eigen::Matrix<double,dim,1>,
NodeType*
const,
212 std::map<size_t,const NodeType* const>&) :
220 const Eigen::Matrix<double,dim,dim> FL(get_FL(
simplex));
238 nodeContainer.emplace_back(P,nodeContainer.size());
239 NodeType* pN=&*nodeContainer.rbegin();
253 this->emplace_back(pN);
276 static Eigen::Matrix<double,1,nodesPerElement>
sf(
const BaryType& bary)
284 Eigen::Matrix<double,1,nodesPerElement>
temp;
287 temp(n)=sfcTimesBary(n,bary).prod();
293 template<
typename TrialFunctionType>
306 static Eigen::Matrix<double,dim+1,nodesPerElement>
diff(
const BaryType& bary)
314 Eigen::Matrix<double,dim+1,nodesPerElement>
temp(Eigen::Matrix<double,dim+1,nodesPerElement>::Zero());
317 const Eigen::Matrix<double,1,dim+1> temp1(sfcTimesBary(n,bary));
318 const Eigen::Matrix<double,1,dim+1> temp2(sfcTimesBaryDiff(n,bary));
320 for(
int d=0;d<
dim+1;++d)
322 Eigen::Matrix<double,1,dim+1> temp3(temp1);
324 temp(d,n)=temp3.prod();
331 static Eigen::Matrix<double,dim,nodesPerElement>
gradS(
const BaryType& bary)
343 template<
typename TrialFunctionType>
352 Eigen::Matrix<double,dim,nodesPerElement>
temp(
Gs(bary).transpose()*
gradS(bary));
358 template<
typename TrialFunctionType>
365 Eigen::Matrix<double,dim,nodesPerElement>
temp(
Gs(bary).transpose()*
gradS(bary));
375 return *this->operator[](n);
384 return *this->operator[](n);
392 return MappingType<ElementType>(*this).position(bary);
396 Eigen::Matrix<double,_dim,_dim>
Fs(
const BaryType& bary)
const
400 return MappingType<ElementType>(*this).Fs(bary);
409 return MappingType<ElementType>(*this).absJ(bary);
413 Eigen::Matrix<double,_dim,_dim>
Gs(
const BaryType& bary)
const
417 return MappingType<ElementType>(*this).Gs(bary);
421 Eigen::Matrix<double,dim,1>
jGN(
const BaryType& bary,
const int& n)
const
423 return MappingType<ElementType>(*this).jGN(bary,n);
430 return simplex.isBoundarySimplex();
437 return simplex.boundaryFaces();
DiscontinuousLagrangeElement(const Simplex< dim, dim > &s, std::deque< NodeType > &nodeContainer, std::map< Eigen::Matrix< double, dim, 1 >, NodeType *const, CompareVectorsByComponent< double, dim, float > > &, std::map< size_t, const NodeType *const > &)