1#ifndef __PARABOLIC_ESTIMATOR_HH__
2#define __PARABOLIC_ESTIMATOR_HH__
5#include <dune/fem/quadrature/caching/twistutility.hh>
6#include <dune/fem/quadrature/cachingquadrature.hh>
7#include <dune/fem/quadrature/intersectionquadrature.hh>
8#include <dune/fem/operator/common/spaceoperatorif.hh>
9#include <dune/fem/operator/matrix/blockmatrix.hh>
10#include <dune/fem/space/discontinuousgalerkin.hh>
13#include "../estimators/estimatorinterface.hh"
14#include "../models/modelinterface.hh"
15#include "../common/geometry.hh"
16#include "../common/intersectiondatahandle.hh"
56 template<
class OldSolutionFunction,
class TimeProv
ider,
class ImplicitModel,
class ExplicitModel>
58 :
public DefaultEstimator<ParabolicEulerEstimator<OldSolutionFunction, TimeProvider,
59 ImplicitModel, ExplicitModel> >
61 enum FunctionSpaceNorm
68 typedef DefaultEstimator<ThisType> BaseType;
71 typedef typename OldSolutionFunction::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
72 typedef typename DiscreteFunctionSpaceType::RangeFieldType RangeFieldType;
73 typedef typename DiscreteFunctionSpaceType::GridPartType GridPartType;
74 typedef typename GridPartType::GridType GridType;
75 typedef typename GridType::template Codim<0>::Entity ElementType;
77 typedef std::vector<RangeFieldType> ErrorIndicatorType;
79 typedef typename ErrorIndicatorType::const_iterator IteratorType;
83 typedef TimeProvider TimeProviderType;
86 typedef typename ImplicitModelType::OperatorPartsType ImplicitOperatorPartsType;
87 typedef typename ExplicitModelType::OperatorPartsType ExplicitOperatorPartsType;
91 typedef OldSolutionFunction OldSolutionFunctionType;
93 typedef typename DiscreteFunctionSpaceType::DomainFieldType DomainFieldType;
94 typedef typename DiscreteFunctionSpaceType::DomainType DomainType;
95 typedef typename DiscreteFunctionSpaceType::RangeType RangeType;
96 typedef typename DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType;
97 typedef typename DiscreteFunctionSpaceType::HessianRangeType HessianRangeType;
101 typedef typename BulkForcesFunctionType::LocalFunctionType BulkForcesLocalFunctionType;
103 typedef typename DirichletFunctionType::LocalFunctionType DirichletLocalFunctionType;
105 typedef typename NeumannFunctionType::LocalFunctionType NeumannLocalFunctionType;
114 typedef typename ExplicitBulkForcesFunctionType::LocalFunctionType ExplicitBulkForcesLocalFunctionType;
118 typedef typename DiscreteFunctionSpaceType::IteratorType GridIteratorType;
119 typedef typename GridPartType::IndexSetType IndexSetType;
120 typedef typename IndexSetType::IndexType IndexType;
121 typedef typename GridPartType::IntersectionIteratorType IntersectionIteratorType;
123 typedef typename IntersectionIteratorType::Intersection IntersectionType;
126 typedef typename ElementType::Geometry GeometryType;
127 static const int dimension = GridType::dimension;
129 typedef Dune::Fem::CachingQuadrature<GridPartType, 0> ElementQuadratureType;
130 typedef Dune::Fem::CachingQuadrature<GridPartType, 1> FaceQuadratureType;
135 typedef Dune::FieldMatrix<DomainFieldType,dimension,dimension> JacobianInverseType;
138 const TimeProviderType& timeProvider_;
140 const ImplicitOperatorPartsType implicitParts_;
141 const ImplicitOperatorPartsType implicitPartsNeighbour_;
143 const ExplicitOperatorPartsType explicitParts_;
144 const OldSolutionFunctionType& oldSolution_;
146 const DiscreteFunctionSpaceType &dfSpace_;
147 GridPartType &gridPart_;
148 const IndexSetType &indexSet_;
152 BulkForcesFunctionType bulkForcesFunction_;
153 ExplicitBulkForcesFunctionType explicitBulkForcesFunction_;
154 NeumannFunctionType neumannFunction_;
155 NeumannIndicatorType neumannBndry_;
156 ErrorIndicatorType localIndicators_;
157 RangeFieldType timeIndicator_;
159 mutable std::vector<JacobianRangeType> outsideFaceFluxCache;
169 enum { bulk, jump, bdry, comm, numContributions };
170 RangeFieldType errorMin[numContributions];
171 RangeFieldType errorMax[numContributions];
183 typedef RangeType DataItemType;
184 typedef std::vector<DataItemType> IntersectionStorageType;
185 typedef std::map<IndexType, IntersectionStorageType> CommunicationStorageType;
186 typedef typename Fem::DFCommunicationOperation::Add OperationType;
196 class LocalIntersectionStorage
198 typedef std::vector<RangeFieldType> WeightStorageType;
200 LocalIntersectionStorage()
202 LocalIntersectionStorage(IndexType bulkEntityIndex,
size_t nop)
203 : bulkEntityIndex_(bulkEntityIndex), weights_(nop), h_(0)
205 IndexType bulkEntityIndex()
const {
return bulkEntityIndex_; }
206 IndexType& bulkEntityIndex() {
return bulkEntityIndex_; }
207 const RangeFieldType& operator[](
size_t idx)
const {
return weights_[idx]; }
208 RangeFieldType& operator[](
size_t idx) {
return weights_[idx]; }
209 size_t size()
const {
return weights_.size(); }
210 RangeFieldType&
hEstimate() {
return h_; }
211 const RangeFieldType&
hEstimate()
const {
return h_; }
213 IndexType bulkEntityIndex_;
214 WeightStorageType weights_;
217 typedef std::map<IndexType, LocalIntersectionStorage> LocalStorageType;
219 LocalStorageType localJumpStorage_;
220 CommunicationStorageType commJumpStorage_;
227 const OldSolutionFunctionType& oldSolution)
228 : timeProvider_(timeProvider),
229 implicitModel_(implicitModel),
232 explicitModel_(explicitModel),
234 oldSolution_(oldSolution),
235 dfSpace_(oldSolution_.space()),
236 gridPart_(dfSpace_.gridPart()),
237 indexSet_(gridPart_.indexSet()),
238 grid_(gridPart_.grid()),
245 localIndicators_.resize(indexSet_.size(0));
249 template<
class DiscreteFunctionType>
250 RangeFieldType
estimate(
const DiscreteFunctionType& uh)
259 const GridIteratorType end = dfSpace_.end();
260 for (GridIteratorType it = dfSpace_.begin(); it != end; ++it) {
264 RangeFieldType error = 0.0;
267 const IteratorType endEstimator = localIndicators_.end();
268 for (IteratorType it = localIndicators_.begin(); it != endEstimator; ++it) {
273 RangeFieldType commarray[] = { error, timeIndicator_ };
274 grid_.comm().sum(commarray, 2);
275 error = commarray[0];
276 timeIndicator_ = commarray[1];
278 if (Dune::Fem::Parameter::verbose()) {
280 std::cout <<
"Estimated " << (Norm == L2Norm ?
"L2" :
"H1") <<
"-Error: " << std::sqrt(error) << std::endl;
283 timeIndicator_ = std::sqrt(timeIndicator_);
285 return std::sqrt(error);
288 const RangeFieldType& operator[](
const size_t& idx)
const
290 return localIndicators_[idx];
293 const RangeFieldType& operator[](
const ElementType& entity)
const
295 return (*
this)[indexSet_.index(entity)];
300 return indexSet_.size(0);
303 IteratorType begin()
const {
304 return localIndicators_.begin();
307 IteratorType end()
const {
308 return localIndicators_.end();
311 RangeFieldType timeEstimate()
const {
312 return timeIndicator_;
315 GridType& grid()
const
320 const DiscreteFunctionSpaceType& space()
const
329 localIndicators_.resize(indexSet_.size(0));
330 const typename ErrorIndicatorType::iterator end = localIndicators_.end();
331 for (
typename ErrorIndicatorType::iterator it = localIndicators_.begin();
338 localJumpStorage_.clear();
339 commJumpStorage_.clear();
350 errorMax[comm] = 0.0;
354 template<
class DiscreteFunctionType>
355 void estimateLocal(
const ElementType &entity,
const DiscreteFunctionType& uh)
357 typedef typename DiscreteFunctionType::LocalFunctionType LocalFunctionType;
358 typedef typename OldSolutionFunctionType::LocalFunctionType ExplicitLocalFunctionType;
360 const typename ElementType::Geometry &geometry = entity.geometry();
362 const RangeFieldType volume = geometry.volume();
363 const RangeFieldType h2 = (dimension == 2 ? volume : std::pow(volume, 2.0 / (RangeFieldType)dimension));
364 const RangeFieldType hFactor = Norm == L2Norm ? h2 * h2 : h2;
365 const int index = indexSet_.index(entity);
366 const LocalFunctionType uLocal = uh.localFunction(entity);
367 const ExplicitLocalFunctionType uOldLocal = oldSolution_.localFunction(entity);
368 const BulkForcesLocalFunctionType fLocal = bulkForcesFunction_.localFunction(entity);
369 const ExplicitBulkForcesLocalFunctionType fOldLocal = explicitBulkForcesFunction_.localFunction(entity);
371 implicitParts_.setEntity(entity);
372 explicitParts_.setEntity(entity);
374 ElementQuadratureType quad(entity, 2*(dfSpace_.order() + 1));
376 const int numQuadraturePoints = quad.nop();
377 for (
int qp = 0; qp < numQuadraturePoints; ++qp) {
378 const typename ElementQuadratureType::CoordinateType &x = quad.point(qp);
379 const RangeFieldType weight = quad.weight(qp) * geometry.integrationElement(x);
382 uLocal.evaluate(x, values);
384 JacobianRangeType jacobian;
385 uLocal.jacobian(x, jacobian);
387 HessianRangeType hessian;
388 uLocal.hessian(x, hessian);
391 RangeType el_res = 0;
392 if (ImplicitConstituents::hasFlux) {
394 implicitParts_.fluxDivergence(entity, quad[qp], values, jacobian, hessian, tmp);
397 if (ImplicitConstituents::hasSources) {
399 implicitParts_.source(entity, quad[qp], values, jacobian, tmp);
402 if (ImplicitConstituents::hasBulkForces) {
404 fLocal.evaluate(x, tmp);
410 uOldLocal.evaluate(x, oldValues);
412 JacobianRangeType oldJacobian;
413 uOldLocal.jacobian(x, oldJacobian);
415 HessianRangeType oldHessian;
416 uOldLocal.hessian(x, oldHessian);
419 if (ExplicitConstituents::hasFlux) {
421 explicitParts_.fluxDivergence(entity, quad[qp], values, jacobian, hessian, tmp);
424 if (ExplicitConstituents::hasSources) {
426 explicitParts_.source(entity, quad[qp], values, jacobian, tmp);
429 if (ExplicitConstituents::hasBulkForces) {
432 fOldLocal.evaluate(x, tmp);
436 localIndicators_[index] += hFactor * weight * (el_res * el_res);
440 RangeType deltaU = values;
443 timeIndicator_ += weight * (deltaU * deltaU);
447 IntersectionIteratorType end = gridPart_.iend(entity);
448 for (IntersectionIteratorType it = gridPart_.ibegin(entity); it != end; ++it) {
449 const IntersectionType &intersection = *it;
451 bool isRobin = implicitParts_.setIntersection(intersection);
456 }
else if (intersection.neighbor()) {
459 }
else if (intersection.boundary()) {
462 neumannBndry_.applies(intersection),
469 template<
class DiscreteFunctionType>
471 const ElementType &inside,
472 const DiscreteFunctionType& uh,
473 const typename DiscreteFunctionType::LocalFunctionType &uInside)
475 typedef typename DiscreteFunctionType::LocalFunctionType LocalFunctionType;
478 const auto outside = intersection.outside();
480 const int insideIndex = indexSet_.index(inside);
481 const int outsideIndex = indexSet_.index(outside);
483 const bool isOutsideInterior = (outside.partitionType() == Dune::InteriorEntity);
484 if (!isOutsideInterior || (insideIndex < outsideIndex)) {
485 const LocalFunctionType uOutside = uh.localFunction(outside);
487 RangeFieldType error;
489 if (intersection.conforming())
490 error = estimateIntersection<true>(intersection, inside, uInside, outside, uOutside);
492 error = estimateIntersection<false>(intersection, inside, uInside, outside, uOutside);
495 const RangeFieldType volume
496 = 0.5 * (inside.geometry().volume() + outside.geometry().volume());
497 const RangeFieldType h = (dimension == 1 ? volume : std::pow(volume, 1.0 / (RangeFieldType)dimension));
498 const RangeFieldType hFactor = Norm == L2Norm ? h * h * h : h;
499 localIndicators_[insideIndex] += hFactor * error;
500 if (isOutsideInterior) {
501 localIndicators_[outsideIndex] += hFactor * error;
508 template<
bool conforming,
class LocalFunctionType>
510 const ElementType &inside,
511 const LocalFunctionType &uInside,
512 const ElementType &outside,
513 const LocalFunctionType &uOutside)
const
516 assert(intersection.conforming() == conforming);
519 typedef Dune::Fem::IntersectionQuadrature<FaceQuadratureType, conforming> IntersectionQuadratureType;
520 typedef typename IntersectionQuadratureType::FaceQuadratureType Quadrature ;
522 const int quadOrder = 2 * (dfSpace_.order() - 1);
524 IntersectionQuadratureType intersectionQuad(gridPart_, intersection, quadOrder);
527 const Quadrature &quadInside = intersectionQuad.inside();
528 const Quadrature &quadOutside = intersectionQuad.outside();
530 const int numQuadraturePoints = quadInside.nop();
532 implicitPartsNeighbour_.setEntity(outside);
534 RangeFieldType error = 0.0;
535 for (
int qp = 0; qp < numQuadraturePoints; ++qp) {
536 DomainType integrationNormal
537 = intersection.integrationOuterNormal(quadInside.localPoint(qp));
538 const RangeFieldType integrationElement = integrationNormal.two_norm();
544 RangeType valueInside;
545 JacobianRangeType jacobianInside;
546 JacobianRangeType fluxInside;
547 uInside.evaluate(quadInside[qp], valueInside);
548 uInside.jacobian(quadInside[qp], jacobianInside);
549 implicitParts_.flux(inside, quadInside[qp], valueInside, jacobianInside,
552 RangeType valueOutside;
553 JacobianRangeType jacobianOutside;
554 JacobianRangeType fluxOutside;
555 uOutside.evaluate(quadOutside[qp], valueOutside);
556 uOutside.jacobian(quadOutside[qp], jacobianOutside);
557 implicitPartsNeighbour_.flux(outside, quadOutside[qp], valueOutside, jacobianOutside,
561 JacobianRangeType& fluxJump(fluxInside);
562 fluxJump -= fluxOutside;
566 fluxJump.mv(integrationNormal, jump);
568 error += quadInside.weight(qp) * (jump * jump) / integrationElement;
578 if (commJumpStorage_.size() == 0) {
583 const bool verbose = Dune::Fem::Parameter::getValue<int>(
"fem.verboserank", -1) != -1;
587 gridPart_.communicate(dataHandle,
588 InteriorBorder_InteriorBorder_Interface,
589 ForwardCommunication);
595 auto commEnd = commJumpStorage_.end();
596 auto localEnd = localJumpStorage_.end();
597 auto commIt = commJumpStorage_.begin();
598 auto localIt = localJumpStorage_.begin();
600 while (commIt != commEnd) {
601 assert(commIt->first == localIt->first);
603 const LocalIntersectionStorage& localData = localIt->second;
604 const IntersectionStorageType& commData = commIt->second;
606 const size_t numQuadraturePoints = localData.size();
607 assert(numQuadraturePoints+1 == commData.size());
610 RangeFieldType error = 0.0;
611 for (
unsigned qp = 0; qp < numQuadraturePoints; ++qp) {
612 error += localData[qp] * (commData[qp] * commData[qp]);
617 RangeFieldType h = localData.hEstimate() + commData[numQuadraturePoints][0];
618 RangeFieldType hFactor = Norm == L2Norm ? h * h * h : h;
622 localIndicators_[localData.bulkEntityIndex()] += error;
624 errorMin[comm] = std::min(errorMin[comm], error);
625 errorMax[comm] =
std::max(errorMax[comm], error);
631 assert(localIt == localEnd);
634 size_t nFaces = commJumpStorage_.size();
635 nFaces = grid_.comm().sum(nFaces);
637 if (Dune::Fem::Parameter::verbose()) {
638 dwarn <<
"*** Processor Boundaries: "
639 << (RangeFieldType)nFaces/2.0
640 <<
" Faces ***" << std::endl;
657 template<
class LocalFunctionType>
659 const ElementType &inside,
660 const LocalFunctionType &uInside)
662 if (intersection.conforming()) {
663 estimateProcessBoundary<true>(intersection, inside, uInside);
665 estimateProcessBoundary<false>(intersection, inside, uInside);
673 template<
bool conforming,
class LocalFunctionType>
675 const ElementType &inside,
676 const LocalFunctionType &uInside)
679 assert(intersection.conforming() == conforming);
682 typedef Dune::Fem::IntersectionQuadrature<FaceQuadratureType, conforming> IntersectionQuadratureType;
683 typedef typename IntersectionQuadratureType::FaceQuadratureType Quadrature ;
685 const int quadOrder = 2 * (dfSpace_.order() - 1);
687 IntersectionQuadratureType intersectionQuad(gridPart_, intersection, quadOrder);
690 const Quadrature &quadInside = intersectionQuad.inside();
691 const int numQuadraturePoints = quadInside.nop();
694 IndexType faceIndex = indexSet_.index(inside.template subEntity<1>(intersection.indexInInside()));
695 IndexType bulkIndex = indexSet_.index(inside);
701 IntersectionStorageType commData = IntersectionStorageType(numQuadraturePoints+1);
702 LocalIntersectionStorage localData = LocalIntersectionStorage(bulkIndex, numQuadraturePoints);
704 for (
int qp = 0; qp < numQuadraturePoints; ++qp) {
705 DomainType integrationNormal
706 = intersection.integrationOuterNormal(quadInside.localPoint(qp));
707 const RangeFieldType integrationElement = integrationNormal.two_norm();
708 integrationNormal /= integrationElement;
714 RangeType valueInside;
715 JacobianRangeType jacobianInside;
716 JacobianRangeType fluxInside;
717 uInside.evaluate(quadInside[qp], valueInside);
718 uInside.jacobian(quadInside[qp], jacobianInside);
719 implicitParts_.flux(inside, quadInside[qp], valueInside, jacobianInside,
723 fluxInside.mv(integrationNormal, commData[qp]);
726 localData[qp] = quadInside.weight(qp) * integrationElement;
728 localData.hEstimate() =
hEstimate(inside.geometry());
730 commData[numQuadraturePoints][0] = localData.hEstimate();
732 commJumpStorage_[faceIndex] = commData;
733 localJumpStorage_[faceIndex] = localData;
743 template<
class LocalFunctionType>
745 const ElementType &inside,
746 const LocalFunctionType &uLocal,
747 bool isNeumann,
bool isRobin)
749 assert(intersection.conforming() ==
true);
751 if (!isNeumann && !isRobin) {
756 const NeumannLocalFunctionType neumannLocal = neumannFunction_.localFunction(inside, intersection);
758 typedef Dune::Fem::IntersectionQuadrature<FaceQuadratureType,
true > IntersectionQuadratureType;
759 typedef typename IntersectionQuadratureType::FaceQuadratureType Quadrature ;
763 int quadOrder = isRobin ? 2*dfSpace_.order() : 2*(dfSpace_.order() - 1);
766 IntersectionQuadratureType intersectionQuad(gridPart_, intersection, quadOrder);
768 const Quadrature &bndryQuad = intersectionQuad.inside();
769 const int numQuadraturePoints = bndryQuad.nop();
771 RangeFieldType error = 0.0;
773 for (
int qp = 0; qp < numQuadraturePoints; ++qp) {
774 const RangeFieldType weight = bndryQuad.weight(qp);
777 DomainType integrationNormal
778 = intersection.integrationOuterNormal(bndryQuad.localPoint(qp));
780 const RangeFieldType integrationElement = integrationNormal.two_norm();
781 integrationNormal /= integrationElement;
784 uLocal.evaluate(bndryQuad[qp], value);
785 JacobianRangeType jacobian;
786 uLocal.jacobian(bndryQuad[qp], jacobian);
788 JacobianRangeType flux;
789 implicitParts_.flux(inside, bndryQuad[qp], value, jacobian, flux);
792 flux.mv(integrationNormal, residual);
796 implicitParts_.robinFlux(intersection, bndryQuad[qp], integrationNormal, value, alphau);
802 neumannLocal.evaluate(bndryQuad[qp], gN);
806 error += weight * integrationElement * (residual * residual);
811 const int insideIndex = indexSet_.index(inside);
813 const RangeFieldType volume = inside.geometry().volume();
815 const RangeFieldType h = (dimension == 1 ? volume : std::pow(volume, 1.0 / (RangeFieldType)dimension));
816 const RangeFieldType hFactor = Norm == L2Norm ? h * h * h : h;
817 localIndicators_[insideIndex] += hFactor * error;
822 template<
class OldSolutionFunction,
class TimeProv
ider,
class ImplicitModel,
class ExplicitModel>
823 struct EstimatorTraits<ParabolicEulerEstimator<OldSolutionFunction, TimeProvider, ImplicitModel, ExplicitModel> >
825 typedef typename OldSolutionFunction::DiscreteFunctionSpaceType DiscreteFunctionSpaceType;
827 std::vector<typename DiscreteFunctionSpaceType::RangeFieldType>::const_iterator
General intersection - intersection communication which communicates for each intersection a potentia...
Definition: intersectiondatahandle.hh:48
Interface class for second order elliptic models.
Definition: modelinterface.hh:192
NeumannBoundaryFunctionType neumannBoundaryFunction(const GridPartType &gridPart) const
Generate an instance of a class defining Neumann boundary values as a Fem grid-function.
Definition: modelinterface.hh:302
OperatorPartsType operatorParts() const
Return the integral kernels for the bilinear form.
Definition: modelinterface.hh:253
BulkForcesFunctionType bulkForcesFunction(const GridPartType &gridPart) const
Generate an instance of a class defining the bulk-forces the model is subject to.
Definition: modelinterface.hh:263
TraitsType::DirichletBoundaryFunctionType DirichletBoundaryFunctionType
A BoundarySupportedFunction which must be sub-ordinate to the DirichletIndicatorType.
Definition: modelinterface.hh:241
TraitsType::DirichletIndicatorType DirichletIndicatorType
A BoundarySupportedFunction which must be sub-ordinate to the DirichletIndicatorType.
Definition: modelinterface.hh:243
TraitsType::BulkForcesFunctionType BulkForcesFunctionType
A function modelling "force" terms in the bulk-phase.
Definition: modelinterface.hh:226
TraitsType::NeumannBoundaryFunctionType NeumannBoundaryFunctionType
A function modelling "force" terms in the bulk-phase.
Definition: modelinterface.hh:227
TraitsType::NeumannIndicatorType NeumannIndicatorType
A function modelling "force" terms in the bulk-phase.
Definition: modelinterface.hh:228
NeumannIndicatorType neumannIndicator() const
Generate an object to identify parts of the boundary subject to Neumann boundary conditions.
Definition: modelinterface.hh:318
Residual estimator for the heat equation.
Definition: parabolicestimator.hh:60
void estimateBoundary(const IntersectionType &intersection, const ElementType &inside, const LocalFunctionType &uLocal, bool isNeumann, bool isRobin)
caclulate error over a boundary segment; yields zero for Dirichlet boundary values,...
Definition: parabolicestimator.hh:744
void communicateJumpContributions()
Helper function in order to add the jump contributions on inter-process boundaries.
Definition: parabolicestimator.hh:576
void estimateLocal(const ElementType &entity, const DiscreteFunctionType &uh)
caclulate error on element
Definition: parabolicestimator.hh:355
void estimateIntersection(const IntersectionType &intersection, const ElementType &inside, const DiscreteFunctionType &uh, const typename DiscreteFunctionType::LocalFunctionType &uInside)
caclulate error on element boundary intersections
Definition: parabolicestimator.hh:470
void estimateProcessBoundary(const IntersectionType &intersection, const ElementType &inside, const LocalFunctionType &uInside)
Compute the jump contribution to the estimator on process-boundaries.
Definition: parabolicestimator.hh:658
void estimateProcessBoundary(const IntersectionType &intersection, const ElementType &inside, const LocalFunctionType &uInside)
Helper function for estimateProcessBoundary() in order to distinguish between conforming and non-conf...
Definition: parabolicestimator.hh:674
RangeFieldType estimateIntersection(const IntersectionType &intersection, const ElementType &inside, const LocalFunctionType &uInside, const ElementType &outside, const LocalFunctionType &uOutside) const
caclulate error on element intersections
Definition: parabolicestimator.hh:509
RangeFieldType estimate(const DiscreteFunctionType &uh)
calculate estimator
Definition: parabolicestimator.hh:250
bool isProcessorBoundary(const Intersection &intersection)
Retrun true if at the border to another computing note.
Definition: boundaryindicator.hh:134
Geometry::ctype hEstimate(const Geometry &geometry)
Compute a rough estimate of the diameter of the element's Geometry.
Definition: geometry.hh:39
LocalFunctionWrapper< LocalMaxAdapter< GridFunction1, GridFunction2 >, typename GridFunction1::GridPartType > max(const Fem::Function< typename GridFunction1::FunctionSpaceType, GridFunction1 > &f1, const Fem::Function< typename GridFunction2::FunctionSpaceType, GridFunction2 > &f2, const std::string &name="")
Pointwise maximum of two given functions.
Definition: maxfunction.hh:121
A helper class which identifies which components are provided by the given model.
Definition: modelinterface.hh:447