Dune Core Modules (2.9.0)

refinedsimplexlocalbasis.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 #ifndef DUNE_REFINED_SIMPLEX_LOCALBASIS_HH
6 #define DUNE_REFINED_SIMPLEX_LOCALBASIS_HH
7 
12 #include <dune/common/fvector.hh>
14 #include <dune/localfunctions/common/localbasis.hh>
15 
16 namespace Dune
17 {
18  template<class D, int dim>
19  class RefinedSimplexLocalBasis
20  {
21  protected:
22  RefinedSimplexLocalBasis()
23  {
24  DUNE_THROW(Dune::NotImplemented,"RefinedSimplexLocalBasis not implemented for dim > 3.");
25  }
26  };
27 
35  template<class D>
36  class RefinedSimplexLocalBasis<D,1>
37  {
38  protected:
39 
42 
53  static int getSubElement(const FieldVector<D,1>& global)
54  {
55  if (global[0] <= 0.5)
56  return 0;
57  else if (global[0] <= 1.0)
58  return 1;
59 
60  DUNE_THROW(InvalidStateException, "no subelement defined");
61  }
62 
69  static void getSubElement(const FieldVector<D,1>& global,
70  int& subElement,
71  FieldVector<D,1>& local)
72  {
73  if (global[0] <= 0.5) {
74  subElement = 0;
75  local[0] = 2.0 * global[0];
76  return;
77  }
78 
79  subElement = 1;
80  local[0] = 2.0 * global[0] - 1.0;
81  }
82 
83  };
84 
85 
96  template<class D>
97  class RefinedSimplexLocalBasis<D,2>
98  {
99  protected:
100 
103 
119  static int getSubElement(const FieldVector<D,2>& global)
120  {
121  if (global[0] + global[1] <= 0.5)
122  return 0;
123  else if (global[0] >= 0.5)
124  return 1;
125  else if (global[1] >= 0.5)
126  return 2;
127 
128  return 3;
129  }
130 
137  static void getSubElement(const FieldVector<D,2>& global,
138  int& subElement,
139  FieldVector<D,2>& local)
140  {
141  if (global[0] + global[1] <= 0.5) {
142  subElement = 0;
143  local[0] = 2*global[0];
144  local[1] = 2*global[1];
145  return;
146  } else if (global[0] >= 0.5) {
147  subElement = 1;
148  local[0] = 2*global[0]-1;
149  local[1] = 2*global[1];
150  return;
151  } else if (global[1] >= 0.5) {
152  subElement = 2;
153  local[0] = 2*global[0];
154  local[1] = 2*global[1]-1;
155  return;
156  }
157 
158  subElement = 3;
159  local[0] = -2 * global[0] + 1;
160  local[1] = -2 * global[1] + 1;
161 
162  }
163 
164 
165  };
166 
177  template<class D>
178  class RefinedSimplexLocalBasis<D,3>
179  {
180  protected:
181 
184 
215  static int getSubElement(const FieldVector<D,3>& global)
216  {
217  if (global[0] + global[1] + global[2] <= 0.5)
218  return 0;
219  else if (global[0] >= 0.5)
220  return 1;
221  else if (global[1] >= 0.5)
222  return 2;
223  else if (global[2] >= 0.5)
224  return 3;
225  else if ((global[0] + global[1] <= 0.5)and (global[1] + global[2] <= 0.5))
226  return 4;
227  else if ((global[0] + global[1] >= 0.5)and (global[1] + global[2] <= 0.5))
228  return 5;
229  else if ((global[0] + global[1] <= 0.5)and (global[1] + global[2] >= 0.5))
230  return 6;
231  else if ((global[0] + global[1] >= 0.5)and (global[1] + global[2] >= 0.5))
232  return 7;
233 
234  DUNE_THROW(InvalidStateException, "no subelement defined");
235 
236  }
243  static void getSubElement(const FieldVector<D,3>& global,
244  int& subElement,
245  FieldVector<D,3>& local)
246  {
247  if (global[0] + global[1] + global[2] <= 0.5) {
248  subElement = 0;
249  local = global;
250  local *= 2.0;
251  return;
252  } else if (global[0] >= 0.5) {
253  subElement = 1;
254  local = global;
255  local[0] -= 0.5;
256  local *= 2.0;
257  return;
258  } else if (global[1] >= 0.5) {
259  subElement = 2;
260  local = global;
261  local[1] -= 0.5;
262  local *= 2.0;
263  return;
264  } else if (global[2] >= 0.5) {
265  subElement = 3;
266  local = global;
267  local[2] -= 0.5;
268  local *= 2.0;
269  return;
270  } else if ((global[0] + global[1] <= 0.5)and (global[1] + global[2] <= 0.5)) {
271  subElement = 4;
272  local[0] = 2.0 * global[1];
273  local[1] = 2.0 * (0.5 - global[0] - global[1]);
274  local[2] = 2.0 * (-0.5 + global[0] + global[1] + global[2]);
275  // Dune::FieldMatrix<double,3,3> A(0.0);
276  // A[0][1] = 2.0;
277  // A[1][0] = -2.0;
278  // A[1][1] = -2.0;
279  // A[2][0] = 2.0;
280  // A[2][1] = 2.0;
281  // A[2][2] = 2.0;
282  // A.mv(global,local);
283  // local[1] += 1.0;
284  // local[2] -= 1.0;
285  return;
286  } else if ((global[0] + global[1] >= 0.5)and (global[1] + global[2] <= 0.5)) {
287  subElement = 5;
288  local[0] = 2.0 * (0.5 - global[0]);
289  local[1] = 2.0 * (0.5 - global[1] - global[2]);
290  local[2] = 2.0 * global[2];
291  // Dune::FieldMatrix<double,3,3> A(0.0);
292  // A[0][0] = -2.0;
293  // A[1][1] = -2.0;
294  // A[1][2] = -2.0;
295  // A[2][2] = 2.0;
296  // A.mv(global,local);
297  // local[0] += 1.0;
298  // local[1] += 1.0;
299  return;
300  } else if ((global[0] + global[1] <= 0.5)and (global[1] + global[2] >= 0.5)) {
301  subElement = 6;
302  local[0] = 2.0 * (0.5 - global[0] - global[1]);
303  local[1] = 2.0 * global[0];
304  local[2] = 2.0 * (-0.5 + global[1] + global[2]);
305  // Dune::FieldMatrix<double,3,3> A(0.0);
306  // A[0][0] = -2.0;
307  // A[0][1] = -2.0;
308  // A[1][0] = 2.0;
309  // A[2][1] = 2.0;
310  // A[2][2] = 2.0;
311  // A.mv(global,local);
312  // local[0] += 1.0;
313  // local[2] -= 1.0;
314  return;
315  } else if ((global[0] + global[1] >= 0.5)and (global[1] + global[2] >= 0.5)) {
316  subElement = 7;
317  local[0] = 2.0 * (-0.5 + global[1] + global[2]);
318  local[1] = 2.0 * (0.5 - global[1]);
319  local[2] = 2.0 * (-0.5 + global[0] + global[1]);
320  // Dune::FieldMatrix<double,3,3> A(0.0);
321  // A[0][1] = 2.0;
322  // A[0][2] = 2.0;
323  // A[1][1] = -2.0;
324  // A[2][0] = 2.0;
325  // A[2][1] = 2.0;
326  // A.mv(global,local);
327  // local[0] -= 1.0;
328  // local[1] += 1.0;
329  // local[2] -= 1.0;
330  return;
331  }
332 
333  DUNE_THROW(InvalidStateException, "no subelement defined");
334 
335  }
336 
337  };
338 
339 
340 }
341 
342 #endif
vector space out of a tensor product of fields.
Definition: fvector.hh:95
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
Default exception for dummy implementations.
Definition: exceptions.hh:263
RefinedSimplexLocalBasis()
Protected default constructor so this class can only be instantiated as a base class.
Definition: refinedsimplexlocalbasis.hh:41
static void getSubElement(const FieldVector< D, 1 > &global, int &subElement, FieldVector< D, 1 > &local)
Get local coordinates in the subelement.
Definition: refinedsimplexlocalbasis.hh:69
static int getSubElement(const FieldVector< D, 1 > &global)
Get the number of the subelement containing a given point.
Definition: refinedsimplexlocalbasis.hh:53
RefinedSimplexLocalBasis()
Protected default constructor so this class can only be instantiated as a base class.
Definition: refinedsimplexlocalbasis.hh:102
static int getSubElement(const FieldVector< D, 2 > &global)
Get the number of the subtriangle containing a given point.
Definition: refinedsimplexlocalbasis.hh:119
static void getSubElement(const FieldVector< D, 2 > &global, int &subElement, FieldVector< D, 2 > &local)
Get local coordinates in the subtriangle.
Definition: refinedsimplexlocalbasis.hh:137
static void getSubElement(const FieldVector< D, 3 > &global, int &subElement, FieldVector< D, 3 > &local)
Get local coordinates in the subsimplex.
Definition: refinedsimplexlocalbasis.hh:243
RefinedSimplexLocalBasis()
Protected default constructor so this class can only be instantiated as a base class.
Definition: refinedsimplexlocalbasis.hh:183
static int getSubElement(const FieldVector< D, 3 > &global)
Get the number of the subsimplex containing a given point in the reference element.
Definition: refinedsimplexlocalbasis.hh:215
A few common exception classes.
Implements a vector constructed from a given type representing a field and a compile-time given size.
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
Dune namespace.
Definition: alignedallocator.hh:13
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 2, 22:35, 2024)