Hermes2D  3.0
norm_form.cpp
1 // This file is part of Hermes2D
2 //
3 // Hermes2D is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // Hermes2D is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Hermes2D; if not, see <http://www.gnu.prg/licenses/>.
15 
16 #include "norm_form.h"
17 #include "forms.h"
18 #include "config.h"
19 
20 namespace Hermes
21 {
22  namespace Hermes2D
23  {
24  template<typename Real, typename Scalar>
25  static Scalar l2_norm(int n, double *wt, Func<Scalar> *u, Func<Real> *v)
26  {
27  Scalar result = Scalar(0);
28  for (int i = 0; i < n; i++)
29  result += wt[i] * u->val[i] * v->val[i];
30  return result;
31  }
32 
33  template<typename Real, typename Scalar>
34  static Scalar h1_norm(int n, double *wt, Func<Scalar> *u, Func<Real> *v)
35  {
36  Scalar result = Scalar(0);
37  for (int i = 0; i < n; i++)
38  result += wt[i] * (u->val[i] * conj(v->val[i]) + u->dx[i] * conj(v->dx[i]) + u->dy[i] * conj(v->dy[i]));
39  return result;
40  }
41 
42  template<typename Real, typename Scalar>
43  static Scalar h1_seminorm(int n, double *wt, Func<Scalar> *u, Func<Real> *v)
44  {
45  Scalar result = Scalar(0);
46  for (int i = 0; i < n; i++)
47  result += wt[i] * (u->val[i] * conj(v->val[i]) + u->dx[i] * conj(v->dx[i]) + u->dy[i] * conj(v->dy[i]));
48  return result;
49  }
50 
51  template<typename Real, typename Scalar>
52  static Scalar hcurl_norm(int n, double *wt, Func<Scalar> *u, Func<Real> *v)
53  {
54  Scalar result = Scalar(0);
55  for (int i = 0; i < n; i++)
56  result += wt[i] * (u->curl[i] * conj(v->curl[i]) + u->val0[i] * conj(v->val0[i]) + u->val1[i] * conj(v->val1[i]));
57  return result;
58  }
59 
60  template<typename Real, typename Scalar>
61  static Scalar hdiv_norm(int n, double *wt, Func<Scalar> *u, Func<Real> *v)
62  {
63  Scalar result = Scalar(0);
64  for (int i = 0; i < n; i++)
65  result += wt[i] * (u->div[i] * conj(v->div[i]) + u->val0[i] * conj(v->val0[i]) + u->val1[i] * conj(v->val1[i]));
66  return result;
67  }
68 
69  NormForm::NormForm(int i, int j, FunctionsEvaluatedType functionType) : i(i), j(j), functionType(functionType)
70  {
71  }
72 
74  {
75  this->area = area;
76  }
77 
78  template<typename Scalar>
79  NormFormVol<Scalar>::NormFormVol(int i, int j) : NormForm(i, j)
80  {
81  }
82 
83  template<typename Scalar>
84  NormFormSurf<Scalar>::NormFormSurf(int i, int j) : NormForm(i, j)
85  {
86  }
87 
88  template<typename Scalar>
89  NormFormDG<Scalar>::NormFormDG(int i, int j) : NormForm(i, j)
90  {
91  }
92 
93  template<typename Scalar>
94  DefaultNormFormVol<Scalar>::DefaultNormFormVol(int i, int j, NormType normType) : NormFormVol<Scalar>(i, j), normType(normType)
95  {
96  }
97 
98  template<typename Scalar>
99  Scalar DefaultNormFormVol<Scalar>::value(int n, double *wt, Func<Scalar> *u, Func<Scalar> *v, GeomVol<double> *e) const
100  {
101  switch (this->normType)
102  {
103  case HERMES_L2_NORM:
104  return l2_norm<Scalar, Scalar>(n, wt, u, v);
105  case HERMES_H1_NORM:
106  return h1_norm<Scalar, Scalar>(n, wt, u, v);
107  case HERMES_H1_SEMINORM:
108  return h1_seminorm<Scalar, Scalar>(n, wt, u, v);
109  case HERMES_HCURL_NORM:
110  return hcurl_norm<Scalar, Scalar>(n, wt, u, v);
111  case HERMES_HDIV_NORM:
112  return hdiv_norm<Scalar, Scalar>(n, wt, u, v);
113  default:
114  throw Hermes::Exceptions::Exception("Unknown norm in DefaultNormFormVol<Scalar>::value.");
115  return 0.0;
116  }
117  }
118  template<typename Scalar>
119  DefaultNormFormSurf<Scalar>::DefaultNormFormSurf(int i, int j, NormType normType) : NormFormSurf<Scalar>(i, j), normType(normType)
120  {
121  }
122 
123  template<typename Scalar>
124  Scalar DefaultNormFormSurf<Scalar>::value(int n, double *wt, Func<Scalar> *u, Func<Scalar> *v, GeomSurf<double> *e) const
125  {
126  switch (this->normType)
127  {
128  case HERMES_L2_NORM:
129  return l2_norm<Scalar, Scalar>(n, wt, u, v);
130  case HERMES_H1_NORM:
131  return h1_norm<Scalar, Scalar>(n, wt, u, v);
132  case HERMES_H1_SEMINORM:
133  return h1_seminorm<Scalar, Scalar>(n, wt, u, v);
134  case HERMES_HCURL_NORM:
135  return hcurl_norm<Scalar, Scalar>(n, wt, u, v);
136  case HERMES_HDIV_NORM:
137  return hdiv_norm<Scalar, Scalar>(n, wt, u, v);
138  default:
139  throw Hermes::Exceptions::Exception("Unknown norm in DefaultNormFormSurf<Scalar>::value.");
140  return 0.0;
141  }
142  }
143 
144  template<typename Scalar>
145  MatrixDefaultNormFormVol<Scalar>::MatrixDefaultNormFormVol(int i, int j, NormType normType) : MatrixFormVol<Scalar>(i, j), normType(normType)
146  {
147  this->setSymFlag(HERMES_SYM);
148  }
149 
150  template<typename Scalar>
151  Scalar MatrixDefaultNormFormVol<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
152  Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext) const
153  {
154  switch (this->normType)
155  {
156  case HERMES_L2_NORM:
157  return l2_norm<double, double>(n, wt, u, v);
158  case HERMES_H1_NORM:
159  return h1_norm<double, double>(n, wt, u, v);
160  case HERMES_H1_SEMINORM:
161  return h1_seminorm<double, double>(n, wt, u, v);
162  case HERMES_HCURL_NORM:
163  return hcurl_norm<double, double>(n, wt, u, v);
164  case HERMES_HDIV_NORM:
165  return hdiv_norm<double, double>(n, wt, u, v);
166  default:
167  throw Hermes::Exceptions::Exception("Unknown norm in MatrixDefaultNormFormVol<Scalar>::value.");
168  return 0.0;
169  }
170  }
171 
172  template<typename Scalar>
173  Ord MatrixDefaultNormFormVol<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
174  GeomVol<Ord> *e, Func<Ord> **ext) const
175  {
176  switch (this->normType)
177  {
178  case HERMES_L2_NORM:
179  return l2_norm<Ord, Ord>(n, wt, u, v);
180  case HERMES_H1_NORM:
181  return h1_norm<Ord, Ord>(n, wt, u, v);
182  case HERMES_H1_SEMINORM:
183  return h1_seminorm<Ord, Ord>(n, wt, u, v);
184  case HERMES_HCURL_NORM:
185  return hcurl_norm<Ord, Ord>(n, wt, u, v);
186  case HERMES_HDIV_NORM:
187  return hdiv_norm<Ord, Ord>(n, wt, u, v);
188  default:
189  throw Hermes::Exceptions::Exception("Unknown norm in MatrixDefaultNormFormVol<Scalar>::ord.");
190  return Ord(0);
191  }
192  }
193 
194  template<typename Scalar>
195  MatrixFormVol<Scalar>* MatrixDefaultNormFormVol<Scalar>::clone() const
196  {
197  return new MatrixDefaultNormFormVol(this->i, this->j, this->normType);
198  }
199 
200  template<typename Scalar>
201  VectorDefaultNormFormVol<Scalar>::VectorDefaultNormFormVol(int i, NormType normType) : VectorFormVol<Scalar>(i), normType(normType)
202  {
203  }
204 
205  template<typename Scalar>
206  Scalar VectorDefaultNormFormVol<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext) const
207  {
208  switch (this->normType)
209  {
210  case HERMES_L2_NORM:
211  return l2_norm<double, Scalar>(n, wt, ext[0], v);
212  case HERMES_H1_NORM:
213  return h1_norm<double, Scalar>(n, wt, ext[0], v);
214  case HERMES_H1_SEMINORM:
215  return h1_seminorm<double, Scalar>(n, wt, ext[0], v);
216  case HERMES_HCURL_NORM:
217  return hcurl_norm<double, Scalar>(n, wt, ext[0], v);
218  case HERMES_HDIV_NORM:
219  return hdiv_norm<double, Scalar>(n, wt, ext[0], v);
220  default:
221  throw Hermes::Exceptions::Exception("Unknown norm in VectorDefaultNormFormVol<Scalar>::value.");
222  return 0.0;
223  }
224  }
225 
226  template<typename Scalar>
227  Ord VectorDefaultNormFormVol<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
228  GeomVol<Ord> *e, Func<Ord> **ext) const
229  {
230  switch (this->normType)
231  {
232  case HERMES_L2_NORM:
233  return l2_norm<Ord, Ord>(n, wt, ext[0], v);
234  case HERMES_H1_NORM:
235  return h1_norm<Ord, Ord>(n, wt, ext[0], v);
236  case HERMES_H1_SEMINORM:
237  return h1_seminorm<Ord, Ord>(n, wt, ext[0], v);
238  case HERMES_HCURL_NORM:
239  return hcurl_norm<Ord, Ord>(n, wt, ext[0], v);
240  case HERMES_HDIV_NORM:
241  return hdiv_norm<Ord, Ord>(n, wt, ext[0], v);
242  default:
243  throw Hermes::Exceptions::Exception("Unknown norm in VectorDefaultNormFormVol<Scalar>::ord.");
244  return Ord(0);
245  }
246  }
247 
248  template<typename Scalar>
249  VectorFormVol<Scalar>* VectorDefaultNormFormVol<Scalar>::clone() const
250  {
251  return new VectorDefaultNormFormVol(this->i, this->normType);
252  }
253 
254  template HERMES_API class NormFormVol < double > ;
255  template HERMES_API class NormFormVol < std::complex<double> > ;
256  template HERMES_API class NormFormSurf < double > ;
257  template HERMES_API class NormFormSurf < std::complex<double> > ;
258  template HERMES_API class NormFormDG < double > ;
259  template HERMES_API class NormFormDG < std::complex<double> > ;
260  template HERMES_API class DefaultNormFormVol < double > ;
261  template HERMES_API class DefaultNormFormVol < std::complex<double> > ;
262  template HERMES_API class DefaultNormFormSurf < double > ;
263  template HERMES_API class DefaultNormFormSurf < std::complex<double> > ;
264  template HERMES_API class MatrixDefaultNormFormVol < double > ;
265  template HERMES_API class MatrixDefaultNormFormVol < std::complex<double> > ;
266  template HERMES_API class VectorDefaultNormFormVol < double > ;
267  template HERMES_API class VectorDefaultNormFormVol < std::complex<double> > ;
268  }
269 }
Definition: adapt.h:24
Containc class that calculates the norm.
FunctionsEvaluatedType
Enum passed to the class NormForm specifying the functions the form acts upon.
Definition: norm_form.h:33
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
void set_area(std::string area)
Definition: norm_form.cpp:73