dune-pdelab  2.7-git
localoperator_ovlp_region.hh
Go to the documentation of this file.
1 #ifndef DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
2 #define DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
3 
6 
7 namespace Dune {
8  namespace PDELab {
9 
17  template<typename LocalOperatorBase, typename GFS>
19 
21 
22  public:
23  LocalOperatorOvlpRegion (LocalOperatorBase& base_, const GFS& gfs)
24  : baseop(base_), subdomain_sum(gfs, 1) {
25  // Add ones; any value > 1 then indicates multiple subdomains covering this DOF
26  Dune::PDELab::AddDataHandle<GFS,V> addh(gfs,subdomain_sum);
27  gfs.gridView().communicate(addh,Dune::All_All_Interface,Dune::ForwardCommunication);
28  }
29 
30  // pattern assembly flags
31  enum { doPatternVolume = LocalOperatorBase::doPatternVolume };
32  enum { doPatternSkeleton = LocalOperatorBase::doPatternSkeleton };
33  enum { doPatternVolumePostSkeleton = LocalOperatorBase::doPatternVolumePostSkeleton };
34  enum { doPatternBoundary = LocalOperatorBase::doPatternBoundary };
35 
36  // residual assembly flags
37  enum { doAlphaVolume = true };
38  enum { doAlphaVolumePostSkeleton = LocalOperatorBase::doAlphaVolumePostSkeleton };
39  //enum { doAlphaPostSkeletonVolume = LocalOperatorBase::doAlphaPostSkeletonVolume };
40  enum { doAlphaBoundary = true };
41 
42  enum { doAlphaSkeleton = LocalOperatorBase::doAlphaSkeleton };
43  enum { doLambdaVolume = LocalOperatorBase::doLambdaVolume };
44  enum { doLambdaBoundary = LocalOperatorBase::doLambdaBoundary };
45  enum { doLambdaSkeleton = LocalOperatorBase::doLambdaSkeleton };
46 
47  enum { doSkeletonTwoSided = LocalOperatorBase::doSkeletonTwoSided };
48  enum { isLinear = LocalOperatorBase::isLinear };
49 
50  template<typename LFSU, typename LFSV, typename LocalPattern>
51  void pattern_volume (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
52  {
53  if (entity_is_interior(lfsu))
54  return;
55  baseop.pattern_volume(lfsu, lfsv, pattern);
56  }
57 
58  template<typename LFSU, typename LFSV, typename LocalPattern>
59  void pattern_skeleton (const LFSU& lfsu_s, const LFSV& lfsv_s, const LFSU& lfsu_n, const LFSV& lfsv_n, LocalPattern& pattern_sn, LocalPattern& pattern_ns) const
60  {
61  if (entity_is_interior(lfsu_s))
62  return;
63  baseop.pattern_skeleton(lfsu_s, lfsv_s, lfsu_n, lfsv_n, pattern_sn, pattern_ns);
64  }
65 
66  template<typename LFSU, typename LFSV, typename LocalPattern>
67  void pattern_volume_post_skeleton (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
68  {
69  if (entity_is_interior(lfsu))
70  return;
71  baseop.pattern_volume(lfsu, lfsv, pattern);
72  }
73 
74  template<typename LFSU, typename LFSV, typename LocalPattern>
75  void pattern_boundary (const LFSU& lfsu_s, const LFSV& lfsv_s, LocalPattern& pattern_ss) const
76  {
77  if (entity_is_interior(lfsu_s))
78  return;
79  baseop.pattern_boundary (lfsu_s, lfsv_s, pattern_ss);
80  }
81 
82  template<typename EG, typename LFSU, typename X, typename LFSV, typename R>
83  void alpha_volume (const EG& eg, const LFSU& lfsu, const X& x, const LFSV& lfsv, R& r) const
84  {
85  if (entity_is_interior(lfsu))
86  return;
87  baseop.alpha_volume(eg, lfsu, x, lfsv, r);
88  }
89 
90  // jacobian of volume term
91  template<typename EG, typename LFSU, typename X, typename LFSV, typename M>
92  void jacobian_volume (const EG& eg, const LFSU& lfsu, const X& x, const LFSV& lfsv, M& mat) const
93  {
94  if (entity_is_interior(lfsu))
95  return;
96  baseop.jacobian_volume (eg, lfsu, x, lfsv, mat);
97  }
98 
99  // volume integral depending only on test functions
100  template<typename EG, typename LFSV, typename R>
101  void lambda_volume (const EG& eg, const LFSV& lfsv, R& r) const
102  {
103  if (entity_is_interior(lfsv))
104  return;
105  baseop.lambda_volume (eg, lfsv, r);
106  }
107 
108  // post skeleton: compute time step allowable for cell; to be done later
109  template<typename EG, typename LFSU, typename X, typename LFSV, typename R>
110  void alpha_volume_post_skeleton(const EG& eg, const LFSU& lfsu, const X& x,
111  const LFSV& lfsv, R& r) const
112  {
113  if (entity_is_interior(lfsu))
114  return;
115  baseop.alpha_volume_post_skeleton (eg, lfsu, x, lfsv, r);
116  }
117 
118  // boundary integral
119  template<typename IG, typename LFSU, typename X, typename LFSV, typename R>
120  void alpha_boundary (const IG& ig,
121  const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
122  R& r_s) const
123  {
124  if (entity_is_interior(lfsu_s))
125  return;
126  baseop.alpha_boundary (ig, lfsu_s, x_s, lfsv_s, r_s);
127  }
128 
129  // jacobian contribution from boundary
130  template<typename IG, typename LFSU, typename X, typename LFSV, typename M>
131  void jacobian_boundary (const IG& ig,
132  const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
133  M& mat_s) const
134  {
135  if (entity_is_interior(lfsu_s))
136  return;
137  baseop.jacobian_boundary (ig, lfsu_s, x_s, lfsv_s, mat_s);
138  }
139 
140  template<typename IG, typename LFSU, typename X, typename LFSV, typename R>
141  void alpha_skeleton (const IG& ig,
142  const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
143  const LFSU& lfsu_n, const X& x_n, const LFSV& lfsv_n,
144  R& r_s, R& r_n) const
145  {
146  if (entity_is_interior(lfsu_s))
147  return;
148  baseop.alpha_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, r_s, r_n);
149  }
150 
151  template<typename IG, typename LFSU, typename X, typename LFSV, typename M>
152  void jacobian_skeleton (const IG& ig,
153  const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
154  const LFSU& lfsu_n, const X& x_n, const LFSV& lfsv_n,
155  M& mat_ss, M& mat_sn,
156  M& mat_ns, M& mat_nn) const
157  {
158  if (entity_is_interior(lfsu_s))
159  return;
160  baseop.jacobian_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, mat_ss, mat_sn, mat_ns, mat_nn);
161  }
162 
163 
164  void setTime (double t)
165  {
166  baseop.setTime(t);
167  }
168 
169  private:
170 
171  template <typename LFS>
172  bool entity_is_interior (const LFS& lfs) const {
173  LFSIndexCache<LFS> cache(lfs);
174  cache.update();
175  for (std::size_t i = 0; i < cache.size(); i++)
176  {
177  if (subdomain_sum[cache.containerIndex(i)] < 2)
178  return true;
179  }
180  return false;
181  }
182 
183  LocalOperatorBase& baseop;
184  V subdomain_sum;
185  };
186 
187  }
188 }
189 
190 #endif //DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
Dune::PDELab::LocalOperatorOvlpRegion::doPatternVolumePostSkeleton
@ doPatternVolumePostSkeleton
Definition: localoperator_ovlp_region.hh:33
Dune::PDELab::LocalOperatorOvlpRegion::alpha_volume_post_skeleton
void alpha_volume_post_skeleton(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: localoperator_ovlp_region.hh:110
Dune::PDELab::Backend::Vector
typename impl::BackendVectorSelector< GridFunctionSpace, FieldType >::Type Vector
alias of the return type of BackendVectorSelector
Definition: backend/interface.hh:106
Dune::PDELab::LFSIndexCache< LFS >
Dune
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
Dune::PDELab::LocalOperatorOvlpRegion::alpha_volume
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: localoperator_ovlp_region.hh:83
Dune::PDELab::LocalOperatorOvlpRegion::pattern_skeleton
void pattern_skeleton(const LFSU &lfsu_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const LFSV &lfsv_n, LocalPattern &pattern_sn, LocalPattern &pattern_ns) const
Definition: localoperator_ovlp_region.hh:59
Dune::PDELab::LocalOperatorOvlpRegion::jacobian_boundary
void jacobian_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, M &mat_s) const
Definition: localoperator_ovlp_region.hh:131
Dune::PDELab::LocalOperatorOvlpRegion::doLambdaSkeleton
@ doLambdaSkeleton
Definition: localoperator_ovlp_region.hh:45
Dune::PDELab::LocalOperatorOvlpRegion
Wrapper for LocalOperators restricting their action to areas overlapping with other subdomains Any en...
Definition: localoperator_ovlp_region.hh:18
Dune::PDELab::LocalOperatorOvlpRegion::pattern_volume
void pattern_volume(const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern) const
Definition: localoperator_ovlp_region.hh:51
Dune::PDELab::LocalOperatorOvlpRegion::doPatternSkeleton
@ doPatternSkeleton
Definition: localoperator_ovlp_region.hh:32
Dune::PDELab::LocalOperatorOvlpRegion::doAlphaBoundary
@ doAlphaBoundary
Definition: localoperator_ovlp_region.hh:40
Dune::PDELab::LocalOperatorOvlpRegion::alpha_boundary
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: localoperator_ovlp_region.hh:120
Dune::PDELab::LocalOperatorOvlpRegion::doSkeletonTwoSided
@ doSkeletonTwoSided
Definition: localoperator_ovlp_region.hh:47
Dune::PDELab::LocalOperatorOvlpRegion::doAlphaSkeleton
@ doAlphaSkeleton
Definition: localoperator_ovlp_region.hh:42
Dune::PDELab::LocalOperatorOvlpRegion::doAlphaVolumePostSkeleton
@ doAlphaVolumePostSkeleton
Definition: localoperator_ovlp_region.hh:38
Dune::PDELab::LocalOperatorOvlpRegion::doLambdaVolume
@ doLambdaVolume
Definition: localoperator_ovlp_region.hh:43
Dune::PDELab::LocalOperatorOvlpRegion::jacobian_skeleton
void jacobian_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, M &mat_ss, M &mat_sn, M &mat_ns, M &mat_nn) const
Definition: localoperator_ovlp_region.hh:152
Dune::PDELab::LocalOperatorOvlpRegion::isLinear
@ isLinear
Definition: localoperator_ovlp_region.hh:48
Dune::PDELab::LocalOperatorOvlpRegion::lambda_volume
void lambda_volume(const EG &eg, const LFSV &lfsv, R &r) const
Definition: localoperator_ovlp_region.hh:101
Dune::PDELab::LocalOperatorOvlpRegion::doAlphaVolume
@ doAlphaVolume
Definition: localoperator_ovlp_region.hh:37
interface.hh
Dune::PDELab::LocalOperatorOvlpRegion::jacobian_volume
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, M &mat) const
Definition: localoperator_ovlp_region.hh:92
Dune::PDELab::LocalOperatorOvlpRegion::doLambdaBoundary
@ doLambdaBoundary
Definition: localoperator_ovlp_region.hh:44
Dune::PDELab::AddDataHandle
Definition: genericdatahandle.hh:665
Dune::PDELab::LocalOperatorOvlpRegion::doPatternBoundary
@ doPatternBoundary
Definition: localoperator_ovlp_region.hh:34
Dune::PDELab::LocalOperatorOvlpRegion::doPatternVolume
@ doPatternVolume
Definition: localoperator_ovlp_region.hh:31
lfsindexcache.hh
Dune::PDELab::LocalOperatorOvlpRegion::pattern_volume_post_skeleton
void pattern_volume_post_skeleton(const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern) const
Definition: localoperator_ovlp_region.hh:67
ig
const IG & ig
Definition: constraints.hh:149
Dune::PDELab::LocalOperatorOvlpRegion::setTime
void setTime(double t)
Definition: localoperator_ovlp_region.hh:164
Dune::PDELab::LocalOperatorOvlpRegion::pattern_boundary
void pattern_boundary(const LFSU &lfsu_s, const LFSV &lfsv_s, LocalPattern &pattern_ss) const
Definition: localoperator_ovlp_region.hh:75
Dune::PDELab::LocalOperatorOvlpRegion::alpha_skeleton
void alpha_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, R &r_s, R &r_n) const
Definition: localoperator_ovlp_region.hh:141
Dune::PDELab::LocalOperatorOvlpRegion::LocalOperatorOvlpRegion
LocalOperatorOvlpRegion(LocalOperatorBase &base_, const GFS &gfs)
Definition: localoperator_ovlp_region.hh:23