|
dune-fem 2.12-git
|
Loading...
Searching...
No Matches
galerkin.hh
Go to the documentation of this file.
62 std::cerr << "WARNING: no order method available on " << typeid(F).name() << ", defaulting to 1!" << std::endl;
90 typedef CachingQuadrature< GridPartType, 0, Capabilities::DefaultQuadrature< Space > :: template DefaultQuadratureTraits > InteriorQuadratureType;
91 typedef CachingQuadrature< GridPartType, 1, Capabilities::DefaultQuadrature< Space > :: template DefaultQuadratureTraits > SurfaceQuadratureType;
99 typedef ElementQuadrature< GridPartType, 0, Capabilities::DefaultQuadrature< Space > :: template DefaultQuadratureTraits > InteriorQuadratureType;
100 typedef ElementQuadrature< GridPartType, 1, Capabilities::DefaultQuadrature< Space > :: template DefaultQuadratureTraits > SurfaceQuadratureType;
104 typedef typename AnotherQuadSelector< GridType >::InteriorQuadratureType InteriorQuadratureType;
111 template< class Integrands, template <class> class QuadSelector = DefaultGalerkinOperatorQuadratureSelector >
115 typedef std::conditional_t< Fem::IntegrandsTraits< Integrands >::isFull, Integrands, FullIntegrands< Integrands > > IntegrandsType;
140 typedef std::make_index_sequence< std::tuple_size< DomainValueType >::value > DomainValueIndices;
147 return std::make_tuple( std::vector< std::tuple_element_t< i, DomainValueType > >( maxNumLocalDofs )... );
158 return std::make_tuple( std::vector< std::tuple_element_t< i, RangeValueType > >( maxNumLocalDofs )... );
194 static void evaluateQuadrature ( const LocalFunction &u, const Quadrature &quad, std::vector< typename LocalFunction::RangeType > &phi )
200 static void evaluateQuadrature ( const LocalFunction &u, const Quadrature &quad, std::vector< typename LocalFunction::JacobianRangeType > &phi )
206 static void evaluateQuadrature ( const LocalFunction &u, const Quadrature &quad, std::vector< typename LocalFunction::HessianRangeType > &phi )
213 static void value ( const LocalFunction &u, const Point &x, typename LocalFunction::RangeType &phi )
219 static void value ( const LocalFunction &u, const Point &x, typename LocalFunction::JacobianRangeType &phi )
225 static void value ( const LocalFunction &u, const Point &x, typename LocalFunction::HessianRangeType &phi )
233 Hybrid::forEach( std::index_sequence_for< T... >(), [ &u, &x, &phi ] ( auto i ) { LocalGalerkinOperator::value( u, x, std::get< i >( phi ) ); } );
237 static void values ( const Basis &basis, const Point &x, std::vector< typename Basis::RangeType > &phi )
243 static void values ( const Basis &basis, const Point &x, std::vector< typename Basis::JacobianRangeType > &phi )
249 static void values ( const Basis &basis, const Point &x, std::vector< typename Basis::HessianRangeType > &phi )
255 static void values ( const Basis &basis, const Point &x, std::tuple< std::vector< T >... > &phi )
257 Hybrid::forEach( std::index_sequence_for< T... >(), [ &basis, &x, &phi ] ( auto i ) { LocalGalerkinOperator::values( basis, x, std::get< i >( phi ) ); } );
278 static void domainValue ( const LocalFunction &u, const Quadrature& quadrature, DomainValueVectorType &result )
299 static void assignRange( RangeValueVectorType& ranges, const std::size_t idx, const RangeValueType& range )
306 static void assignRange( RangeValueVectorType& ranges, const std::size_t idx, const RangeValueType& range, const W &weight )
314 static void assignDomain( DomainValueVectorType& domains, const std::size_t idx, const DomainValueType& domain )
340 typedef typename QuadratureSelector< typename W::DiscreteFunctionSpaceType > :: InteriorQuadratureType InteriorQuadratureType;
354 assignRange( ranges, qp.index(), integrands().interior( qp, domainValue( qp.index(), domains ) ), weight );
372 typedef typename QuadratureSelector< typename J::RangeSpaceType > :: InteriorQuadratureType InteriorQuadratureType;
373 const InteriorQuadratureType quadrature( u.entity(), interiorQuadratureOrder( maxOrder( u, domainBasis, rangeBasis )) );
421 typedef typename QuadratureSelector< typename W::DiscreteFunctionSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
422 const SurfaceQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(maxOrder( u, w )), SurfaceQuadratureType::INSIDE );
449 typedef typename QuadratureSelector< typename J::RangeSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
450 const SurfaceQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(maxOrder(u, domainBasis, rangeBasis )), SurfaceQuadratureType::INSIDE );
476 void addSkeletonIntegral ( const Intersection &intersection, const U &uIn, const U &uOut, W &wIn ) const
480 typedef typename QuadratureSelector< typename W::DiscreteFunctionSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
482 const IntersectionQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(maxOrder( uIn, uOut, wIn)), false );
492 const ctype weight = quadrature.weight( qp ) * geometry.integrationElement( quadrature.localPoint( qp ) );
497 = integrands().skeleton( qpIn, domainValue( qp, domainsIn ), qpOut, domainValue( qp, domainsOut ) );
507 void addSkeletonIntegral ( const Intersection &intersection, const U &uIn, const U &uOut, W &wIn, W &wOut ) const
510 typedef typename QuadratureSelector< typename W::DiscreteFunctionSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
512 const IntersectionQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(maxOrder( uIn, uOut, wIn, wOut)), false );
522 const ctype weight = quadrature.weight( qp ) * geometry.integrationElement( quadrature.localPoint( qp ) );
527 = integrands().skeleton( qpIn, domainValue( qp, domainsIn ), qpOut, domainValue( qp, domainsOut ) );
529 Hybrid::forEach( RangeValueIndices(), [ &qpIn, &wIn, &qpOut, &wOut, &integrand, weight ] ( auto i ) {
551 const int order = std::max( maxOrder(uIn, uOut), maxOrder( domainBasisIn, domainBasisOut, rangeBasisIn ));
554 typedef typename QuadratureSelector< typename J::RangeSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
556 const IntersectionQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(order), false );
566 const ctype weight = quadrature.weight( qp ) * geometry.integrationElement( quadrature.localPoint( qp ) );
574 auto integrand = integrands().linearizedSkeleton( qpIn, domainValue( qp, domainsIn ), qpOut, domainValue( qp, domainsOut ) );
599 void addLinearizedSkeletonIntegral ( const Intersection &intersection, const U &uIn, const U &uOut,
611 const int order = std::max( maxOrder(uIn, uOut), maxOrder( domainBasisIn, domainBasisOut, rangeBasisIn, rangeBasisOut ));
614 typedef typename QuadratureSelector< typename J::RangeSpaceType > :: SurfaceQuadratureType SurfaceQuadratureType;
616 const IntersectionQuadratureType quadrature( gridPart(), intersection, surfaceQuadratureOrder(order), false );
626 const ctype weight = quadrature.weight( qp ) * geometry.integrationElement( quadrature.localPoint( qp ) );
634 auto integrand = integrands().linearizedSkeleton( qpIn, domainValue( qp, domainsIn ), qpOut, domainValue( qp, domainsOut ) );
641 Hybrid::forEach( RangeValueIndices(), [ &qpIn, &jInInCol, &qpOut, &jInOutCol, &intPhi, weight ] ( auto i ) {
655 Hybrid::forEach( RangeValueIndices(), [ &qpIn, &jOutInCol, &qpOut, &jOutOutCol, &intPhi, weight ] ( auto i ) {
668 void addSkeletonIntegral ( const Intersection &intersection, const U &uIn, const U &uOut, W &... w ) const
681 void addLinearizedSkeletonIntegral ( const Intersection &intersection, const U &uIn, const U &uOut, J &... j ) const
725 unsigned int interiorQuadratureOrder(unsigned int order) const { return interiorQuadOrder_ == 0 ? defaultInteriorOrder_(order) : interiorQuadOrder_; }
726 unsigned int surfaceQuadratureOrder(unsigned int order) const { return surfaceQuadOrder_ == 0 ? defaultSurfaceOrder_ (order) : surfaceQuadOrder_; }
779 // Integrands, template <class> class QuadSelector = DefaultGalerkinOperatorQuadratureSelector >
811 template< class GridFunction, class DiscreteFunction, class Iterators, class IntegrandsTuple, class Functor, bool hasSkeleton >
813 const IntegrandsTuple& integrandsTuple, Functor& addLocalDofs, std::integral_constant<bool, hasSkeleton> ) const
819 TemporaryLocalFunction< DiscreteFunctionSpaceType > wInside( w.space() ), wOutside( w.space() );
870 auto addSkeletonIntegral = [&integrandsTuple, &intersection, &uInside, &uOutside, &wInside] ( auto i )
885 auto addSkeletonIntegral = [&integrandsTuple, &intersection, &uInside, &uOutside, &wInside, &wOutside] ( auto i )
993 template< class GridFunction, class DiscreteFunction, class Iterators, class IntegrandsTuple, class Functor >
997 static_assert( std::is_same< typename GridFunction::GridPartType, GridPartType >::value, "Argument 'u' and Integrands must be defined on the same grid part." );
998 static_assert( std::is_same< typename DiscreteFunction::GridPartType, GridPartType >::value, "Argument 'w' and Integrands must be defined on the same grid part." );
1031 void evaluate ( const GridFunction &u, DiscreteFunction &w, const Iterators& iterators, const IntegrandsTuple& integrandsTuple ) const
1149 AddLocalAssembleLocked(JacobianOperator &jOp, std::shared_mutex &mtx, const Iterators &iterators)
1195 template< class GridFunction, class JacobianOperator, class Iterators, class IntegrandsTuple, class Functor, bool hasSkeleton >
1196 void assembleImpl ( const GridFunction &u, JacobianOperator &jOp, const Iterators& iterators, const IntegrandsTuple& integrandsTuple,
1208 const std::size_t maxNumLocalDofs = jOp.domainSpace().blockMapper().maxNumDofs() * jOp.domainSpace().localBlockSize;
1264 auto addLinearizedSkeletonIntegral = [&integrandsTuple, &intersection, &uIn, &uOut, &jOpInIn, &jOpOutIn]( auto i )
1278 auto addLinearizedSkeletonIntegral = [&integrandsTuple, &intersection, &uIn, &uOut, &jOpInIn, &jOpOutIn, &jOpInOut, &jOpOutOut]( auto i )
1282 integrands.addLinearizedSkeletonIntegral( intersection, uIn, uOut, jOpInIn, jOpOutIn, jOpInOut, jOpOutOut );
1297 auto addLinearizedBoundaryIntegral = [&integrandsTuple, &intersection, &uIn, &jOpInIn]( auto i )
1317 template< class GridFunction, class JacobianOperator, class Iterators, class IntegrandsTuple, class Functor >
1321 static_assert( std::is_same< typename GridFunction::GridPartType, GridPartType >::value, "Argument 'u' and Integrands must be defined on the same grid part." );
1322 static_assert( std::is_same< typename JacobianOperator::DomainSpaceType::GridPartType, GridPartType >::value, "Argument 'jOp' and Integrands must be defined on the same grid part." );
1323 static_assert( std::is_same< typename JacobianOperator::RangeSpaceType::GridPartType, GridPartType >::value, "Argument 'jOp' and Integrands must be defined on the same grid part." );
1347 void assemble ( const GridFunction &u, JacobianOperator &jOp, const Iterators& iterators, const IntegrandsTuple& integrandsTuple ) const
1395 static_assert( std::is_same< typename DomainFunctionType::GridPartType, typename RangeFunctionType::GridPartType >::value, "DomainFunction and RangeFunction must be defined on the same grid part." );
1430 virtual void operator() ( const DomainFunctionType &u, RangeFunctionType &w ) const final override
1513 : public GalerkinOperator< Integrands, typename JacobianOperator::DomainFunctionType, typename JacobianOperator::RangeFunctionType >,
1516 typedef GalerkinOperator< Integrands, typename JacobianOperator::DomainFunctionType, typename JacobianOperator::RangeFunctionType > BaseType;
1524 typedef typename DomainFunctionType::DiscreteFunctionSpaceType DomainDiscreteFunctionSpaceType;
1527 typedef DiagonalAndNeighborStencil< DomainDiscreteFunctionSpaceType, RangeDiscreteFunctionSpaceType > DiagonalAndNeighborStencilType;
1528 typedef DiagonalStencil< DomainDiscreteFunctionSpaceType, RangeDiscreteFunctionSpaceType > DiagonalStencilType;
1548 virtual void jacobian ( const DomainFunctionType &u, JacobianOperatorType &jOp ) const final override
1668 typedef AutomaticDifferenceOperator< DomainFunction, RangeFunction > AutomaticDifferenceOperatorType;
1695 ModelDifferentiableGalerkinOperator ( ModelType &model, const DiscreteFunctionSpaceType &dfSpace )
1737 template< class Integrands, class LinearOperator, class LinearInverseOperator, bool addDirichletBC,
1738 template <class,class> class DifferentiableGalerkinOperatorImpl = DifferentiableGalerkinOperator >
1766 using GalerkinScheme = Impl::GalerkinSchemeImpl< Integrands, LinearOperator, InverseOperator, addDirichletBC,
void communicate(CC &cc)
const char * name()
Col col
void init(const Matrix *matrix)
auto cols(Matrix const &matrix)
int size() const
iterator end()
void clear()
static constexpr IntegralRange< std::decay_t< T > > range(T &&from, U &&to) noexcept
constexpr void forEach(Range &&range, F &&f)
void pop()
void push(bool b)
virtual void operator()()=0
const GlobalIndex & global() const
LocalIndex & local()
InteriorEntity
const IndexSet & indexSet() const
IteratorRange<... > intersections(const GV &gv, const Entity &e)
constexpr Interior interior
STL namespace.
Impl::GalerkinSchemeImpl< Integrands, LinearOperator, InverseOperator, addDirichletBC, DifferentiableGalerkinOperator > GalerkinScheme
Definition galerkin.hh:1767
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition const.hh:626
BasicParameterReader< std::function< const std::string *(const std::string &, const std::string *) > > ParameterReader
Definition reader.hh:316
static auto bindGuard(Object &object, Args &&... args) -> std::enable_if_t< isBindable< Object, Args... >::value, BindGuard< Object > >
Definition bindguard.hh:67
IndexType index(const typename Traits::template Codim< cc >::Entity &e) const
FunctionSpaceType::RangeType RangeType
type of range vectors, i.e., type of function values
Definition localfunction.hh:110
FunctionSpaceType::HessianRangeType HessianRangeType
type of the Hessian
Definition localfunction.hh:114
FunctionSpaceType::JacobianRangeType JacobianRangeType
type of the Jacobian, i.e., type of evaluated Jacobian matrix
Definition localfunction.hh:112
static ParameterContainer & container()
Definition io/parameter.hh:199
static bool verbose()
obtain the cached value for fem.verbose with default verbosity level 2
Definition io/parameter.hh:466
static bool apply(const EntityType &entity)
Definition hasboundaryintersection.hh:13
Exception thrown when a code segment that is supposed to be only accessed in single thread mode is ac...
Definition mpimanager.hh:43
void update()
update internal list of iterators
Definition threaditerator.hh:93
size_t size() const
return number of threads
Definition threadsafevalue.hh:62
operator providing a Jacobian through automatic differentiation
Definition automaticdifferenceoperator.hh:86
abstract differentiable operator
Definition differentiableoperator.hh:29
DomainFunction DomainFunctionType
type of discrete function in the operator's domain
Definition operator.hh:36
Stencil contaning the entries (en,en) for all entities in the space. Defailt for an operator over a L...
Definition stencil.hh:349
Stencil contaning the entries (en,en) and (en,nb) for all entities en in the space and neighbors nb o...
Definition stencil.hh:387
Definition dirichletwrapper.hh:31
FemScheme(const DiscreteFunctionSpaceType &space, ModelType &model, const Dune::Fem::ParameterReader ¶meter=Dune::Fem::Parameter::container())
constructor with one model
Definition femscheme.hh:82
Definition galerkin.hh:1386
GalerkinOperator(const GridPartType &gridPart, Args &&... args)
Definition galerkin.hh:1400
const GridPartType & gridPart() const
Definition galerkin.hh:1441
void evaluate(const GridFunction &u, RangeFunctionType &w) const
Definition galerkin.hh:1460
Impl::GalerkinOperator< GridPartType > GalerkinOperatorImplType
Definition galerkin.hh:1393
ThreadIterator< GridPartType > ThreadIteratorType
Definition galerkin.hh:1397
const GalerkinOperatorImplType & op() const
for implementation purposes
Definition galerkin.hh:1457
const LocalGalerkinOperatorImplType & localOperator() const
return local operator holding instance of integrands
Definition galerkin.hh:1451
const LocalGalerkinOperatorImplType & impl() const
Definition galerkin.hh:1448
virtual bool nonlinear() const final override
Definition galerkin.hh:1425
std::size_t gridSizeInterior_
Definition galerkin.hh:1502
Integrands DirichletModelType
Definition galerkin.hh:1444
ThreadSafeValue< LocalGalerkinOperatorImplType > localOp_
Definition galerkin.hh:1500
DomainFunction DomainFunctionType
Definition galerkin.hh:1387
RangeFunction RangeFunctionType
Definition galerkin.hh:1388
std::size_t gridSizeInterior() const
Definition galerkin.hh:1453
RangeFunctionType::GridPartType GridPartType
Definition galerkin.hh:1390
void setQuadratureOrders(unsigned int interior, unsigned int surface)
Definition galerkin.hh:1418
Impl::LocalGalerkinOperator< Integrands > LocalGalerkinOperatorImplType
Definition galerkin.hh:1392
ThreadSafeValue< GalerkinOperatorImplType > opImpl_
Definition galerkin.hh:1499
void setCommunicate(const bool communicate)
Definition galerkin.hh:1409
Definition galerkin.hh:1515
int domainSpaceSequence_
Definition galerkin.hh:1651
BaseType::DomainFunctionType DomainFunctionType
Definition galerkin.hh:1522
DiagonalStencil< DomainDiscreteFunctionSpaceType, RangeDiscreteFunctionSpaceType > DiagonalStencilType
Definition galerkin.hh:1528
BaseType::GridPartType GridPartType
Definition galerkin.hh:1530
const GalerkinOperatorImplType & op() const
for implementation purposes
Definition galerkin.hh:1457
void jacobian(const GridFunction &u, JacobianOperatorType &jOp) const
Definition galerkin.hh:1554
const LocalGalerkinOperatorImplType & localOperator() const
return local operator holding instance of integrands
Definition galerkin.hh:1451
RangeFunctionType::DiscreteFunctionSpaceType RangeDiscreteFunctionSpaceType
Definition galerkin.hh:1525
virtual void jacobian(const DomainFunctionType &u, JacobianOperatorType &jOp) const final override
obtain linearization
Definition galerkin.hh:1548
void prepare(JacobianOperatorType &jOp) const
Definition galerkin.hh:1580
BaseType::RangeFunctionType RangeFunctionType
Definition galerkin.hh:1523
int rangeSpaceSequence_
Definition galerkin.hh:1651
std::size_t gridSizeInterior_
Definition galerkin.hh:1502
const RangeDiscreteFunctionSpaceType & rangeSpace() const
Definition galerkin.hh:1563
std::unique_ptr< DiagonalAndNeighborStencilType > stencilDAN_
Definition galerkin.hh:1653
DomainFunctionType::DiscreteFunctionSpaceType DomainDiscreteFunctionSpaceType
Definition galerkin.hh:1524
const RangeDiscreteFunctionSpaceType & rSpace_
Definition galerkin.hh:1649
ThreadIteratorType iterators_
Definition galerkin.hh:1498
std::unique_ptr< DiagonalStencilType > stencilD_
Definition galerkin.hh:1654
JacobianOperator JacobianOperatorType
Definition galerkin.hh:1520
DiagonalAndNeighborStencil< DomainDiscreteFunctionSpaceType, RangeDiscreteFunctionSpaceType > DiagonalAndNeighborStencilType
Definition galerkin.hh:1527
void assemble(const GridFunction &u, JacobianOperatorType &jOp) const
Definition galerkin.hh:1607
const DomainDiscreteFunctionSpaceType & dSpace_
Definition galerkin.hh:1648
const DomainDiscreteFunctionSpaceType & domainSpace() const
Definition galerkin.hh:1559
DifferentiableGalerkinOperator(const DomainDiscreteFunctionSpaceType &dSpace, const RangeDiscreteFunctionSpaceType &rSpace, Args &&... args)
Definition galerkin.hh:1533
bool hasSkeleton() const
Definition galerkin.hh:1574
Definition galerkin.hh:1666
BaseType::GridPartType GridPartType
Definition galerkin.hh:1671
AutomaticDifferenceGalerkinOperator(const GridPartType &gridPart, Args &&... args)
Definition galerkin.hh:1674
Definition galerkin.hh:1687
ModelDifferentiableGalerkinOperator(ModelType &model, const DiscreteFunctionSpaceType &dfSpace)
Definition galerkin.hh:1695
ModelIntegrands::ModelType ModelType
Definition galerkin.hh:1690
LinearOperator::DomainFunctionType RangeFunctionType
Definition galerkin.hh:1692
void apply(const GridFunction &u, RangeFunctionType &w) const
Definition galerkin.hh:1700
DifferentiableGalerkinOperator< ModelIntegrands, LinearOperator > BaseType
Definition galerkin.hh:1688
LinearOperator::RangeSpaceType DiscreteFunctionSpaceType
Definition galerkin.hh:1693
void apply(const GridFunction &u, LinearOperator &jOp) const
Definition galerkin.hh:1706
quadrature on the codim-0 reference element
actual interface class for quadratures
T bind(T... args)
T empty(T... args)
T endl(T... args)
T forward(T... args)
T make_tuple(T... args)
T max(T... args)
T move(T... args)
T space(T... args)
Legal Statements / Impressum | Hosted by TU Dresden & Uni Heidelberg | Generated by
1.9.8