16 #include "weakform_library/weakforms_maxwell.h"
17 #include "weakform_library/integrals_h1.h"
23 namespace WeakFormsMaxwell
25 template<
typename Scalar>
26 DefaultJacobianMagnetostatics<Scalar>::DefaultJacobianMagnetostatics(
int i,
int j,
std::string area, Scalar const_coeff,
27 CubicSpline* c_spline,
31 : MatrixFormVol<Scalar>(i, j), idx_j(j), const_coeff(const_coeff),
32 spline_coeff(c_spline), gt(gt),
33 order_increase(order_increase)
36 this->setSymFlag(sym);
39 if (c_spline ==
nullptr) this->spline_coeff =
new CubicSpline(1.0);
41 template<
typename Scalar>
42 DefaultJacobianMagnetostatics<Scalar>::DefaultJacobianMagnetostatics(
int i,
int j, std::vector<std::string> areas,
44 CubicSpline* c_spline,
48 : MatrixFormVol<Scalar>(i, j), idx_j(j), const_coeff(const_coeff),
49 spline_coeff(c_spline), gt(gt),
50 order_increase(order_increase)
52 this->set_areas(areas);
53 this->setSymFlag(sym);
56 if (c_spline ==
nullptr) this->spline_coeff =
new CubicSpline(1.0);
59 template<
typename Scalar>
60 Scalar DefaultJacobianMagnetostatics<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
61 Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext)
const
63 Scalar planar_part = 0;
64 Scalar axisym_part = 0;
65 for (
int i = 0; i < n; i++)
67 Scalar B_i = sqrt(sqr(u_ext[idx_j]->dx[i]) + sqr(u_ext[idx_j]->dy[i]));
68 if (std::abs(B_i) > Hermes::HermesSqrtEpsilon)
70 planar_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i
71 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
72 * (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i]);
73 if (gt == HERMES_AXISYM_X)
75 axisym_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i / e->y[i]
76 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
77 * u_ext[idx_j]->val[i] * v->dy[i];
79 else if (gt == HERMES_AXISYM_Y)
81 axisym_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i / e->x[i]
82 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
83 * u_ext[idx_j]->val[i] * v->dx[i];
86 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i)
87 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
88 if (gt == HERMES_AXISYM_X)
90 axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->y[i]
91 * u->val[i] * v->dy[i];
93 else if (gt == HERMES_AXISYM_Y)
95 axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->x[i]
96 * u->val[i] * v->dx[i];
100 return planar_part + axisym_part;
103 template<
typename Scalar>
104 Ord DefaultJacobianMagnetostatics<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
105 GeomVol<Ord> *e, Func<Ord> **ext)
const
108 for (
int i = 0; i < n; i++)
110 Ord B_i = sqrt(sqr(u_ext[idx_j]->dx[i]) + sqr(u_ext[idx_j]->dy[i]));
111 planar_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i
112 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
113 * (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i]);
114 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i)
115 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
121 return planar_part * Ord(order_increase);
124 template<
typename Scalar>
125 MatrixFormVol<Scalar>* DefaultJacobianMagnetostatics<Scalar>::clone()
const
127 return new DefaultJacobianMagnetostatics(*
this);
130 template<
typename Scalar>
131 DefaultResidualMagnetostatics<Scalar>::DefaultResidualMagnetostatics(
int i,
std::string area, Scalar const_coeff,
132 CubicSpline* c_spline,
135 : VectorFormVol<Scalar>(i), idx_i(i), const_coeff(const_coeff), spline_coeff(c_spline),
136 gt(gt), order_increase(order_increase)
140 if (c_spline ==
nullptr) this->spline_coeff =
new CubicSpline(1.0);
143 template<
typename Scalar>
144 DefaultResidualMagnetostatics<Scalar>::DefaultResidualMagnetostatics(
int i, std::vector<std::string> areas, Scalar const_coeff,
145 CubicSpline* c_spline,
147 : VectorFormVol<Scalar>(i), idx_i(i), const_coeff(const_coeff), spline_coeff(c_spline), gt(gt),
148 order_increase(order_increase)
150 this->set_areas(areas);
153 if (c_spline ==
nullptr) this->spline_coeff =
new CubicSpline(1.0);
156 template<
typename Scalar>
157 Scalar DefaultResidualMagnetostatics<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
158 GeomVol<double> *e, Func<Scalar> **ext)
const
160 Scalar planar_part = 0;
161 Scalar axisym_part = 0;
162 for (
int i = 0; i < n; i++)
164 Scalar B_i = sqrt(sqr(u_ext[idx_i]->dx[i]) + sqr(u_ext[idx_i]->dy[i]));
165 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i) *
166 (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
167 if (gt == HERMES_AXISYM_X) axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->y[i]
168 * u_ext[idx_i]->val[i] * v->dy[i];
169 else if (gt == HERMES_AXISYM_Y) axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->x[i]
170 * u_ext[idx_i]->val[i] * v->dx[i];
172 return planar_part + axisym_part;
175 template<
typename Scalar>
176 Ord DefaultResidualMagnetostatics<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
177 GeomVol<Ord> *e, Func<Ord> **ext)
const
180 for (
int i = 0; i < n; i++)
182 Ord B_i = sqrt(sqr(u_ext[idx_i]->dx[i]) + sqr(u_ext[idx_i]->dy[i]));
183 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i) *
184 (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
186 return planar_part * Ord(order_increase);
190 template<
typename Scalar>
191 VectorFormVol<Scalar>* DefaultResidualMagnetostatics<Scalar>::clone()
const
193 return new DefaultResidualMagnetostatics(*
this);
196 template class HERMES_API DefaultJacobianMagnetostatics < double > ;
197 template class HERMES_API DefaultResidualMagnetostatics < double > ;
SymFlag
Bilinear form symmetry flag, see WeakForm::add_matrix_form.
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.
GeomType
Geometrical type of weak forms.