4 #ifndef DUNE_PDELAB_CONSTRAINTS_CONFORMING_HH 5 #define DUNE_PDELAB_CONSTRAINTS_CONFORMING_HH 10 #include <dune/common/exceptions.hh> 12 #include <dune/geometry/referenceelements.hh> 13 #include <dune/geometry/type.hh> 15 #include <dune/grid/common/grid.hh> 17 #include <dune/localfunctions/common/interfaceswitch.hh> 19 #include <dune/typetree/typetree.hh> 51 template<
typename P,
typename IG,
typename LFS,
typename T>
52 void boundary (
const P& param,
const IG&
ig,
const LFS& lfs, T& trafo)
const 54 typedef FiniteElementInterfaceSwitch<
55 typename LFS::Traits::FiniteElementType
57 typedef FieldVector<typename IG::ctype, IG::mydimension> FaceCoord;
59 const int face = ig.indexInInside();
62 auto refelem = referenceElement(ig.inside().geometry());
63 auto face_refelem = referenceElement(ig.geometry());
66 typename T::RowType empty;
68 const FaceCoord testpoint = face_refelem.position(0,0);
71 if (!param.isDirichlet(ig,testpoint))
75 i<std::size_t(FESwitch::coefficients(lfs.finiteElement()).size());
80 FESwitch::coefficients(lfs.finiteElement()).localKey(i).codim();
82 if (codim==0)
continue;
84 for (
int j=0; j<refelem.size(face,1,codim); j++){
86 if (static_cast<int>(FESwitch::coefficients(lfs.finiteElement()).
87 localKey(i).subEntity())
88 == refelem.subEntity(face,1,j,codim))
89 trafo[lfs.dofIndex(i)] = empty;
107 template<
typename IG,
typename LFS,
typename T>
110 typedef FiniteElementInterfaceSwitch<
111 typename LFS::Traits::FiniteElementType
115 const int face = ig.indexInInside();
117 auto refelem = referenceElement(ig.inside().geometry());
120 typename T::RowType empty;
123 for (
size_t i=0; i<FESwitch::coefficients(lfs.finiteElement()).size();
128 FESwitch::coefficients(lfs.finiteElement()).localKey(i).codim();
130 if (codim==0)
continue;
132 for (
int j=0; j<refelem.size(face,1,codim); j++)
133 if (FESwitch::coefficients(lfs.finiteElement()).localKey(i).
134 subEntity() == std::size_t(refelem.subEntity(face,1,j,codim)))
135 trafo[lfs.dofIndex(i)] = empty;
141 template<
typename GV>
153 template<
typename P,
typename EG,
typename LFS,
typename T>
154 void volume (
const P& param,
const EG& eg,
const LFS& lfs, T& trafo)
const 156 typedef FiniteElementInterfaceSwitch<
157 typename LFS::Traits::FiniteElementType
160 auto& entity = eg.entity();
163 if (entity.partitionType()==Dune::InteriorEntity)
166 typedef typename FESwitch::Coefficients Coefficients;
167 const Coefficients& coeffs = FESwitch::coefficients(lfs.finiteElement());
170 typename T::RowType empty;
172 auto ref_el = referenceElement(entity.geometry());
175 for (
size_t i = 0; i < coeffs.size(); ++i)
177 size_t codim = coeffs.localKey(i).codim();
178 size_t sub_entity = coeffs.localKey(i).subEntity();
180 size_t entity_index = _gv.indexSet().subIndex(entity,sub_entity,codim);
183 size_t index = _gt_offsets[gt_index] + entity_index;
187 trafo[lfs.dofIndex(i)] = empty;
195 std::fill(_gt_offsets.begin(),_gt_offsets.end(),0);
197 for (
size_t codim = 0; codim <= GV::dimension; ++codim)
199 if (gfs.ordering().contains(codim))
201 for (
auto gt : _gv.indexSet().types(codim))
206 std::partial_sum(_gt_offsets.begin(),_gt_offsets.end(),_gt_offsets.begin());
208 _ghosts.assign(_gt_offsets.back(),
true);
210 typedef typename GV::template Codim<0>::
211 template Partition<Interior_Partition>::Iterator Iterator;
213 for(Iterator it = _gv.template begin<0, Interior_Partition>(),
214 end = _gv.template end<0, Interior_Partition>();
220 auto ref_el = referenceElement(entity.geometry());
222 for (
size_t codim = 0; codim <= GV::dimension; ++codim)
223 if (gfs.ordering().contains(codim))
225 for (
int i = 0; i < ref_el.size(codim); ++i)
227 size_t entity_index = _gv.indexSet().subIndex(entity,i,codim);
229 size_t index = _gt_offsets[gt_index] + entity_index;
231 _ghosts[
index] =
false;
240 , _rank(gv.comm().rank())
241 , _gt_offsets(GlobalGeometryTypeIndex::size(GV::dimension) + 1)
248 std::vector<bool> _ghosts;
249 std::vector<size_t> _gt_offsets;
256 #endif // DUNE_PDELAB_CONSTRAINTS_CONFORMING_HH Definition: conforming.hh:39
extend conforming constraints class by processor boundary
Definition: conforming.hh:142
extend conforming constraints class by processor boundary
Definition: conforming.hh:96
Definition: conforming.hh:42
void processor(const IG &ig, const LFS &lfs, T &trafo) const
processor constraints
Definition: conforming.hh:108
Definition: conforming.hh:40
void boundary(const P ¶m, const IG &ig, const LFS &lfs, T &trafo) const
boundary constraints
Definition: conforming.hh:52
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
const IG & ig
Definition: constraints.hh:148
void volume(const P ¶m, const EG &eg, const LFS &lfs, T &trafo) const
volume constraints
Definition: conforming.hh:154
Definition: conforming.hh:41
void compute_ghosts(const GFS &gfs)
Definition: conforming.hh:193
Dirichlet Constraints construction.
Definition: conforming.hh:36
std::size_t index
Definition: interpolate.hh:118
NonoverlappingConformingDirichletConstraints(const GV &gv)
Definition: conforming.hh:238