16 #include "weakforms_maxwell.h"
21 namespace WeakFormsMaxwell
23 template<
typename Scalar>
24 DefaultJacobianMagnetostatics<Scalar>::DefaultJacobianMagnetostatics(
int i,
int j,
std::string area, Scalar const_coeff,
25 CubicSpline* c_spline,
29 : MatrixFormVol<Scalar>(i, j), idx_j(j), const_coeff(const_coeff),
30 spline_coeff(c_spline), gt(gt),
31 order_increase(order_increase)
34 this->setSymFlag(sym);
37 if(c_spline == HERMES_DEFAULT_SPLINE) this->spline_coeff =
new CubicSpline(1.0);
39 template<
typename Scalar>
40 DefaultJacobianMagnetostatics<Scalar>::DefaultJacobianMagnetostatics(
int i,
int j, Hermes::vector<std::string> areas,
42 CubicSpline* c_spline,
46 : MatrixFormVol<Scalar>(i, j), idx_j(j), const_coeff(const_coeff),
47 spline_coeff(c_spline), gt(gt),
48 order_increase(order_increase)
50 this->set_areas(areas);
51 this->setSymFlag(sym);
54 if(c_spline == HERMES_DEFAULT_SPLINE) this->spline_coeff =
new CubicSpline(1.0);
57 template<
typename Scalar>
58 Scalar DefaultJacobianMagnetostatics<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
59 Func<double> *v, Geom<double> *e, Func<Scalar> **ext)
const
61 Scalar planar_part = 0;
62 Scalar axisym_part = 0;
63 for (
int i = 0; i < n; i++)
65 Scalar B_i = sqrt(sqr(u_ext[idx_j]->dx[i]) + sqr(u_ext[idx_j]->dy[i]));
66 if(std::abs(B_i) > 1e-12)
68 planar_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i
69 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
70 * (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i]);
71 if(gt == HERMES_AXISYM_X)
73 axisym_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i / e->y[i]
74 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
75 * u_ext[idx_j]->val[i] * v->dy[i];
77 else if(gt == HERMES_AXISYM_Y)
79 axisym_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i / e->x[i]
80 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
81 * u_ext[idx_j]->val[i] * v->dx[i];
84 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i)
85 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
86 if(gt == HERMES_AXISYM_X)
88 axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->y[i]
89 * u->val[i] * v->dy[i];
91 else if(gt == HERMES_AXISYM_Y)
93 axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->x[i]
94 * u->val[i] * v->dx[i];
98 return planar_part + axisym_part;
101 template<
typename Scalar>
102 Ord DefaultJacobianMagnetostatics<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
103 Geom<Ord> *e, Func<Ord> **ext)
const
106 for (
int i = 0; i < n; i++)
108 Ord B_i = sqrt(sqr(u_ext[idx_j]->dx[i]) + sqr(u_ext[idx_j]->dy[i]));
109 planar_part += wt[i] * const_coeff*spline_coeff->derivative(B_i) / B_i
110 * (u_ext[idx_j]->dx[i] * u->dx[i] + u_ext[idx_j]->dy[i] * u->dy[i])
111 * (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i]);
112 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i)
113 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
119 return planar_part * Ord(order_increase);
122 template<
typename Scalar>
123 MatrixFormVol<Scalar>* DefaultJacobianMagnetostatics<Scalar>::clone()
const
125 return new DefaultJacobianMagnetostatics(*
this);
128 template<
typename Scalar>
129 DefaultResidualMagnetostatics<Scalar>::DefaultResidualMagnetostatics(
int i,
std::string area, Scalar const_coeff,
130 CubicSpline* c_spline,
133 : VectorFormVol<Scalar>(i), idx_i(i), const_coeff(const_coeff), spline_coeff(c_spline),
134 gt(gt), order_increase(order_increase)
138 if(c_spline == HERMES_DEFAULT_SPLINE) this->spline_coeff =
new CubicSpline(1.0);
141 template<
typename Scalar>
142 DefaultResidualMagnetostatics<Scalar>::DefaultResidualMagnetostatics(
int i, Hermes::vector<std::string> areas, Scalar const_coeff,
143 CubicSpline* c_spline,
145 : VectorFormVol<Scalar>(i), idx_i(i), const_coeff(const_coeff), spline_coeff(c_spline), gt(gt),
146 order_increase(order_increase)
148 this->set_areas(areas);
151 if(c_spline == HERMES_DEFAULT_SPLINE) this->spline_coeff =
new CubicSpline(1.0);
154 template<
typename Scalar>
155 Scalar DefaultResidualMagnetostatics<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
156 Geom<double> *e, Func<Scalar> **ext)
const
158 Scalar planar_part = 0;
159 Scalar axisym_part = 0;
160 for (
int i = 0; i < n; i++)
162 Scalar B_i = sqrt(sqr(u_ext[idx_i]->dx[i]) + sqr(u_ext[idx_i]->dy[i]));
163 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i) *
164 (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
165 if(gt == HERMES_AXISYM_X) axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->y[i]
166 * u_ext[idx_i]->val[i] * v->dy[i];
167 else if(gt == HERMES_AXISYM_Y) axisym_part += wt[i] * const_coeff*spline_coeff->value(B_i) / e->x[i]
168 * u_ext[idx_i]->val[i] * v->dx[i];
170 return planar_part + axisym_part;
173 template<
typename Scalar>
174 Ord DefaultResidualMagnetostatics<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
175 Geom<Ord> *e, Func<Ord> **ext)
const
178 for (
int i = 0; i < n; i++)
180 Ord B_i = sqrt(sqr(u_ext[idx_i]->dx[i]) + sqr(u_ext[idx_i]->dy[i]));
181 planar_part += wt[i] * const_coeff*spline_coeff->value(B_i) *
182 (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
184 return planar_part * Ord(order_increase);
188 template<
typename Scalar>
189 VectorFormVol<Scalar>* DefaultResidualMagnetostatics<Scalar>::clone()
const
191 return new DefaultResidualMagnetostatics(*
this);
194 template class HERMES_API DefaultJacobianMagnetostatics<double>;
195 template class HERMES_API DefaultResidualMagnetostatics<double>;