dune-pdelab 2.10-git
Loading...
Searching...
No Matches
interiornode.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil -*-
2#ifndef DUNE_PDELAB_CONSTRAINTS_INTERIORNODE_HH
3#define DUNE_PDELAB_CONSTRAINTS_INTERIORNODE_HH
4
5#include <array>
6
11
13
14namespace Dune {
15 namespace PDELab {
16
20
24 : public TypeTree::LeafNode
25 {
26 std::vector<bool> interior;
27 public:
28 enum{doBoundary=false};
29 enum{doProcessor=false};
30 enum{doSkeleton=false};
31 enum{doVolume=true};
32
34
40 template<typename P, typename EG, typename LFS, typename T>
41 void volume (const P& param, const EG& eg, const LFS& lfs, T& trafo) const
42 {
43 typedef typename EG::Entity Entity;
44 enum { dim = Entity::dimension };
45
46 // update component
47 typename T::RowType empty;
48 typedef typename LFS::Traits::SizeType size_type;
50 typename LFS::Traits::FiniteElementType
51 > FESwitch;
52 for (size_type i=0; i<lfs.size(); i++){
53 const LocalKey& key = FESwitch::coefficients(lfs.finiteElement()).localKey(i);
54 assert(key.codim() == dim && "InteriorNodeConstraints only work for vertex DOFs");
55 assert(key.index() == 0 && "InteriorNodeConstraints only work for P1 shape functions");
56
57 // subentity index
58 unsigned int local_idx = key.subEntity();
59
60 // global idx
61 unsigned int idx = lfs.gridFunctionSpace().gridView().indexSet().subIndex(eg.entity(), local_idx, dim);
62
63 // update constraints
64 if (interior[idx])
65 trafo[lfs.dofIndex(i)] = empty;
66 }
67
68 }
69
71 {
72 return interior;
73 }
74
75 template<typename GV>
76 void updateInteriorNodes(const GV & gv)
77 {
78 // update vector size
79 const int dim = GV::dimension;
80 typedef typename GV::Grid::ctype ctype;
81
82 interior.resize(gv.indexSet().size(dim));
83 for(std::size_t i=0; i< interior.size(); i++)
84 interior[i] = true;
85
86 // loop over all cells
87 for(const auto& entity : elements(gv))
88 {
89 // find boundary faces & associated vertices
90 for (const auto& intersection : intersections(gv,entity))
91 {
92 if (intersection.boundary())
93 {
94 // boundary face
95 unsigned int f = intersection.indexInInside();
96 // remember associated vertices
97 auto refelem = Dune::ReferenceElements<ctype,dim>::simplex();
98 assert(entity.geometry().type().isSimplex() && "InteriorNodeConstraints only work for simplicial meshes");
99 unsigned int sz = refelem.size(f,1, dim);
100 assert(sz == dim);
101 for (unsigned int v = 0; v < sz; ++v)
102 {
103 unsigned int local_idx = refelem.subEntity (f,1, v,dim);
104 unsigned int idx = gv.indexSet().subIndex(entity, local_idx, dim);
105 interior[idx] = false;
106 }
107 }
108 }
109 }
110 }
111 };
113
114 } // end namespace PDELab
115} // end namespace Dune
116
117#endif // DUNE_PDELAB_CONSTRAINTS_INTERIORNODE_HH
bool empty() const
static const int dim
Definition adaptivity.hh:84
For backward compatibility – Do not use this!
constexpr unsigned int index() const noexcept
constexpr unsigned int codim() const noexcept
constexpr unsigned int subEntity() const noexcept
constraints all DOFs associated with interior vertices This allows to implement surface FEM using sta...
Definition interiornode.hh:25
@ doBoundary
Definition interiornode.hh:28
void updateInteriorNodes(const GV &gv)
Definition interiornode.hh:76
const std::vector< bool > & interiorNodes() const
Definition interiornode.hh:70
@ doVolume
Definition interiornode.hh:31
@ doProcessor
Definition interiornode.hh:29
@ doSkeleton
Definition interiornode.hh:30
void volume(const P &param, const EG &eg, const LFS &lfs, T &trafo) const
volume constraints
Definition interiornode.hh:41