Element Spaces

Currently the only finite element spaces we have are piecewise linear.  We want to have some more choices.  The key to thinking about the spaces is the connection between a basis for the space (which we can consider in a reference if it is convenient) and the nodal (hopefully physical) values we want to use.

The trick is to make sure that there is a one to one mapping.  This means that we need to think about invertibility of mappings to do anything more complicated than piecewise linear.

We are going to revisit the piecewise linear example from this new perspective

Piecewise Linear: 1D.  Interval
Reference set 0≤X≤1.

On the reference set the set of linear functions is the span of the set {(Subscript[f, 1]),(Subscript[f, 2])}={1,X}.  In other words, the set {1,X} is a basis and every linear function is a unique linear combination of the functions f[X]=(Subscript[α, 1])(Subscript[f, 1])[X]+(Subscript[α, 2])(Subscript[f, 2])[X].  We get the nodal values (which we will call (Subscript[v, 1]) and (Subscript[v, 2])) by plugging in X=0 and X=1.  So we get
	({{(Subscript[α, 1])(Subscript[f, 1])[0]+(Subscript[α, 2])(Subscript[f, 2])[0], =, (Subscript[v, 1])}, {(Subscript[α, 1])(Subscript[f, 1])[1]+(Subscript[α, 2])(Subscript[f, 2])[1], =, (Subscript[v, 2])}})
which simplifies to
	(({{1, 0}, {1, 1}}))(OverVector[α])=(OverVector[v])
We can go backwards and forwards between the nodal values (OverVector[v]) and the coefficients (OverVector[α]) because the matrix (({{1, 0}, {1, 1}})) is invertible because Det[(({{1, 0}, {1, 1}}))]=1≠0.

Piecewise Linear: 2D.  Triangle
Reference set 0≤(Subscript[X, 1])≤1 and 0≤(Subscript[X, 2])≤1-(Subscript[X, 1]).

On the reference set the set of linear functions is the span of the set {(Subscript[f, 1]),(Subscript[f, 2]),(Subscript[f, 3])}={1,(Subscript[X, 1]),(Subscript[X, 2])}.  If we label the corners of the references set (Subscript[(OverVector[p]), 1])={0,0}, (Subscript[(OverVector[p]), 2])={1,0}, (Subscript[(OverVector[p]), 3])={0,1} with nodal values  (OverVector[v]) we get
	({{(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 1])], =, (Subscript[v, 1])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 2])], =, (Subscript[v, 2])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 3])], =, (Subscript[v, 3])}})
which simplifies to
	(({{1, 0, 0}, {1, 1, 0}, {1, 0, 1}}))(OverVector[α])=(OverVector[v])
We can go backwards and forwards between the nodal values (OverVector[v]) and the coefficients (OverVector[α]) because the matrix (({{1, 0, 0}, {1, 1, 0}, {1, 0, 1}})) is invertible because Det[(({{1, 0, 0}, {1, 1, 0}, {1, 0, 1}}))]=1≠0.

Piecewise Bi-Linear: 2D.  Quad
Reference set 0≤(Subscript[X, 1])≤1 and 0≤(Subscript[X, 2])≤1.

On the reference set the set of bilinear functions is the span of the set {(Subscript[f, 1]),(Subscript[f, 2]),(Subscript[f, 3]), (Subscript[f, 4])}={1,(Subscript[X, 1]),(Subscript[X, 2]), (Subscript[X, 1])(Subscript[X, 2])}.  If we label the corners of the references set (Subscript[(OverVector[p]), 1])={0,0}, (Subscript[(OverVector[p]), 2])={1,0}, (Subscript[(OverVector[p]), 3])={1,1}, (Subscript[(OverVector[p]), 3])={0,1} with nodal values  (OverVector[v]) we get
	({{(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 1])], =, (Subscript[v, 1])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 2])], =, (Subscript[v, 2])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 3])], =, (Subscript[v, 3])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 4])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 4])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 4])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 4])], =, (Subscript[v, 4])}})
which simplifies to
	(({{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 1}, {1, 0, 1, 0}}))(OverVector[α])=(OverVector[v])
We can go backwards and forwards between the nodal values (OverVector[v]) and the coefficients (OverVector[α]) because Det[(({{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 1}, {1, 0, 1, 0}}))]=1≠0.

Fancier Elements: 2D Triangle 
Reference set 0≤(Subscript[X, 1])≤1 and 0≤(Subscript[X, 2])≤1-(Subscript[X, 1]).

Suppose we want to use the set of all quadratics on the reference triangle.  Then our basis functions are
	{(Subscript[f, 1]),(Subscript[f, 2]),(Subscript[f, 3]), (Subscript[f, 4]),(Subscript[f, 5]),(Subscript[f, 6])}={1,(Subscript[X, 1]),(Subscript[X, 2]), (Subscript[X, 1])(Subscript[X, 2]), (Subscript[X, 1]) (Subscript[X, 1]), (Subscript[X, 2])(Subscript[X, 2])}.  
As beforw we label the corners of the references set (Subscript[(OverVector[p]), 1])={0,0}, (Subscript[(OverVector[p]), 2])={1,0}, (Subscript[(OverVector[p]), 3])={0,1} and declare that the function values at the corners are the first three nodal values
	({{(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 5])(Subscript[f, 5])[(Subscript[(OverVector[p]), 1])]+(Subscript[α, 6])(Subscript[f, 6])[(Subscript[(OverVector[p]), 1])], =, (Subscript[v, 1])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 5])(Subscript[f, 5])[(Subscript[(OverVector[p]), 2])]+(Subscript[α, 6])(Subscript[f, 6])[(Subscript[(OverVector[p]), 2])], =, (Subscript[v, 2])}, {(Subscript[α, 1])(Subscript[f, 1])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 2])(Subscript[f, 2])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 3])(Subscript[f, 3])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 4])(Subscript[f, 4])[(Subscript[(OverVector[p]), 3])]++(Subscript[α, 5])(Subscript[f, 5])[(Subscript[(OverVector[p]), 3])]+(Subscript[α, 6])(Subscript[f, 6])[(Subscript[(OverVector[p]), 3])], =, (Subscript[v, 3])}})
which simplifies to
	(({{1, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 0}, {1, 0, 1, 0, 0, 1}, {?, ?, ?, ?, ?, ?}, {?, ?, ?, ?, ?, ?}, {?, ?, ?, ?, ?, ?}}))(OverVector[α])=(({{(Subscript[v, 1])}, {(Subscript[v, 2])}, {(Subscript[v, 3])}, {?}, {?}, {?}}))
where the ?s indiacte we have to decide 3 more equations/nodal values.   One standard choice is to evaluate the gradients
	{∇(Subscript[f, 1]),∇(Subscript[f, 2]),∇(Subscript[f, 3]), ∇(Subscript[f, 4]),∇(Subscript[f, 5]),∇(Subscript[f, 6])}={{0,0},{1,0},{0,1}, {(Subscript[X, 2]),(Subscript[X, 1])}, {2(Subscript[X, 1]) ,0}, {0, 2(Subscript[X, 2])}}
at the mid points (Subscript[(OverVector[p]), 3])={0.5,0}, (Subscript[(OverVector[p]), 4])={0,0.5}, and  (Subscript[(OverVector[p]), 6])={0.5,0.5} of the reference triangle. In fact, we evaluate the normal derivatives at those points.  The outward unit normals are {0,-1}, {-1,0}, and {(1/(Sqrt[2])),(1/(Sqrt[2]))} respectively at those points.

Ps={{0,0},{1,0},{0,1},{0.5,0},{0,0.5},{0.5,0.5}};
Show[
Graphics[{
{LightBlue,Polygon[Ps[[1;;3]]]},
{Red, Map[Point, Ps]},
Table[ Text[i,Ps[[i]],{1,1}],{i,1,6}],
{
Arrow[{Ps[[4]],Ps[[4]]+{0,-1}}],
Arrow[{Ps[[5]],Ps[[5]]+{-1,0}}],
Arrow[{Ps[[6]],Ps[[6]]+{1,1}/(Sqrt[2])}]
}
}
],
Frame->True
]

If we take ∂f/∂n at (Subscript[(OverVector[p]), 4]), (Subscript[(OverVector[p]), 5]), and (Subscript[(OverVector[p]), 6]) resectively as the physical values then we can fill in the last three equations by direct computation

	(({{1, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 0}, {1, 0, 1, 0, 0, 1}, {0, 0, -1, -(( 1)/2), 0, 0}, {0, -1, 0, -(( 1)/2), 0, 0}, {0, (1/(Sqrt[2])), (1/(Sqrt[2])), (1/(Sqrt[2])), (1/(Sqrt[2])), (1/(Sqrt[2]))}}))(OverVector[α])=(({{(Subscript[v, 1])}, {(Subscript[v, 2])}, {(Subscript[v, 3])}, {?}, {?}, {?}}))

The computation is below and the determinant is -(1/(Sqrt[2])).

{∇fs={{0,0},{1,0},{0,1}, {(Subscript[X, 2]),(Subscript[X, 1])}, {2(Subscript[X, 1]) ,0}, {0, 2(Subscript[X, 2])}}/.{(Subscript[X, 1])->1/2,(Subscript[X, 2])->0};
∇fs.{0,-1},
∇fs={{0,0},{1,0},{0,1}, {(Subscript[X, 2]),(Subscript[X, 1])}, {2(Subscript[X, 1]) ,0}, {0, 2(Subscript[X, 2])}}/.{(Subscript[X, 1])->0,(Subscript[X, 2])->1/2};
∇fs.{-1,0},
∇fs={{0,0},{1,0},{0,1}, {(Subscript[X, 2]),(Subscript[X, 1])}, {2(Subscript[X, 1]) ,0}, {0, 2(Subscript[X, 2])}}/.{(Subscript[X, 1])->1/2,(Subscript[X, 2])->1/2};
∇fs.{1,1}/(Sqrt[2])
}

What this means is that you can go between the nodal values we picked i.e. corner values and the normal derivatives at the midpoints and the coefficients of a general quadratic.  Of course, an important question is how smooth is the resulting piecewise function.