16 #include "weakforms_h1.h"
25 DefaultMatrixFormVol<double>::DefaultMatrixFormVol
27 : MatrixFormVol<double>(i, j), coeff(coeff), gt(gt)
30 this->setSymFlag(sym);
32 if(coeff == HERMES_ONE)
33 this->coeff =
new Hermes2DFunction<double>(1.0);
36 DefaultMatrixFormVol<std::complex<double> >::DefaultMatrixFormVol
38 : MatrixFormVol<std::complex<double> >(i, j), coeff(coeff), gt(gt)
41 this->setSymFlag(sym);
44 if(coeff == HERMES_ONE)
45 this->coeff =
new Hermes2DFunction<std::complex<double> >(std::complex<double>(1.0, 1.0));
49 DefaultMatrixFormVol<double>::DefaultMatrixFormVol
50 (
int i,
int j, Hermes::vector<std::string> areas,
52 : MatrixFormVol<double>(i, j), coeff(coeff), gt(gt)
54 this->set_areas(areas);
55 this->setSymFlag(sym);
58 if(coeff == HERMES_ONE)
59 this->coeff =
new Hermes2DFunction<double>(1.0);
62 DefaultMatrixFormVol<std::complex<double> >::DefaultMatrixFormVol
63 (
int i,
int j, Hermes::vector<std::string> areas,
64 Hermes2DFunction<std::complex<double> >* coeff,
SymFlag sym,
GeomType gt)
65 : MatrixFormVol<std::complex<double> >(i, j), coeff(coeff), gt(gt)
67 this->set_areas(areas);
68 this->setSymFlag(sym);
71 if(coeff == HERMES_ONE)
72 this->coeff =
new Hermes2DFunction<std::complex<double> >(std::complex<double>(1.0, 1.0));
75 template<
typename Scalar>
76 DefaultMatrixFormVol<Scalar>::~DefaultMatrixFormVol()
79 if(coeff == HERMES_ONE)
delete coeff;
82 template<
typename Scalar>
83 Scalar DefaultMatrixFormVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
84 Geom<double> *e, Func<Scalar> **ext)
const
87 if(gt == HERMES_PLANAR) {
88 for (
int i = 0; i < n; i++) {
89 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
93 if(gt == HERMES_AXISYM_X) {
94 for (
int i = 0; i < n; i++) {
95 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
99 for (
int i = 0; i < n; i++) {
100 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
108 template<
typename Scalar>
109 Ord DefaultMatrixFormVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
110 Func<Ord> *v, Geom<Ord> *e, Func<Ord> **ext)
const
113 if(gt == HERMES_PLANAR) {
114 for (
int i = 0; i < n; i++) {
115 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
119 if(gt == HERMES_AXISYM_X) {
120 for (
int i = 0; i < n; i++) {
121 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
125 for (
int i = 0; i < n; i++) {
126 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
134 template<
typename Scalar>
135 MatrixFormVol<Scalar>* DefaultMatrixFormVol<Scalar>::clone()
const
137 return new DefaultMatrixFormVol<Scalar>(*this);
140 template<
typename Scalar>
141 DefaultJacobianDiffusion<Scalar>::DefaultJacobianDiffusion(
int i,
int j,
std::string area,
142 Hermes1DFunction<Scalar>* coeff,
144 : MatrixFormVol<Scalar>(i, j), idx_j(j), coeff(coeff), gt(gt)
147 this->setSymFlag(sym);
150 if(coeff == HERMES_ONE)
151 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
154 template<
typename Scalar>
155 DefaultJacobianDiffusion<Scalar>::DefaultJacobianDiffusion(
int i,
int j, Hermes::vector<std::string> areas,
157 : MatrixFormVol<Scalar>(i, j), idx_j(j), coeff(coeff), gt(gt)
159 this->set_areas(areas);
160 this->setSymFlag(sym);
163 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
166 template<
typename Scalar>
167 DefaultJacobianDiffusion<Scalar>::~DefaultJacobianDiffusion()
169 if(coeff==HERMES_ONE)
delete coeff;
172 template<
typename Scalar>
173 Scalar DefaultJacobianDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
174 Func<double> *v, Geom<double> *e, Func<Scalar> **ext)
const
177 if(gt == HERMES_PLANAR) {
178 for (
int i = 0; i < n; i++) {
179 result += wt[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
180 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
181 + coeff->value(u_ext[idx_j]->val[i])
182 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
186 if(gt == HERMES_AXISYM_X) {
187 for (
int i = 0; i < n; i++) {
188 result += wt[i] * e->y[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
189 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
190 + coeff->value(u_ext[idx_j]->val[i])
191 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
195 for (
int i = 0; i < n; i++) {
196 result += wt[i] * e->x[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
197 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
198 + coeff->value(u_ext[idx_j]->val[i])
199 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
207 template<
typename Scalar>
208 Ord DefaultJacobianDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
209 Geom<Ord> *e, Func<Ord> **ext)
const
212 if(gt == HERMES_PLANAR) {
213 for (
int i = 0; i < n; i++) {
214 result += wt[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
215 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
216 + coeff->value(u_ext[idx_j]->val[i])
217 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
221 if(gt == HERMES_AXISYM_X) {
222 for (
int i = 0; i < n; i++) {
223 result += wt[i] * e->y[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
224 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
225 + coeff->value(u_ext[idx_j]->val[i])
226 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
230 for (
int i = 0; i < n; i++) {
231 result += wt[i] * e->x[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u->val[i] *
232 (u_ext[idx_j]->dx[i] * v->dx[i] + u_ext[idx_j]->dy[i] * v->dy[i])
233 + coeff->value(u_ext[idx_j]->val[i])
234 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
242 template<
typename Scalar>
243 MatrixFormVol<Scalar>* DefaultJacobianDiffusion<Scalar>::clone()
const
245 return new DefaultJacobianDiffusion<Scalar>(*this);
248 template<
typename Scalar>
249 DefaultMatrixFormDiffusion<Scalar>::DefaultMatrixFormDiffusion(
int i,
int j,
std::string area,
250 Hermes1DFunction<Scalar>* coeff,
252 : MatrixFormVol<Scalar>(i, j), idx_j(j), coeff(coeff), gt(gt)
255 this->setSymFlag(sym);
258 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
261 template<
typename Scalar>
262 DefaultMatrixFormDiffusion<Scalar>::DefaultMatrixFormDiffusion(
int i,
int j, Hermes::vector<std::string> areas,
264 : MatrixFormVol<Scalar>(i, j), idx_j(j), coeff(coeff), gt(gt)
266 this->set_areas(areas);
267 this->setSymFlag(sym);
270 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
273 template<
typename Scalar>
274 DefaultMatrixFormDiffusion<Scalar>::~DefaultMatrixFormDiffusion()
276 if(coeff == HERMES_ONE)
delete coeff;
279 template<
typename Scalar>
280 Scalar DefaultMatrixFormDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
281 Func<double> *v, Geom<double> *e, Func<Scalar> **ext)
const
284 if(gt == HERMES_PLANAR) {
285 for (
int i = 0; i < n; i++) {
286 result += wt[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
290 if(gt == HERMES_AXISYM_X) {
291 for (
int i = 0; i < n; i++) {
292 result += wt[i] * e->y[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
296 for (
int i = 0; i < n; i++) {
297 result += wt[i] * e->x[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
305 template<
typename Scalar>
306 Ord DefaultMatrixFormDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
307 Geom<Ord> *e, Func<Ord> **ext)
const
310 if(gt == HERMES_PLANAR) {
311 for (
int i = 0; i < n; i++) {
312 result += wt[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
316 if(gt == HERMES_AXISYM_X) {
317 for (
int i = 0; i < n; i++) {
318 result += wt[i] * e->y[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
322 for (
int i = 0; i < n; i++) {
323 result += wt[i] * e->x[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]);
331 template<
typename Scalar>
332 MatrixFormVol<Scalar>* DefaultMatrixFormDiffusion<Scalar>::clone()
const
334 return new DefaultMatrixFormDiffusion<Scalar>(*this);
337 template<
typename Scalar>
338 DefaultJacobianAdvection<Scalar>::DefaultJacobianAdvection(
int i,
int j,
std::string area,
339 Hermes1DFunction<Scalar>* coeff1,
340 Hermes1DFunction<Scalar>* coeff2,
342 : MatrixFormVol<Scalar>(i, j),
343 idx_j(j), coeff1(coeff1), coeff2(coeff2), gt(gt)
347 if(gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
350 if(coeff1 == HERMES_ONE) this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
351 if(coeff2 == HERMES_ONE) this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
354 template<
typename Scalar>
355 DefaultJacobianAdvection<Scalar>::DefaultJacobianAdvection(
int i,
int j, Hermes::vector<std::string> areas,
356 Hermes1DFunction<Scalar>* coeff1,
357 Hermes1DFunction<Scalar>* coeff2,
359 : MatrixFormVol<Scalar>(i, j),
360 idx_j(j), coeff1(coeff1), coeff2(coeff2), gt(gt)
362 this->set_areas(areas);
364 if(gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
367 if(coeff1 == HERMES_ONE) this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
368 if(coeff2 == HERMES_ONE) this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
371 template<
typename Scalar>
372 DefaultJacobianAdvection<Scalar>::~DefaultJacobianAdvection()
379 template<
typename Scalar>
380 Scalar DefaultJacobianAdvection<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
381 Func<double> *v, Geom<double> *e, Func<Scalar> **ext)
const
384 for (
int i = 0; i < n; i++) {
385 result += wt[i] * ( coeff1->derivative(u_ext[idx_j]->val[i]) * u->val[i] * u_ext[idx_j]->dx[i] * v->val[i]
386 + coeff1->value(u_ext[idx_j]->val[i]) * u->dx[i] * v->val[i]
387 + coeff2->derivative(u_ext[idx_j]->val[i]) * u->val[i] * u_ext[idx_j]->dy[i] * v->val[i]
388 + coeff2->value(u_ext[idx_j]->val[i]) * u->dy[i] * v->val[i]);
393 template<
typename Scalar>
394 Ord DefaultJacobianAdvection<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
395 Geom<Ord> *e, Func<Ord> **ext)
const
398 for (
int i = 0; i < n; i++) {
399 result += wt[i] * ( coeff1->derivative(u_ext[idx_j]->val[i]) * u->val[i] * u_ext[idx_j]->dx[i] * v->val[i]
400 + coeff1->value(u_ext[idx_j]->val[i]) * u->dx[i] * v->val[i]
401 + coeff2->derivative(u_ext[idx_j]->val[i]) * u->val[i] * u_ext[idx_j]->dy[i] * v->val[i]
402 + coeff2->value(u_ext[idx_j]->val[i]) * u->dy[i] * v->val[i]);
408 template<
typename Scalar>
409 MatrixFormVol<Scalar>* DefaultJacobianAdvection<Scalar>::clone()
const
411 return new DefaultJacobianAdvection<Scalar>(*this);
414 template<
typename Scalar>
415 DefaultVectorFormVol<Scalar>::DefaultVectorFormVol(
int i,
std::string area,
416 Hermes2DFunction<Scalar>* coeff,
418 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
423 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
426 template<
typename Scalar>
427 DefaultVectorFormVol<Scalar>::DefaultVectorFormVol(
int i, Hermes::vector<std::string> areas,
428 Hermes2DFunction<Scalar>* coeff,
430 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
432 this->set_areas(areas);
435 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
438 template<
typename Scalar>
439 DefaultVectorFormVol<Scalar>::~DefaultVectorFormVol()
442 if(coeff == HERMES_ONE)
delete coeff;
445 template<
typename Scalar>
446 Scalar DefaultVectorFormVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
447 Geom<double> *e, Func<Scalar> **ext)
const
450 if(gt == HERMES_PLANAR) {
451 for (
int i = 0; i < n; i++) {
452 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
456 if(gt == HERMES_AXISYM_X) {
457 for (
int i = 0; i < n; i++) {
458 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
462 for (
int i = 0; i < n; i++) {
463 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
470 template<
typename Scalar>
471 Ord DefaultVectorFormVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
472 Geom<Ord> *e, Func<Ord> **ext)
const
475 if(gt == HERMES_PLANAR) {
476 for (
int i = 0; i < n; i++) {
477 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
481 if(gt == HERMES_AXISYM_X) {
482 for (
int i = 0; i < n; i++) {
483 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
487 for (
int i = 0; i < n; i++) {
488 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
496 template<
typename Scalar>
497 VectorFormVol<Scalar>* DefaultVectorFormVol<Scalar>::clone()
const
499 return new DefaultVectorFormVol<Scalar>(*this);
502 template<
typename Scalar>
503 DefaultResidualVol<Scalar>::DefaultResidualVol(
int i,
std::string area,
504 Hermes2DFunction<Scalar>* coeff,
506 : VectorFormVol<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
511 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
514 template<
typename Scalar>
515 DefaultResidualVol<Scalar>::DefaultResidualVol(
int i, Hermes::vector<std::string> areas,
516 Hermes2DFunction<Scalar>* coeff,
518 : VectorFormVol<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
520 this->set_areas(areas);
523 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
526 template<
typename Scalar>
527 DefaultResidualVol<Scalar>::~DefaultResidualVol()
530 if(coeff == HERMES_ONE)
delete coeff;
533 template<
typename Scalar>
534 Scalar DefaultResidualVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
535 Geom<double> *e, Func<Scalar> **ext)
const
538 if(gt == HERMES_PLANAR) {
539 for (
int i = 0; i < n; i++) {
540 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
544 if(gt == HERMES_AXISYM_X) {
545 for (
int i = 0; i < n; i++) {
546 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
550 for (
int i = 0; i < n; i++) {
551 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
558 template<
typename Scalar>
559 Ord DefaultResidualVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
560 Geom<Ord> *e, Func<Ord> **ext)
const
563 if(gt == HERMES_PLANAR) {
564 for (
int i = 0; i < n; i++) {
565 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
569 if(gt == HERMES_AXISYM_X) {
570 for (
int i = 0; i < n; i++) {
571 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
575 for (
int i = 0; i < n; i++) {
576 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
584 template<
typename Scalar>
585 VectorFormVol<Scalar>* DefaultResidualVol<Scalar>::clone()
const
587 return new DefaultResidualVol(*
this);
590 template<
typename Scalar>
591 DefaultResidualDiffusion<Scalar>::DefaultResidualDiffusion(
int i,
std::string area,
592 Hermes1DFunction<Scalar>* coeff,
GeomType gt)
593 : VectorFormVol<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
598 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
601 template<
typename Scalar>
602 DefaultResidualDiffusion<Scalar>::DefaultResidualDiffusion(
int i, Hermes::vector<std::string> areas,
603 Hermes1DFunction<Scalar>* coeff,
GeomType gt)
604 : VectorFormVol<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
606 this->set_areas(areas);
609 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
612 template<
typename Scalar>
613 DefaultResidualDiffusion<Scalar>::~DefaultResidualDiffusion()
616 if(coeff == HERMES_ONE)
delete coeff;
619 template<
typename Scalar>
620 Scalar DefaultResidualDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
621 Geom<double> *e, Func<Scalar> **ext)
const
624 if(gt == HERMES_PLANAR) {
625 for (
int i = 0; i < n; i++) {
626 result += wt[i] * coeff->value(u_ext[idx_i]->val[i])
627 * (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
631 if(gt == HERMES_AXISYM_X) {
632 for (
int i = 0; i < n; i++) {
633 result += wt[i] * e->y[i] * coeff->value(u_ext[idx_i]->val[i])
634 * (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
638 for (
int i = 0; i < n; i++) {
639 result += wt[i] * e->x[i] * coeff->value(u_ext[idx_i]->val[i])
640 * (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
648 template<
typename Scalar>
649 Ord DefaultResidualDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
650 Geom<Ord> *e, Func<Ord> **ext)
const
653 for (
int i = 0; i < n; i++) {
654 result += wt[i] * coeff->value(u_ext[idx_i]->val[i])
655 * (u_ext[idx_i]->dx[i] * v->dx[i] + u_ext[idx_i]->dy[i] * v->dy[i]);
657 if(gt != HERMES_PLANAR) result = result * Ord(1);
662 template<
typename Scalar>
663 VectorFormVol<Scalar>* DefaultResidualDiffusion<Scalar>::clone()
const
665 return new DefaultResidualDiffusion<Scalar>(*this);
668 template<
typename Scalar>
669 DefaultResidualAdvection<Scalar>::DefaultResidualAdvection(
int i,
std::string area,
670 Hermes1DFunction<Scalar>* coeff1,
671 Hermes1DFunction<Scalar>* coeff2,
673 : VectorFormVol<Scalar>(i), idx_i(i), coeff1(coeff1), coeff2(coeff2), gt(gt)
677 if(gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
680 if(coeff1 == HERMES_ONE) this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
681 if(coeff2 == HERMES_ONE) this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
684 template<
typename Scalar>
685 DefaultResidualAdvection<Scalar>::DefaultResidualAdvection(
int i, Hermes::vector<std::string> areas, \
686 Hermes1DFunction<Scalar>* coeff1,
687 Hermes1DFunction<Scalar>* coeff2,
689 : VectorFormVol<Scalar>(i),
690 idx_i(i), coeff1(coeff1), coeff2(coeff2), gt(gt)
692 this->set_areas(areas);
694 if(gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
697 if(coeff1 == HERMES_ONE) this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
698 if(coeff2 == HERMES_ONE) this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
701 template<
typename Scalar>
702 DefaultResidualAdvection<Scalar>::~DefaultResidualAdvection()
709 template<
typename Scalar>
710 Scalar DefaultResidualAdvection<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
711 Geom<double> *e, Func<Scalar> **ext)
const
714 Func<Scalar>* u_prev = u_ext[idx_i];
715 for (
int i = 0; i < n; i++) {
716 result += wt[i] * (coeff1->value(u_prev->val[i]) * (u_prev->dx[i] * v->val[i])
717 + coeff2->value(u_prev->val[i]) * (u_prev->dy[i] * v->val[i]));
722 template<
typename Scalar>
723 Ord DefaultResidualAdvection<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
724 Geom<Ord> *e, Func<Ord> **ext)
const
727 Func<Ord>* u_prev = u_ext[idx_i];
728 for (
int i = 0; i < n; i++) {
729 result += wt[i] * (coeff1->value(u_prev->val[i]) * (u_prev->dx[i] * v->val[i])
730 + coeff2->value(u_prev->val[i]) * (u_prev->dy[i] * v->val[i]));
735 template<
typename Scalar>
736 VectorFormVol<Scalar>* DefaultResidualAdvection<Scalar>::clone()
const
738 return new DefaultResidualAdvection<Scalar>(*this);
741 template<
typename Scalar>
742 DefaultMatrixFormSurf<Scalar>::DefaultMatrixFormSurf(
int i,
int j,
std::string area,
743 Hermes2DFunction<Scalar>* coeff,
745 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
750 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
753 template<
typename Scalar>
754 DefaultMatrixFormSurf<Scalar>::DefaultMatrixFormSurf(
int i,
int j, Hermes::vector<std::string> areas,
755 Hermes2DFunction<Scalar>* coeff,
757 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
759 this->set_areas(areas);
762 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
765 template<
typename Scalar>
766 DefaultMatrixFormSurf<Scalar>::~DefaultMatrixFormSurf()
769 if(coeff == HERMES_ONE)
delete coeff;
772 template<
typename Scalar>
773 Scalar DefaultMatrixFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
774 Geom<double> *e, Func<Scalar> **ext)
const
777 if(gt == HERMES_PLANAR) {
778 for (
int i = 0; i < n; i++) {
779 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
783 if(gt == HERMES_AXISYM_X) {
784 for (
int i = 0; i < n; i++) {
785 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
789 for (
int i = 0; i < n; i++) {
790 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
798 template<
typename Scalar>
799 Ord DefaultMatrixFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
800 Func<Ord> *v, Geom<Ord> *e, Func<Ord> **ext)
const
803 if(gt == HERMES_PLANAR) {
804 for (
int i = 0; i < n; i++) {
805 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
809 if(gt == HERMES_AXISYM_X) {
810 for (
int i = 0; i < n; i++) {
811 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
815 for (
int i = 0; i < n; i++) {
816 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
824 template<
typename Scalar>
825 MatrixFormSurf<Scalar>* DefaultMatrixFormSurf<Scalar>::clone()
const
827 return new DefaultMatrixFormSurf<Scalar>(*this);
830 template<
typename Scalar>
831 DefaultJacobianFormSurf<Scalar>::DefaultJacobianFormSurf(
int i,
int j,
std::string area,
832 Hermes1DFunction<Scalar>* coeff,
834 : MatrixFormSurf<Scalar>(i, j),
835 idx_j(j), coeff(coeff), gt(gt)
840 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
843 template<
typename Scalar>
844 DefaultJacobianFormSurf<Scalar>::DefaultJacobianFormSurf(
int i,
int j, Hermes::vector<std::string> areas,
845 Hermes1DFunction<Scalar>* coeff,
847 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
849 this->set_areas(areas);
852 if(coeff == HERMES_ONE) this->coeff =
new Hermes1DFunction<Scalar>(1.0);
855 template<
typename Scalar>
856 DefaultJacobianFormSurf<Scalar>::~DefaultJacobianFormSurf()
859 if(coeff == HERMES_ONE)
delete coeff;
862 template<
typename Scalar>
863 Scalar DefaultJacobianFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
864 Geom<double> *e, Func<Scalar> **ext)
const
867 for (
int i = 0; i < n; i++) {
868 result += wt[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u_ext[idx_j]->val[i]
869 + coeff->value(u_ext[idx_j]->val[i]))
870 * u->val[i] * v->val[i];
875 template<
typename Scalar>
876 Ord DefaultJacobianFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
877 Func<Ord> *v, Geom<Ord> *e, Func<Ord> **ext)
const
880 for (
int i = 0; i < n; i++) {
881 result += wt[i] * (coeff->derivative(u_ext[idx_j]->val[i]) * u_ext[idx_j]->val[i]
882 + coeff->value(u_ext[idx_j]->val[i]))
883 * u->val[i] * v->val[i];
888 template<
typename Scalar>
889 MatrixFormSurf<Scalar>* DefaultJacobianFormSurf<Scalar>::clone()
const
891 return new DefaultJacobianFormSurf<Scalar>(*this);
894 template<
typename Scalar>
895 DefaultVectorFormSurf<Scalar>::DefaultVectorFormSurf(
int i,
std::string area,
896 Hermes2DFunction<Scalar>* coeff,
898 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
903 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
906 template<
typename Scalar>
907 DefaultVectorFormSurf<Scalar>::DefaultVectorFormSurf(
int i, Hermes::vector<std::string> areas,
908 Hermes2DFunction<Scalar>* coeff,
910 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
912 this->set_areas(areas);
915 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
918 template<
typename Scalar>
919 DefaultVectorFormSurf<Scalar>::~DefaultVectorFormSurf()
922 if(coeff == HERMES_ONE)
delete coeff;
925 template<
typename Scalar>
926 Scalar DefaultVectorFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
927 Geom<double> *e, Func<Scalar> **ext)
const
930 if(gt == HERMES_PLANAR) {
931 for (
int i = 0; i < n; i++) {
932 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
936 if(gt == HERMES_AXISYM_X) {
937 for (
int i = 0; i < n; i++) {
938 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
942 for (
int i = 0; i < n; i++) {
943 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
951 template<
typename Scalar>
952 Ord DefaultVectorFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
953 Geom<Ord> *e, Func<Ord> **ext)
const
956 if(gt == HERMES_PLANAR) {
957 for (
int i = 0; i < n; i++) {
958 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
962 if(gt == HERMES_AXISYM_X) {
963 for (
int i = 0; i < n; i++) {
964 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
968 for (
int i = 0; i < n; i++) {
969 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
977 template<
typename Scalar>
978 VectorFormSurf<Scalar>* DefaultVectorFormSurf<Scalar>::clone()
const
980 return new DefaultVectorFormSurf<Scalar>(*this);
983 template<
typename Scalar>
984 DefaultResidualSurf<Scalar>::DefaultResidualSurf(
int i,
std::string area,
985 Hermes2DFunction<Scalar>* coeff,
987 : VectorFormSurf<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
992 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
995 template<
typename Scalar>
996 DefaultResidualSurf<Scalar>::DefaultResidualSurf(
int i, Hermes::vector<std::string> areas,
997 Hermes2DFunction<Scalar>* coeff,
999 : VectorFormSurf<Scalar>(i), idx_i(i), coeff(coeff), gt(gt)
1001 this->set_areas(areas);
1004 if(coeff == HERMES_ONE) this->coeff =
new Hermes2DFunction<Scalar>(1.0);
1007 template<
typename Scalar>
1008 DefaultResidualSurf<Scalar>::~DefaultResidualSurf()
1011 if(coeff == HERMES_ONE)
delete coeff;
1014 template<
typename Scalar>
1015 Scalar DefaultResidualSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
1016 Geom<double> *e, Func<Scalar> **ext)
const
1019 if(gt == HERMES_PLANAR) {
1020 for (
int i = 0; i < n; i++) {
1021 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1025 if(gt == HERMES_AXISYM_X) {
1026 for (
int i = 0; i < n; i++) {
1027 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1031 for (
int i = 0; i < n; i++) {
1032 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1040 template<
typename Scalar>
1041 Ord DefaultResidualSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
1042 Geom<Ord> *e, Func<Ord> **ext)
const
1044 Ord result = Ord(0);
1045 if(gt == HERMES_PLANAR) {
1046 for (
int i = 0; i < n; i++) {
1047 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1051 if(gt == HERMES_AXISYM_X) {
1052 for (
int i = 0; i < n; i++) {
1053 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1057 for (
int i = 0; i < n; i++) {
1058 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[idx_i]->val[i] * v->val[i];
1066 template<
typename Scalar>
1067 VectorFormSurf<Scalar>* DefaultResidualSurf<Scalar>::clone()
const
1069 return new DefaultResidualSurf(*
this);
1072 template<
typename Scalar>
1073 DefaultWeakFormLaplace<Scalar>::DefaultWeakFormLaplace(
std::string area,
1074 Hermes1DFunction<Scalar>* coeff,
1078 this->add_matrix_form(
new DefaultJacobianDiffusion<Scalar>(0, 0, area, coeff, HERMES_NONSYM, gt));
1081 this->add_vector_form(
new DefaultResidualDiffusion<Scalar>(0, area, coeff, gt));
1084 template<
typename Scalar>
1085 DefaultWeakFormPoisson<Scalar>::DefaultWeakFormPoisson() : WeakForm<Scalar>()
1089 template<
typename Scalar>
1090 DefaultWeakFormPoisson<Scalar>::DefaultWeakFormPoisson(
std::string area,
1091 Hermes1DFunction<Scalar>* coeff,
1092 Hermes2DFunction<Scalar>* f,
1097 this->add_matrix_form(
new DefaultJacobianDiffusion<Scalar>(0, 0, area, coeff, HERMES_NONSYM, gt));
1100 this->add_vector_form(
new DefaultResidualDiffusion<Scalar>(0, area, coeff, gt));
1101 this->add_vector_form(
new DefaultVectorFormVol<Scalar>(0, area, f, gt));
1104 template class HERMES_API DefaultMatrixFormVol<double>;
1105 template class HERMES_API DefaultMatrixFormVol<std::complex<double> >;
1106 template class HERMES_API DefaultJacobianDiffusion<double>;
1107 template class HERMES_API DefaultJacobianDiffusion<std::complex<double> >;
1108 template class HERMES_API DefaultMatrixFormDiffusion<double>;
1109 template class HERMES_API DefaultMatrixFormDiffusion<std::complex<double> >;
1110 template class HERMES_API DefaultResidualAdvection<double>;
1111 template class HERMES_API DefaultResidualAdvection<std::complex<double> >;
1112 template class HERMES_API DefaultJacobianAdvection<double>;
1113 template class HERMES_API DefaultJacobianAdvection<std::complex<double> >;
1114 template class HERMES_API DefaultResidualDiffusion<double>;
1115 template class HERMES_API DefaultResidualDiffusion<std::complex<double> >;
1116 template class HERMES_API DefaultMatrixFormSurf<double>;
1117 template class HERMES_API DefaultMatrixFormSurf<std::complex<double> >;
1118 template class HERMES_API DefaultVectorFormSurf<double>;
1119 template class HERMES_API DefaultVectorFormSurf<std::complex<double> >;
1120 template class HERMES_API DefaultVectorFormVol<double>;
1121 template class HERMES_API DefaultVectorFormVol<std::complex<double> >;
1122 template class HERMES_API DefaultJacobianFormSurf<double>;
1123 template class HERMES_API DefaultJacobianFormSurf<std::complex<double> >;
1124 template class HERMES_API DefaultWeakFormLaplace<double>;
1125 template class HERMES_API DefaultWeakFormLaplace<std::complex<double> >;
1126 template class HERMES_API DefaultWeakFormPoisson<double>;
1127 template class HERMES_API DefaultWeakFormPoisson<std::complex<double> >;
1128 template class HERMES_API DefaultResidualSurf<double>;
1129 template class HERMES_API DefaultResidualSurf<std::complex<double> >;
1130 template class HERMES_API DefaultResidualVol<double>;
1131 template class HERMES_API DefaultResidualVol<std::complex<double> >;