18#ifndef HERMITE_INTERPOLATION_2D
19#define HERMITE_INTERPOLATION_2D
30 template<
class Scalar_,
class Gr
idView,
class InterpolationPolicy>
31 class HIPImpl<Scalar_, GridView, InterpolationPolicy, 2> :
public HIPBase<Scalar_,2>
34 typedef HIPBase<Scalar_,2> Base;
35 static int const dim = 2;
36 typedef typename Base::Scalar Scalar;
38 typedef typename GridView::template Codim<dim>::Iterator VertexIterator;
39 typedef typename GridView::template Codim<0>::Iterator::Entity Entity;
40 typedef InterpolationTools::NormalContainer<Scalar,dim> Container;
41 typedef typename Container::CollectionType NormalCollection;
42 typedef typename GridView::IntersectionIterator LocalFaceIterator;
43 typedef typename LocalFaceIterator::Intersection
Face;
51 HIPImpl(
int numberOfShapeFunctions) : Base(numberOfShapeFunctions){}
61 template <
class ShapeFunctionSet>
62 HIPImpl(Entity
const& entity, GridView
const& gridView,
63 ShapeFunctionSet
const& shapeFunctionSet, Container
const& container,
64 InterpolationPolicy
const& policy) :
65 Base(shapeFunctionSet.size())
67 init(entity, gridView, shapeFunctionSet, container, policy);
78 template <
class ShapeFunctionSet>
79 void init(Entity
const& entity, GridView
const& gridView, ShapeFunctionSet
const& shapeFunctionSet, Container
const& container, InterpolationPolicy
const& policy)
84 std::vector<Vector> tangents(dim+1,
Vector(0));
85 getVertexTangents(vid, container.vertexNormals, tangents);
88 Scalar tissue = round(policy.phaseId(entity));
93 LocalFaceIterator fend = gridView.iend(entity);
94 for(LocalFaceIterator face = gridView.ibegin(entity); face!=fend; ++face){
96 if( face->boundary() )
if( policy.ignoreOuterBoundary(*face) )
continue;
98 Scalar tissueNeighbour = -1;
99 if( face->neighbor() ) tissueNeighbour = policy.phaseId(*face->outside());
102 if(fabs(tissue-tissueNeighbour) < 1e-9)
continue;
105 int edgeId = face->indexInInside();
109 shapeFunctionIds = getFacesShapeFunctionIds(edgeId);
111 VertexIterator iter = gridView.template begin<dim>(), iter2 = gridView.template begin<dim>();
113 for(
int i=0; i<globalEdgeVertexIds[0]; ++i) ++iter;
114 for(
int i=0; i<globalEdgeVertexIds[1]; ++i) ++iter2;
116 Vector faceNormal = face->centerUnitOuterNormal();
119 Vector edgeDirection = face->geometry().corner(1) - face->geometry().corner(0);
126 for(
int vertexIdInEdge = 0; vertexIdInEdge<dim; ++vertexIdInEdge){
127 if(container.vertexNormals[ globalEdgeVertexIds[vertexIdInEdge] ].isRelevant)
129 desiredGradients[vertexIdInEdge] = (tangents[localEdgeVertexIds[vertexIdInEdge]] * faceNormal) / (tangents[localEdgeVertexIds[vertexIdInEdge]] * edgeDirection);
130 policy.applyGradientThreshold(desiredGradients[vertexIdInEdge]);
133 desiredGradients[vertexIdInEdge] = 0;
142 for(
int vertexIdInFace=0; vertexIdInFace<dim; ++vertexIdInFace){
144 for(
int sfId=0; sfId<dim; ++sfId){
146 Vector grad = ( (dim==2 && vertexIdInFace==0) ? shapeFunctionSet[ shapeFunctionIds[sfId] ].evaluateDerivative( entity.geometry().local(iter->geometry().corner(0)) )[0]
147 : shapeFunctionSet[ shapeFunctionIds[sfId] ].evaluateDerivative( entity.geometry().local(iter2->geometry().corner(0)) )[0] );
150 jacobian.mv(grad, chainRule);
152 A[vertexIdInFace][sfId] = chainRule * edgeDirection;
157 A.solve(coefficients, desiredGradients);
159 for(
int sfId=0; sfId<dim; ++sfId){
160 Scalar orientation = 1;
161 if(tissueNeighbour+1e-9 < tissue && tissueNeighbour > -1e-9) orientation = -1;
162 this->insertEntry(orientation*coefficients[sfId], orientation*faceNormal, shapeFunctionIds[sfId]);
177 void getVertexTangents(std::vector<int>
const &vid, NormalCollection
const& vertexNormals, std::vector<Vector> &tangents)
const {
178 std::vector<Vector> normals(3,
Vector());
179 normals[0] = vertexNormals[vid[0]].normals[0];
180 normals[1] = vertexNormals[vid[1]].normals[0];
181 normals[2] = vertexNormals[vid[2]].normals[0];
182 tangents[0][0] = normals[0][1];
183 tangents[0][1] = -normals[0][0];
184 tangents[1][0] = normals[1][1];
185 tangents[1][1] = -normals[1][0];
186 tangents[2][0] = normals[2][1];
187 tangents[2][1] = -normals[2][0];
195 std::vector<int> getFacesShapeFunctionIds(
int edgeId){
196 std::vector<int> shapeFunctionIds(dim,-1);
199 shapeFunctionIds[0] = 4;
200 shapeFunctionIds[1] = 7;
203 shapeFunctionIds[0] = 2;
204 shapeFunctionIds[1] = 1;
207 shapeFunctionIds[0] = 8;
208 shapeFunctionIds[1] = 6;
211 return shapeFunctionIds;
typename GridView::Intersection Face
The type of faces in the grid view.
Dune::FieldVector< Scalar, dim > Vector