1 #ifndef DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH 2 #define DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH 4 #include <dune/common/typetraits.hh> 22 template<
typename GFSU,
typename GFSV,
typename CU,
typename CV,
bool nonoverlapping_mode=false>
29 using Element =
typename EntitySet::Element;
40 typedef typename GFSU::Traits::SizeType
SizeType;
85 template<
class LocalAssemblerEngine>
92 const bool needs_constraints_caching = assembler_engine.needsConstraintsCaching(cu,cv);
94 LFSUCache lfsu_cache(lfsu,cu,needs_constraints_caching);
95 LFSVCache lfsv_cache(lfsv,cv,needs_constraints_caching);
96 LFSUCache lfsun_cache(lfsun,cu,needs_constraints_caching);
97 LFSVCache lfsvn_cache(lfsvn,cv,needs_constraints_caching);
113 auto entity_set = gfsu.entitySet();
114 auto& index_set = entity_set.indexSet();
117 for (
const auto& element : elements(entity_set))
120 auto ids = index_set.uniqueIndex(element);
128 lfsv.bind( element );
138 lfsu.bind( element );
142 assembler_engine.
onBindLFSUV(eg,lfsu_cache,lfsv_cache);
151 if (require_uv_skeleton || require_v_skeleton ||
152 require_uv_boundary || require_v_boundary ||
153 require_uv_processor || require_v_processor)
156 unsigned int intersection_index = 0;
157 for(
const auto& intersection : intersections(entity_set,element))
163 auto intersection_type = std::get<0>(intersection_data);
164 auto& outside_element = std::get<1>(intersection_data);
166 switch (intersection_type)
172 if (require_uv_skeleton || require_v_skeleton)
176 auto idn = index_set.uniqueIndex(outside_element);
179 bool visit_face = ids > idn || require_skeleton_two_sided;
185 lfsvn.bind(outside_element);
186 lfsvn_cache.update();
194 if(require_uv_skeleton){
197 lfsun.bind(outside_element);
198 lfsun_cache.update();
202 lfsu_cache,lfsv_cache,
203 lfsun_cache,lfsvn_cache);
209 assembler_engine.
assembleUVSkeleton(ig,lfsu_cache,lfsv_cache,lfsun_cache,lfsvn_cache);
213 lfsu_cache,lfsv_cache,
214 lfsun_cache,lfsvn_cache);
224 if(require_uv_boundary || require_v_boundary )
230 if(require_uv_boundary){
238 if(require_uv_processor || require_v_processor )
244 if(require_uv_processor){
252 ++intersection_index;
256 if(require_uv_post_skeleton || require_v_post_skeleton){
260 if(require_uv_post_skeleton){
285 typename std::conditional<
290 typename std::conditional<
310 #endif // DUNE_PDELAB_GRIDOPERATOR_DEFAULT_ASSEMBLER_HH const IG & ig
Definition: constraints.hh:148
skeleton intersection (neighbor() == true && boundary() == false)
Wrap intersection.
Definition: geometrywrapper.hh:56
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
bool assembleCell(const EG &eg)
static const unsigned int value
Definition: gridfunctionspace/tags.hh:139
bool requireVBoundary() const
periodic boundary intersection (neighbor() == true && boundary() == true)
typename GFSU::Traits::EntitySet EntitySet
Definition: default/assembler.hh:28
void preAssembly()
Called directly before assembling.
domain boundary intersection (neighbor() == false && boundary() == true)
GFSV TestGridFunctionSpace
Definition: default/assembler.hh:36
GFSU::Traits::SizeType SizeType
Size type as used in grid function space.
Definition: default/assembler.hh:40
bool requireUVVolumePostSkeleton() const
void assembleVBoundary(const IG &ig, const LFSV_S &lfsv_s)
Wrap element.
Definition: geometrywrapper.hh:15
void assemble(LocalAssemblerEngine &assembler_engine) const
Definition: default/assembler.hh:86
DefaultAssembler(const GFSU &gfsu_, const GFSV &gfsv_)
Definition: default/assembler.hh:56
void onBindLFSV(const EG &eg, const LFSV_S &lfsv_s)
void onBindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
const GFSV & testGridFunctionSpace() const
Get the test grid function space.
Definition: default/assembler.hh:74
void assembleUVProcessor(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
void onUnbindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
bool requireSkeletonTwoSided() const
Definition: lfsindexcache.hh:948
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
std::tuple< IntersectionType, typename EntitySet::Element > classifyIntersection(const EntitySet &entity_set, const Intersection &is)
Classifies the type of an intersection wrt to the passed EntitySet.
Definition: intersectiontype.hh:37
void onBindLFSVOutside(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
void onBindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
typename EntitySet::Intersection Intersection
Definition: default/assembler.hh:30
bool requireVSkeleton() const
static const bool isGalerkinMethod
Static check on whether this is a Galerkin method.
Definition: default/assembler.hh:43
void onUnbindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
const GFSU & trialGridFunctionSpace() const
Get the trial grid function space.
Definition: default/assembler.hh:68
void assembleUVSkeleton(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
void postAssembly()
Called last thing after assembling.
void loadCoefficientsLFSUInside(const LFSU_S &lfsu_s)
void onUnbindLFSUV(const EG &eg, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
bool requireUVSkeleton() const
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
void assembleVProcessor(const IG &ig, const LFSV_S &lfsv_s)
void onUnbindLFSV(const EG &eg, const LFSV_S &lfsv_s)
bool requireVVolumePostSkeleton() const
typename EntitySet::Element Element
Definition: default/assembler.hh:29
DefaultAssembler(const GFSU &gfsu_, const GFSV &gfsv_, const CU &cu_, const CV &cv_)
Definition: default/assembler.hh:45
bool requireUVBoundary() const
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
The local assembler engine which handles the integration parts as provided by the global assemblers...
Definition: common/assembler.hh:33
void assembleUVBoundary(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s)
GFSU TrialGridFunctionSpace
Definition: default/assembler.hh:35
The assembler for standard DUNE grid.
Definition: default/assembler.hh:23
void loadCoefficientsLFSUOutside(const LFSU_N &lfsu_n)
processor boundary intersection (neighbor() == false && boundary() == false) or outside entity not in...
void assembleVVolume(const EG &eg, const LFSV &lfsv)