131 : t(t_), pl(pl_), cachedindex(-1), time(0), gv(pl_.
getGridView()), is(gv.indexSet()), storedcoeffs(is.size(0)),
132 rt0vectors(rt0fe.localBasis().size())
135 for (
const auto& element : elements(gv,Dune::Partitions::interior))
138 int index = is.index(element);
141 auto geo = element.geometry();
144 auto ref_el = referenceElement(geo);
145 auto inside_cell_center_local = ref_el.position(0,0);
146 auto inside_cell_center_global = geo.global(inside_cell_center_local);
149 auto tensor_inside = t.A(element,inside_cell_center_local);
152 typename PL::Traits::RangeType pl_inside;
153 pl.evaluate(element,inside_cell_center_local,pl_inside);
157 auto B = geo.jacobianInverseTransposed(inside_cell_center_local);
158 auto determinant = B.determinant();
161 for (
const auto& intersection : intersections(pl.getGridView(),element))
164 vn[intersection.indexInInside()] = 0.0;
167 auto face_local = referenceElement(intersection.geometry()).position(0,0);
170 if (intersection.neighbor())
172 auto outside_cell = intersection.outside();
173 auto outside_cell_center_local = referenceElement(outside_cell.geometry()).position(0,0);
174 auto outside_cell_center_global = outside_cell.geometry().global(outside_cell_center_local);
177 auto d(outside_cell_center_global);
178 d -= inside_cell_center_global;
179 auto distance = d.two_norm();
182 auto tensor_outside = t.A(outside_cell,outside_cell_center_local);
183 auto n_F = intersection.centerUnitOuterNormal();
184 Dune::FieldVector<RF,dim> An_F;
185 tensor_inside.mv(n_F,An_F);
186 auto k_inside = n_F*An_F;
187 tensor_outside.mv(n_F,An_F);
188 auto k_outside = n_F*An_F;
189 auto k_avg = 2.0/(1.0/(k_inside+1E-30) + 1.0/(k_outside+1E-30));
192 typename PL::Traits::RangeType pl_outside;
193 pl.evaluate(outside_cell,outside_cell_center_local,pl_outside);
196 vn[intersection.indexInInside()] = k_avg*(pl_inside-pl_outside)/distance;
200 if (intersection.boundary())
203 auto d = intersection.geometry().global(face_local);
204 d -= inside_cell_center_global;
205 auto distance = d.two_norm();
208 auto bctype = t.bctype(intersection,face_local);
213 auto iplocal_s = intersection.geometryInInside().global(face_local);
214 auto g_l = t.g(intersection.inside(),iplocal_s);
215 auto n_F = intersection.centerUnitOuterNormal();
216 Dune::FieldVector<RF,dim> An_F;
217 tensor_inside.mv(n_F,An_F);
218 auto k_inside = n_F*An_F;
219 vn[intersection.indexInInside()] = k_inside * (pl_inside-g_l)/distance;
225 auto j = t.j(intersection,face_local);
226 vn[intersection.indexInInside()] = j;
231 auto vstar=intersection.centerUnitOuterNormal();
232 vstar *= vn[intersection.indexInInside()];
233 Dune::FieldVector<RF,dim> normalhat(0);
234 if (intersection.indexInInside()%2==0)
235 normalhat[intersection.indexInInside()/2] = -1.0;
237 normalhat[intersection.indexInInside()/2] = 1.0;
238 Dune::FieldVector<DF,dim> vstarhat(0);
239 B.umtv(vstar,vstarhat);
240 vstarhat *= determinant;
241 storedcoeffs[
index][intersection.indexInInside()] = vstarhat*normalhat;
247 if (gv.grid().comm().size()>1)
248 gv.grid().communicate(dh,Dune::InteriorBorder_All_Interface,Dune::ForwardCommunication);