Hermes2D  2.0
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_INTEGRALS_HCURL_H
17 #define __H2D_INTEGRALS_HCURL_H
18 
19 #include "../quadrature/limit_order.h"
20 #include "../weakform/weakform.h"
21 
22 namespace Hermes
23 {
24  namespace Hermes2D
25  {
26  template<typename Real, typename Scalar>
27  Scalar int_e_f(int n, double *wt, Func<Real> *u, Func<Real> *v)
28  {
29  Scalar result = Scalar(0);
30  for (int i = 0; i < n; i++)
31  result += wt[i] * (u->val0[i] * conj(v->val0[i]) + u->val1[i] * conj(v->val1[i]));
32  return result;
33  }
34 
35  template<typename Scalar>
36  class MatrixFormVolHCurl : public MatrixFormVol<Scalar>
37  {
38  public:
39  // One area.
40  MatrixFormVolHCurl(unsigned int i, unsigned int j, std::string area = HERMES_ANY,
41  SymFlag sym = HERMES_NONSYM) : MatrixFormVol<Scalar>(i, j)
42  {
43  this->set_area(area);
44  this->setSymFlag(sym);
45  }
46 
47  // Multiple areas.
48  MatrixFormVolHCurl(unsigned int i, unsigned int j, Hermes::vector<std::string> areas,
49  SymFlag sym = HERMES_NONSYM) : MatrixFormVol<Scalar>(i, j)
50  {
51  this->set_areas(areas);
52  this->setSymFlag(sym);
53  }
54 
55  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
56  Geom<double> *e, Func<Scalar> **ext) const
57  {
58  return int_e_f<double, Scalar>(n, wt, u, v);
59  }
60 
61  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u, Func<Hermes::Ord> *v,
62  Geom<Hermes::Ord> *e, Func<Ord> **ext) const
63  {
64  return int_e_f<Hermes::Ord, Hermes::Ord>(n, wt, u, v);
65  }
66 
67  MatrixFormVol<Scalar>* clone() const
68  {
69  return new MatrixFormVolHCurl<Scalar>(*this);
70  }
71  };
72 
73  template<typename Real, typename Scalar>
74  Scalar int_curl_e_curl_f(int n, double *wt, Func<Real> *u, Func<Real> *v)
75  {
76  Scalar result = Scalar(0);
77  for (int i = 0; i < n; i++)
78  result += wt[i] * (u->curl[i] * conj(v->curl[i]));
79  return result;
80  }
81 
82  template<typename Real, typename Scalar>
83  Scalar int_v0(int n, double *wt, Func<Scalar> *v)
84  {
85  Scalar result = Scalar(0);
86  for (int i = 0; i < n; i++)
87  result += wt[i] * v->val0[i];
88  return result;
89  }
90 
91  template<typename Real, typename Scalar>
92  Scalar int_v1(int n, double *wt, Func<Real> *v)
93  {
94  Scalar result = Scalar(0);
95  for (int i = 0; i < n; i++)
96  result += wt[i] * (v->val1[i]);
97  return result;
98  }
99 
100  template<typename Real, typename Scalar>
101  Scalar int_F_e_f(int n, double *wt, double (*F)(int marker, Real x, Real y), Func<Real> *u, Func<Real> *v, Geom<Real> *e)
102  {
103  Scalar result = Scalar(0);
104  for (int i = 0; i < n; i++)
105  result += wt[i] * (*F)(e->elem_marker, e->x[i], e->y[i]) * (u->val0[i] * conj(v->val0[i]) + u->val1[i] * conj(v->val1[i]));
106  return result;
107  }
108 
109  template<typename Real, typename Scalar>
110  Scalar int_e_tau_f_tau(int n, double *wt, Func<Real> *u, Func<Real> *v, Geom<Real> *e)
111  {
112  Scalar result = Scalar(0);
113  for (int i = 0; i < n; i++)
114  result += wt[i] * ( (u->val0[i] * e->tx[i] + u->val1[i] * e->ty[i]) *
115  conj(v->val0[i] * e->tx[i] + v->val1[i] * e->ty[i]));
116  return result;
117  }
118  }
119 }
120 #endif