Hermes2D  2.0
weakforms_hcurl.h
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.org/licenses/>.
15 
16 #ifndef __H2D_HCURL_WEAK_FORMS_H
17 #define __H2D_HCURL_WEAK_FORMS_H
18 
19 #include "../integrals/hcurl.h"
20 #include "../weakform/weakform.h"
21 #include "../spline.h"
22 
23 namespace Hermes
24 {
25  namespace Hermes2D
26  {
27  namespace WeakFormsHcurl
28  {
29  /* Default volumetric matrix form \int_{area} const_coeff * function_coeff(x, y) * E \cdot F d\bfx
30  const_coeff... constant number
31  function_coeff... (generally nonconstant) function of x, y
32  */
33 
34  template<typename Scalar>
35  class HERMES_API DefaultMatrixFormVol : public MatrixFormVol<Scalar>
36  {
37  public:
38  DefaultMatrixFormVol<Scalar>(int i, int j, std::string area = HERMES_ANY,
39  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
40  SymFlag sym = HERMES_NONSYM, GeomType gt = HERMES_PLANAR);
41 
42  DefaultMatrixFormVol<Scalar>(int i, int j, Hermes::vector<std::string> areas,
43  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
44  SymFlag sym = HERMES_NONSYM, GeomType gt = HERMES_PLANAR);
45 
47 
48  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
49  Func<double> *v, Geom<double> *e, Func<Scalar> **ext) const;
50 
51  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u, Func<Hermes::Ord> *v,
52  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
53 
54  virtual MatrixFormVol<Scalar>* clone() const;
55 
56  private:
57  Scalar const_coeff;
58  Hermes2DFunction<Scalar>* function_coeff;
59  GeomType gt;
60  };
61 
62  /* FIXME
63  Default volumetric matrix form \int_{area} const_coeff \curl E \curl F d\bfx
64  coeff... constant number
65  */
66 
67  template<typename Scalar>
68  class HERMES_API DefaultJacobianCurlCurl : public MatrixFormVol<Scalar>
69  {
70  public:
71  DefaultJacobianCurlCurl(int i, int j, std::string area = HERMES_ANY, Scalar const_coeff = 1.0,
72  CubicSpline* c_spline = HERMES_DEFAULT_SPLINE,
73  SymFlag sym = HERMES_NONSYM, GeomType gt = HERMES_PLANAR);
74 
75  DefaultJacobianCurlCurl(int i, int j, Hermes::vector<std::string> areas, Scalar const_coeff = 1.0,
76  CubicSpline* c_spline = HERMES_DEFAULT_SPLINE,
77  SymFlag sym = HERMES_NONSYM, GeomType gt = HERMES_PLANAR);
78 
80 
81  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
82  Func<double> *v, Geom<double> *e, Func<Scalar> **ext) const;
83 
84  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u, Func<Hermes::Ord> *v,
85  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
86 
87  virtual MatrixFormVol<Scalar>* clone() const;
88 
89  private:
90  int idx_j;
91  Scalar const_coeff;
92  CubicSpline* spline_coeff;
93  GeomType gt;
94  };
95 
96  /* FIXME
97  Default volumetric vector form \int_{area} (coeff0, coeff1) \cdot E d\bfx
98  coeff0, coeff1... constant numbers
99  */
100 
101  template<typename Scalar>
102  class HERMES_API DefaultVectorFormVol : public VectorFormVol<Scalar>
103  {
104  public:
105  DefaultVectorFormVol<Scalar>(int i, std::string area = HERMES_ANY,
106  Scalar const_coeff0 = 1.0, Scalar const_coeff1 = 1.0,
107  Hermes2DFunction<Scalar>* f_coeff0 = HERMES_DEFAULT_FUNCTION,
108  Hermes2DFunction<Scalar>* f_coeff1 = HERMES_DEFAULT_FUNCTION,
109  GeomType gt = HERMES_PLANAR);
110 
111  DefaultVectorFormVol<Scalar>(int i, Hermes::vector<std::string> areas,
112  Scalar const_coeff0 = 1.0, Scalar const_coeff1 = 1.0,
113  Hermes2DFunction<Scalar>* f_coeff0 = HERMES_DEFAULT_FUNCTION,
114  Hermes2DFunction<Scalar>* f_coeff1 = HERMES_DEFAULT_FUNCTION,
115  GeomType gt = HERMES_PLANAR);
116 
118 
119  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
120  Geom<double> *e, Func<Scalar> **ext) const;
121 
122  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
123  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
124 
125  virtual VectorFormVol<Scalar>* clone() const;
126 
127  private:
128  Scalar const_coeff0, const_coeff1;
129  Hermes2DFunction<Scalar>* function_coeff0, *function_coeff1;
130  GeomType gt;
131  };
132 
133  /* Default volumetric vector form \int_{area} const_coeff * function_coeff(x, y) * u_ext[0] * v d\bfx
134  const_coeff... constant number
135  function_coeff... (generally nonconstant) function of x, y
136  */
137 
138  template<typename Scalar>
139  class HERMES_API DefaultResidualVol : public VectorFormVol<Scalar>
140  {
141  public:
142  DefaultResidualVol(int i, std::string area = HERMES_ANY, Scalar const_coeff = 1.0,
143  Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
144  GeomType gt = HERMES_PLANAR);
145 
146  DefaultResidualVol(int i, Hermes::vector<std::string> areas, Scalar const_coeff = 1.0,
147  Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
148  GeomType gt = HERMES_PLANAR);
149 
151 
152  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
153  Geom<double> *e, Func<Scalar> **ext) const;
154 
155  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
156  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
157 
158  virtual VectorFormVol<Scalar>* clone() const;
159 
160  private:
161  int idx_i;
162  Scalar const_coeff;
163  Hermes2DFunction<Scalar>* function_coeff;
164  GeomType gt;
165  };
166 
167  /* FIXME
168  Default volumetric vector form \int_{area} const_coeff * spline_coeff(u_ext[0]) *
169  \nabla u_ext[0] \cdot \nabla v d\bfx
170  const_coeff... constant number
171  spline_coeff... non-constant parameter given by a cubic spline
172  */
173 
174  template<typename Scalar>
175  class HERMES_API DefaultResidualCurlCurl : public VectorFormVol<Scalar>
176  {
177  public:
178  DefaultResidualCurlCurl(int i, std::string area = HERMES_ANY, Scalar const_coeff = 1.0,
179  CubicSpline* c_spline = HERMES_DEFAULT_SPLINE,
180  GeomType gt = HERMES_PLANAR);
181 
182  DefaultResidualCurlCurl(int i, Hermes::vector<std::string> areas, Scalar const_coeff = 1.0,
183  CubicSpline* c_spline = HERMES_DEFAULT_SPLINE,
184  GeomType gt = HERMES_PLANAR);
185 
187 
188  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
189  Geom<double> *e, Func<Scalar> **ext) const;
190 
191  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
192  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
193 
194  virtual VectorFormVol<Scalar>* clone() const;
195 
196  private:
197  int idx_i;
198  Scalar const_coeff;
199  CubicSpline* spline_coeff;
200  GeomType gt;
201  };
202 
203  /* FIXME
204  Default surface matrix form \int_{area} coeff e tau f tau dS
205  coeff... constant number
206  */
207 
208  template<typename Scalar>
209  class HERMES_API DefaultMatrixFormSurf : public MatrixFormSurf<Scalar>
210  {
211  public:
212  DefaultMatrixFormSurf<Scalar>(int i, int j, std::string area = HERMES_ANY,
213  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
214  GeomType gt = HERMES_PLANAR);
215 
216  DefaultMatrixFormSurf<Scalar>(int i, int j, Hermes::vector<std::string> areas,
217  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
218  GeomType gt = HERMES_PLANAR);
219 
221 
222  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
223  Geom<double> *e, Func<Scalar> **ext) const;
224 
225  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u,
226  Func<Hermes::Ord> *v, Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
227 
228  virtual MatrixFormSurf<Scalar>* clone() const;
229 
230  private:
231  Scalar const_coeff;
232  Hermes2DFunction<Scalar>* function_coeff;
233  GeomType gt;
234  };
235 
236  /* FIXME
237  Default surface vector form \int_{area} const_coeff * function_coeff(x, y) * v dS
238  const_coeff... constant number
239  function_coeff... (generally nonconstant) function of x, y
240  */
241 
242  template<typename Scalar>
243  class HERMES_API DefaultVectorFormSurf : public VectorFormSurf<Scalar>
244  {
245  public:
246  DefaultVectorFormSurf<Scalar>(int i, std::string area = HERMES_ANY, Scalar const_coeff = 1.0,
247  Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
248  GeomType gt = HERMES_PLANAR);
249 
250  DefaultVectorFormSurf<Scalar>(int i, Hermes::vector<std::string> areas, Scalar const_coeff = 1.0,
251  Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
252  GeomType gt = HERMES_PLANAR);
253 
255 
256  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
257  Geom<double> *e, Func<Scalar> **ext) const;
258 
259  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
260  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
261 
262  virtual VectorFormSurf<Scalar>* clone() const;
263 
264  private:
265  Scalar const_coeff;
266  Hermes2DFunction<Scalar>* function_coeff;
267  GeomType gt;
268  };
269 
270  /* FIXME
271  Default surface residual form \int_{area} coeff u_ext[0] tau f tau dS
272  coeff... constant number
273  */
274 
275  template<typename Scalar>
276  class HERMES_API DefaultResidualSurf : public VectorFormSurf<Scalar>
277  {
278  public:
279  DefaultResidualSurf(int i, std::string area = HERMES_ANY,
280  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
281  GeomType gt = HERMES_PLANAR);
282 
283  DefaultResidualSurf(int i, Hermes::vector<std::string> areas,
284  Scalar const_coeff = 1.0, Hermes2DFunction<Scalar>* f_coeff = HERMES_DEFAULT_FUNCTION,
285  GeomType gt = HERMES_PLANAR);
286 
288 
289  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
290  Geom<double> *e, Func<Scalar> **ext) const;
291 
292  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[],
293  Func<Hermes::Ord> *v, Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
294 
295  virtual VectorFormSurf<Scalar>* clone() const;
296 
297  private:
298  Scalar const_coeff;
299  Hermes2DFunction<Scalar>* function_coeff;
300  GeomType gt;
301  };
302  }
303  }
304 }
305 #endif