16 #include "weakform_library/weakforms_h1.h"
17 #include "weakform_library/integrals_h1.h"
26 DefaultMatrixFormVol<double>::DefaultMatrixFormVol(
int i,
int j,
std::string area, Hermes2DFunction<double>* coeff,
SymFlag sym,
GeomType gt)
27 : MatrixFormVol<double>(i, j), coeff(coeff), gt(gt)
30 this->setSymFlag(sym);
34 this->coeff =
new Hermes2DFunction<double>(1.0);
35 this->own_coeff =
true;
38 this->own_coeff =
false;
42 DefaultMatrixFormVol<std::complex<double> >::DefaultMatrixFormVol
44 : MatrixFormVol<
std::complex<double> >(i, j), coeff(coeff), gt(gt)
47 this->setSymFlag(sym);
50 this->coeff =
new Hermes2DFunction<std::complex<double> >(std::complex<double>(1.0, 1.0));
51 this->own_coeff =
true;
54 this->own_coeff =
false;
58 DefaultMatrixFormVol<double>::DefaultMatrixFormVol
59 (
int i,
int j, std::vector<std::string> areas,
61 : MatrixFormVol<double>(i, j), coeff(coeff), gt(gt)
63 this->set_areas(areas);
64 this->setSymFlag(sym);
67 this->coeff =
new Hermes2DFunction<double>(1.0);
68 this->own_coeff =
true;
71 this->own_coeff =
false;
74 DefaultMatrixFormVol<std::complex<double> >::DefaultMatrixFormVol
75 (
int i,
int j, std::vector<std::string> areas,
76 Hermes2DFunction<std::complex<double> >* coeff,
SymFlag sym,
GeomType gt)
77 : MatrixFormVol<
std::complex<double> >(i, j), coeff(coeff), gt(gt)
79 this->set_areas(areas);
80 this->setSymFlag(sym);
83 this->coeff =
new Hermes2DFunction<std::complex<double> >(std::complex<double>(1.0, 1.0));
84 this->own_coeff =
true;
87 this->own_coeff =
false;
90 template<
typename Scalar>
91 DefaultMatrixFormVol<Scalar>::~DefaultMatrixFormVol()
97 template<
typename Scalar>
98 Scalar DefaultMatrixFormVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
99 GeomVol<double> *e, Func<Scalar> **ext)
const
102 if (gt == HERMES_PLANAR)
104 if (coeff->is_constant())
106 for (
int i = 0; i < n; i++)
107 result += wt[i] * u->val[i] * v->val[i];
108 result *= coeff->value(e->x[0], e->y[0]);
112 for (
int i = 0; i < n; i++)
113 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
117 if (gt == HERMES_AXISYM_X) {
118 for (
int i = 0; i < n; i++) {
119 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
123 for (
int i = 0; i < n; i++) {
124 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
132 template<
typename Scalar>
133 Ord DefaultMatrixFormVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
134 Func<Ord> *v, GeomVol<Ord> *e, Func<Ord> **ext)
const
137 if (gt == HERMES_PLANAR) {
138 for (
int i = 0; i < n; i++) {
139 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
143 if (gt == HERMES_AXISYM_X) {
144 for (
int i = 0; i < n; i++) {
145 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
149 for (
int i = 0; i < n; i++) {
150 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
158 template<
typename Scalar>
159 MatrixFormVol<Scalar>* DefaultMatrixFormVol<Scalar>::clone()
const
161 return new DefaultMatrixFormVol<Scalar>(this->i, this->j, this->areas, this->coeff, this->sym, this->gt);
164 template<
typename Scalar>
165 DefaultJacobianDiffusion<Scalar>::DefaultJacobianDiffusion(
int i,
int j,
std::string area,
166 Hermes1DFunction<Scalar>* coeff,
168 : MatrixFormVol<Scalar>(i, j), coeff(coeff), gt(gt)
171 this->setSymFlag(sym);
172 if (coeff ==
nullptr)
174 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
175 this->own_coeff =
true;
178 this->own_coeff =
false;
181 template<
typename Scalar>
182 DefaultJacobianDiffusion<Scalar>::DefaultJacobianDiffusion(
int i,
int j, std::vector<std::string> areas,
184 : MatrixFormVol<Scalar>(i, j), coeff(coeff), gt(gt)
186 this->set_areas(areas);
187 this->setSymFlag(sym);
188 if (coeff ==
nullptr)
190 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
191 this->own_coeff =
true;
194 this->own_coeff =
false;
197 template<
typename Scalar>
198 DefaultJacobianDiffusion<Scalar>::~DefaultJacobianDiffusion()
204 template<
typename Scalar>
205 Scalar DefaultJacobianDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
206 Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext)
const
209 if (gt == HERMES_PLANAR)
211 if (coeff->is_constant())
213 Scalar result_der = 0;
214 for (
int i = 0; i < n; i++)
216 result += wt[i] * ((u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
217 result_der += wt[i] * (u->val[i] * (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i]));
219 result *= coeff->value(u_ext[this->previous_iteration_space_index]->val[0]);
220 result_der *= coeff->derivative(u_ext[this->previous_iteration_space_index]->val[0]);
221 result += result_der;
225 for (
int i = 0; i < n; i++)
227 result += wt[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
228 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
229 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
230 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
235 if (gt == HERMES_AXISYM_X) {
236 for (
int i = 0; i < n; i++) {
237 result += wt[i] * e->y[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
238 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
239 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
240 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
244 for (
int i = 0; i < n; i++) {
245 result += wt[i] * e->x[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
246 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
247 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
248 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
256 template<
typename Scalar>
257 Ord DefaultJacobianDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
258 GeomVol<Ord> *e, Func<Ord> **ext)
const
261 if (gt == HERMES_PLANAR) {
262 for (
int i = 0; i < n; i++) {
263 result += wt[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
264 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
265 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
266 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
270 if (gt == HERMES_AXISYM_X) {
271 for (
int i = 0; i < n; i++) {
272 result += wt[i] * e->y[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
273 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
274 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
275 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
279 for (
int i = 0; i < n; i++) {
280 result += wt[i] * e->x[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] *
281 (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i])
282 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
283 * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
291 template<
typename Scalar>
292 MatrixFormVol<Scalar>* DefaultJacobianDiffusion<Scalar>::clone()
const
294 return new DefaultJacobianDiffusion<Scalar>(this->i, this->j, this->areas, this->coeff, this->sym, this->gt);
297 template<
typename Scalar>
298 DefaultMatrixFormDiffusion<Scalar>::DefaultMatrixFormDiffusion(
int i,
int j,
std::string area,
299 Hermes1DFunction<Scalar>* coeff,
301 : MatrixFormVol<Scalar>(i, j), coeff(coeff), gt(gt)
304 this->setSymFlag(sym);
305 if (coeff ==
nullptr)
307 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
308 this->own_coeff =
true;
311 this->own_coeff =
false;
314 template<
typename Scalar>
315 DefaultMatrixFormDiffusion<Scalar>::DefaultMatrixFormDiffusion(
int i,
int j, std::vector<std::string> areas,
317 : MatrixFormVol<Scalar>(i, j), coeff(coeff), gt(gt)
319 this->set_areas(areas);
320 this->setSymFlag(sym);
321 if (coeff ==
nullptr)
323 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
324 this->own_coeff =
true;
327 this->own_coeff =
false;
330 template<
typename Scalar>
331 DefaultMatrixFormDiffusion<Scalar>::~DefaultMatrixFormDiffusion()
337 template<
typename Scalar>
338 Scalar DefaultMatrixFormDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
339 Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext)
const
343 for (
int i = 0; i < n; i++)
345 result += wt[i] * (8.854e-12*e->x[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
351 template<
typename Scalar>
352 Ord DefaultMatrixFormDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
353 GeomVol<Ord> *e, Func<Ord> **ext)
const
356 for (
int i = 0; i < n; i++)
358 result += wt[i] * (8.854e-12*e->x[i] * (u->dx[i] * v->dx[i] + u->dy[i] * v->dy[i]));
364 template<
typename Scalar>
365 MatrixFormVol<Scalar>* DefaultMatrixFormDiffusion<Scalar>::clone()
const
367 return new DefaultMatrixFormDiffusion<Scalar>(this->i, this->j, this->areas, this->coeff, this->sym, this->gt);
370 template<
typename Scalar>
371 DefaultJacobianAdvection<Scalar>::DefaultJacobianAdvection(
int i,
int j,
std::string area,
372 Hermes1DFunction<Scalar>* coeff1,
373 Hermes1DFunction<Scalar>* coeff2,
375 : MatrixFormVol<Scalar>(i, j), coeff1(coeff1), coeff2(coeff2), gt(gt)
379 if (gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
382 if (coeff1 ==
nullptr)
384 this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
385 this->own_coeff1 =
true;
388 this->own_coeff1 =
false;
389 if (coeff2 ==
nullptr)
391 this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
392 this->own_coeff2 =
true;
395 this->own_coeff2 =
false;
398 template<
typename Scalar>
399 DefaultJacobianAdvection<Scalar>::DefaultJacobianAdvection(
int i,
int j, std::vector<std::string> areas,
400 Hermes1DFunction<Scalar>* coeff1,
401 Hermes1DFunction<Scalar>* coeff2,
403 : MatrixFormVol<Scalar>(i, j), coeff1(coeff1), coeff2(coeff2), gt(gt)
405 this->set_areas(areas);
407 if (gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
410 if (coeff1 ==
nullptr)
412 this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
413 this->own_coeff1 =
true;
416 this->own_coeff1 =
false;
417 if (coeff2 ==
nullptr)
419 this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
420 this->own_coeff2 =
true;
423 this->own_coeff2 =
false;
426 template<
typename Scalar>
427 DefaultJacobianAdvection<Scalar>::~DefaultJacobianAdvection()
429 if (this->own_coeff1)
431 if (this->own_coeff2)
435 template<
typename Scalar>
436 Scalar DefaultJacobianAdvection<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u,
437 Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext)
const
440 for (
int i = 0; i < n; i++) {
441 result += wt[i] * (coeff1->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] * u_ext[this->previous_iteration_space_index]->dx[i] * v->val[i]
442 + coeff1->value(u_ext[this->previous_iteration_space_index]->val[i]) * u->dx[i] * v->val[i]
443 + coeff2->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] * u_ext[this->previous_iteration_space_index]->dy[i] * v->val[i]
444 + coeff2->value(u_ext[this->previous_iteration_space_index]->val[i]) * u->dy[i] * v->val[i]);
449 template<
typename Scalar>
450 Ord DefaultJacobianAdvection<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
451 GeomVol<Ord> *e, Func<Ord> **ext)
const
454 for (
int i = 0; i < n; i++) {
455 result += wt[i] * (coeff1->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] * u_ext[this->previous_iteration_space_index]->dx[i] * v->val[i]
456 + coeff1->value(u_ext[this->previous_iteration_space_index]->val[i]) * u->dx[i] * v->val[i]
457 + coeff2->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u->val[i] * u_ext[this->previous_iteration_space_index]->dy[i] * v->val[i]
458 + coeff2->value(u_ext[this->previous_iteration_space_index]->val[i]) * u->dy[i] * v->val[i]);
464 template<
typename Scalar>
465 MatrixFormVol<Scalar>* DefaultJacobianAdvection<Scalar>::clone()
const
467 return new DefaultJacobianAdvection<Scalar>(this->i, this->j, this->areas, this->coeff1, this->coeff2, this->gt);
470 template<
typename Scalar>
471 DefaultVectorFormVol<Scalar>::DefaultVectorFormVol(
int i,
std::string area,
472 Hermes2DFunction<Scalar>* coeff,
474 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
477 if (coeff ==
nullptr)
479 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
480 this->own_coeff =
true;
483 this->own_coeff =
false;
486 template<
typename Scalar>
487 DefaultVectorFormVol<Scalar>::DefaultVectorFormVol(
int i, std::vector<std::string> areas,
488 Hermes2DFunction<Scalar>* coeff,
490 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
492 this->set_areas(areas);
493 if (coeff ==
nullptr)
495 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
496 this->own_coeff =
true;
499 this->own_coeff =
false;
502 template<
typename Scalar>
503 DefaultVectorFormVol<Scalar>::~DefaultVectorFormVol()
509 template<
typename Scalar>
510 Scalar DefaultVectorFormVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
511 GeomVol<double> *e, Func<Scalar> **ext)
const
514 if (gt == HERMES_PLANAR) {
515 for (
int i = 0; i < n; i++) {
516 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
520 if (gt == HERMES_AXISYM_X) {
521 for (
int i = 0; i < n; i++) {
522 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
526 for (
int i = 0; i < n; i++) {
527 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
534 template<
typename Scalar>
535 Ord DefaultVectorFormVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
536 GeomVol<Ord> *e, Func<Ord> **ext)
const
539 if (gt == HERMES_PLANAR) {
540 for (
int i = 0; i < n; i++) {
541 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
545 if (gt == HERMES_AXISYM_X) {
546 for (
int i = 0; i < n; i++) {
547 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
551 for (
int i = 0; i < n; i++) {
552 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
560 template<
typename Scalar>
561 VectorFormVol<Scalar>* DefaultVectorFormVol<Scalar>::clone()
const
563 return new DefaultVectorFormVol<Scalar>(this->i, this->areas, this->coeff, this->gt);
566 template<
typename Scalar>
567 DefaultResidualVol<Scalar>::DefaultResidualVol(
int i,
std::string area,
568 Hermes2DFunction<Scalar>* coeff,
570 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
573 if (coeff ==
nullptr)
575 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
576 this->own_coeff =
true;
579 this->own_coeff =
false;
582 template<
typename Scalar>
583 DefaultResidualVol<Scalar>::DefaultResidualVol(
int i, std::vector<std::string> areas,
584 Hermes2DFunction<Scalar>* coeff,
586 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
588 this->set_areas(areas);
589 if (coeff ==
nullptr)
591 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
592 this->own_coeff =
true;
595 this->own_coeff =
false;
598 template<
typename Scalar>
599 DefaultResidualVol<Scalar>::~DefaultResidualVol()
605 template<
typename Scalar>
606 Scalar DefaultResidualVol<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
607 GeomVol<double> *e, Func<Scalar> **ext)
const
610 if (gt == HERMES_PLANAR) {
611 for (
int i = 0; i < n; i++) {
612 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
616 if (gt == HERMES_AXISYM_X) {
617 for (
int i = 0; i < n; i++) {
618 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
622 for (
int i = 0; i < n; i++) {
623 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
630 template<
typename Scalar>
631 Ord DefaultResidualVol<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
632 GeomVol<Ord> *e, Func<Ord> **ext)
const
635 if (gt == HERMES_PLANAR) {
636 for (
int i = 0; i < n; i++) {
637 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
641 if (gt == HERMES_AXISYM_X) {
642 for (
int i = 0; i < n; i++) {
643 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
647 for (
int i = 0; i < n; i++) {
648 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
656 template<
typename Scalar>
657 VectorFormVol<Scalar>* DefaultResidualVol<Scalar>::clone()
const
659 return new DefaultResidualVol(this->i, this->areas, this->coeff, this->gt);
662 template<
typename Scalar>
663 DefaultResidualDiffusion<Scalar>::DefaultResidualDiffusion(
int i,
std::string area,
664 Hermes1DFunction<Scalar>* coeff,
GeomType gt)
665 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
668 if (coeff ==
nullptr)
670 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
671 this->own_coeff =
true;
674 this->own_coeff =
false;
677 template<
typename Scalar>
678 DefaultResidualDiffusion<Scalar>::DefaultResidualDiffusion(
int i, std::vector<std::string> areas,
679 Hermes1DFunction<Scalar>* coeff,
GeomType gt)
680 : VectorFormVol<Scalar>(i), coeff(coeff), gt(gt)
682 this->set_areas(areas);
683 if (coeff ==
nullptr)
685 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
686 this->own_coeff =
true;
689 this->own_coeff =
false;
692 template<
typename Scalar>
693 DefaultResidualDiffusion<Scalar>::~DefaultResidualDiffusion()
699 template<
typename Scalar>
700 Scalar DefaultResidualDiffusion<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
701 GeomVol<double> *e, Func<Scalar> **ext)
const
704 if (gt == HERMES_PLANAR) {
705 for (
int i = 0; i < n; i++) {
706 result += wt[i] * coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
707 * (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i]);
711 if (gt == HERMES_AXISYM_X) {
712 for (
int i = 0; i < n; i++) {
713 result += wt[i] * e->y[i] * coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
714 * (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i]);
718 for (
int i = 0; i < n; i++) {
719 result += wt[i] * e->x[i] * coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
720 * (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i]);
728 template<
typename Scalar>
729 Ord DefaultResidualDiffusion<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
730 GeomVol<Ord> *e, Func<Ord> **ext)
const
733 for (
int i = 0; i < n; i++) {
734 result += wt[i] * coeff->value(u_ext[this->previous_iteration_space_index]->val[i])
735 * (u_ext[this->previous_iteration_space_index]->dx[i] * v->dx[i] + u_ext[this->previous_iteration_space_index]->dy[i] * v->dy[i]);
737 if (gt != HERMES_PLANAR) result = result * Ord(1);
742 template<
typename Scalar>
743 VectorFormVol<Scalar>* DefaultResidualDiffusion<Scalar>::clone()
const
745 return new DefaultResidualDiffusion<Scalar>(this->i, this->areas, this->coeff, this->gt);
748 template<
typename Scalar>
749 DefaultResidualAdvection<Scalar>::DefaultResidualAdvection(
int i,
std::string area,
750 Hermes1DFunction<Scalar>* coeff1,
751 Hermes1DFunction<Scalar>* coeff2,
753 : VectorFormVol<Scalar>(i), coeff1(coeff1), coeff2(coeff2), gt(gt)
757 if (gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
760 if (coeff1 ==
nullptr)
762 this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
763 this->own_coeff1 =
true;
766 this->own_coeff1 =
false;
767 if (coeff2 ==
nullptr)
769 this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
770 this->own_coeff2 =
true;
773 this->own_coeff2 =
false;
776 template<
typename Scalar>
777 DefaultResidualAdvection<Scalar>::DefaultResidualAdvection(
int i, std::vector<std::string> areas, \
778 Hermes1DFunction<Scalar>* coeff1,
779 Hermes1DFunction<Scalar>* coeff2,
781 : VectorFormVol<Scalar>(i), coeff1(coeff1), coeff2(coeff2), gt(gt)
783 this->set_areas(areas);
785 if (gt != HERMES_PLANAR)
throw Hermes::Exceptions::Exception(
"Axisymmetric advection forms not implemented yet.");
788 if (coeff1 ==
nullptr)
790 this->coeff1 =
new Hermes1DFunction<Scalar>(1.0);
791 this->own_coeff1 =
true;
794 this->own_coeff1 =
false;
795 if (coeff2 ==
nullptr)
797 this->coeff2 =
new Hermes1DFunction<Scalar>(1.0);
798 this->own_coeff2 =
true;
801 this->own_coeff2 =
false;
804 template<
typename Scalar>
805 DefaultResidualAdvection<Scalar>::~DefaultResidualAdvection()
807 if (this->own_coeff1)
809 if (this->own_coeff2)
813 template<
typename Scalar>
814 Scalar DefaultResidualAdvection<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
815 GeomVol<double> *e, Func<Scalar> **ext)
const
818 Func<Scalar>* u_prev = u_ext[this->previous_iteration_space_index];
819 for (
int i = 0; i < n; i++) {
820 result += wt[i] * (coeff1->value(u_prev->val[i]) * (u_prev->dx[i] * v->val[i])
821 + coeff2->value(u_prev->val[i]) * (u_prev->dy[i] * v->val[i]));
826 template<
typename Scalar>
827 Ord DefaultResidualAdvection<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
828 GeomVol<Ord> *e, Func<Ord> **ext)
const
831 Func<Ord>* u_prev = u_ext[this->previous_iteration_space_index];
832 for (
int i = 0; i < n; i++) {
833 result += wt[i] * (coeff1->value(u_prev->val[i]) * (u_prev->dx[i] * v->val[i])
834 + coeff2->value(u_prev->val[i]) * (u_prev->dy[i] * v->val[i]));
839 template<
typename Scalar>
840 VectorFormVol<Scalar>* DefaultResidualAdvection<Scalar>::clone()
const
842 return new DefaultResidualAdvection<Scalar>(this->i, this->areas, this->coeff1, this->coeff2, this->gt);
845 template<
typename Scalar>
846 DefaultMatrixFormSurf<Scalar>::DefaultMatrixFormSurf(
int i,
int j,
std::string area,
847 Hermes2DFunction<Scalar>* coeff,
849 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
852 if (coeff ==
nullptr)
854 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
855 this->own_coeff =
true;
858 this->own_coeff =
false;
861 template<
typename Scalar>
862 DefaultMatrixFormSurf<Scalar>::DefaultMatrixFormSurf(
int i,
int j, std::vector<std::string> areas,
863 Hermes2DFunction<Scalar>* coeff,
865 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
867 this->set_areas(areas);
868 if (coeff ==
nullptr)
870 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
871 this->own_coeff =
true;
874 this->own_coeff =
false;
877 template<
typename Scalar>
878 DefaultMatrixFormSurf<Scalar>::~DefaultMatrixFormSurf()
884 template<
typename Scalar>
885 Scalar DefaultMatrixFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
886 GeomSurf<double> *e, Func<Scalar> **ext)
const
889 if (gt == HERMES_PLANAR) {
890 for (
int i = 0; i < n; i++) {
891 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
895 if (gt == HERMES_AXISYM_X) {
896 for (
int i = 0; i < n; i++) {
897 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
901 for (
int i = 0; i < n; i++) {
902 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
910 template<
typename Scalar>
911 Ord DefaultMatrixFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
912 Func<Ord> *v, GeomSurf<Ord> *e, Func<Ord> **ext)
const
915 if (gt == HERMES_PLANAR) {
916 for (
int i = 0; i < n; i++) {
917 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
921 if (gt == HERMES_AXISYM_X) {
922 for (
int i = 0; i < n; i++) {
923 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
927 for (
int i = 0; i < n; i++) {
928 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u->val[i] * v->val[i];
936 template<
typename Scalar>
937 MatrixFormSurf<Scalar>* DefaultMatrixFormSurf<Scalar>::clone()
const
939 return new DefaultMatrixFormSurf<Scalar>(this->i, this->j, this->areas, this->coeff, this->gt);
942 template<
typename Scalar>
943 DefaultJacobianFormSurf<Scalar>::DefaultJacobianFormSurf(
int i,
int j,
std::string area,
944 Hermes1DFunction<Scalar>* coeff,
946 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
949 if (coeff ==
nullptr)
951 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
952 this->own_coeff =
true;
955 this->own_coeff =
false;
958 template<
typename Scalar>
959 DefaultJacobianFormSurf<Scalar>::DefaultJacobianFormSurf(
int i,
int j, std::vector<std::string> areas,
960 Hermes1DFunction<Scalar>* coeff,
962 : MatrixFormSurf<Scalar>(i, j), coeff(coeff), gt(gt)
964 this->set_areas(areas);
965 if (coeff ==
nullptr)
967 this->coeff =
new Hermes1DFunction<Scalar>(1.0);
968 this->own_coeff =
true;
971 this->own_coeff =
false;
974 template<
typename Scalar>
975 DefaultJacobianFormSurf<Scalar>::~DefaultJacobianFormSurf()
981 template<
typename Scalar>
982 Scalar DefaultJacobianFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *u, Func<double> *v,
983 GeomSurf<double> *e, Func<Scalar> **ext)
const
986 for (
int i = 0; i < n; i++) {
987 result += wt[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u_ext[this->previous_iteration_space_index]->val[i]
988 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i]))
989 * u->val[i] * v->val[i];
994 template<
typename Scalar>
995 Ord DefaultJacobianFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
996 Func<Ord> *v, GeomSurf<Ord> *e, Func<Ord> **ext)
const
999 for (
int i = 0; i < n; i++) {
1000 result += wt[i] * (coeff->derivative(u_ext[this->previous_iteration_space_index]->val[i]) * u_ext[this->previous_iteration_space_index]->val[i]
1001 + coeff->value(u_ext[this->previous_iteration_space_index]->val[i]))
1002 * u->val[i] * v->val[i];
1007 template<
typename Scalar>
1008 MatrixFormSurf<Scalar>* DefaultJacobianFormSurf<Scalar>::clone()
const
1010 return new DefaultJacobianFormSurf<Scalar>(this->i, this->j, this->areas, this->coeff, this->gt);
1013 template<
typename Scalar>
1014 DefaultVectorFormSurf<Scalar>::DefaultVectorFormSurf(
int i,
std::string area,
1015 Hermes2DFunction<Scalar>* coeff,
1017 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
1020 if (coeff ==
nullptr)
1022 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
1023 this->own_coeff =
true;
1026 this->own_coeff =
false;
1029 template<
typename Scalar>
1030 DefaultVectorFormSurf<Scalar>::DefaultVectorFormSurf(
int i, std::vector<std::string> areas,
1031 Hermes2DFunction<Scalar>* coeff,
1033 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
1035 this->set_areas(areas);
1037 if (coeff ==
nullptr)
1039 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
1040 this->own_coeff =
true;
1043 this->own_coeff =
false;
1046 template<
typename Scalar>
1047 DefaultVectorFormSurf<Scalar>::~DefaultVectorFormSurf()
1049 if (this->own_coeff)
1053 template<
typename Scalar>
1054 Scalar DefaultVectorFormSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
1055 GeomSurf<double> *e, Func<Scalar> **ext)
const
1058 if (gt == HERMES_PLANAR) {
1059 for (
int i = 0; i < n; i++) {
1060 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1064 if (gt == HERMES_AXISYM_X) {
1065 for (
int i = 0; i < n; i++) {
1066 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1070 for (
int i = 0; i < n; i++) {
1071 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1079 template<
typename Scalar>
1080 Ord DefaultVectorFormSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
1081 GeomSurf<Ord> *e, Func<Ord> **ext)
const
1083 Ord result = Ord(0);
1084 if (gt == HERMES_PLANAR) {
1085 for (
int i = 0; i < n; i++) {
1086 result += wt[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1090 if (gt == HERMES_AXISYM_X) {
1091 for (
int i = 0; i < n; i++) {
1092 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1096 for (
int i = 0; i < n; i++) {
1097 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * v->val[i];
1105 template<
typename Scalar>
1106 VectorFormSurf<Scalar>* DefaultVectorFormSurf<Scalar>::clone()
const
1108 return new DefaultVectorFormSurf<Scalar>(this->i, this->areas, this->coeff, this->gt);
1111 template<
typename Scalar>
1112 DefaultResidualSurf<Scalar>::DefaultResidualSurf(
int i,
std::string area,
1113 Hermes2DFunction<Scalar>* coeff,
1115 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
1118 if (coeff ==
nullptr)
1120 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
1121 this->own_coeff =
true;
1124 this->own_coeff =
false;
1127 template<
typename Scalar>
1128 DefaultResidualSurf<Scalar>::DefaultResidualSurf(
int i, std::vector<std::string> areas,
1129 Hermes2DFunction<Scalar>* coeff,
1131 : VectorFormSurf<Scalar>(i), coeff(coeff), gt(gt)
1133 this->set_areas(areas);
1134 if (coeff ==
nullptr)
1136 this->coeff =
new Hermes2DFunction<Scalar>(1.0);
1137 this->own_coeff =
true;
1140 this->own_coeff =
false;
1143 template<
typename Scalar>
1144 DefaultResidualSurf<Scalar>::~DefaultResidualSurf()
1146 if (this->own_coeff)
1150 template<
typename Scalar>
1151 Scalar DefaultResidualSurf<Scalar>::value(
int n,
double *wt, Func<Scalar> *u_ext[], Func<double> *v,
1152 GeomSurf<double> *e, Func<Scalar> **ext)
const
1155 if (gt == HERMES_PLANAR) {
1156 for (
int i = 0; i < n; i++) {
1157 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1161 if (gt == HERMES_AXISYM_X) {
1162 for (
int i = 0; i < n; i++) {
1163 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1167 for (
int i = 0; i < n; i++) {
1168 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1176 template<
typename Scalar>
1177 Ord DefaultResidualSurf<Scalar>::ord(
int n,
double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
1178 GeomSurf<Ord> *e, Func<Ord> **ext)
const
1180 Ord result = Ord(0);
1181 if (gt == HERMES_PLANAR) {
1182 for (
int i = 0; i < n; i++) {
1183 result += wt[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1187 if (gt == HERMES_AXISYM_X) {
1188 for (
int i = 0; i < n; i++) {
1189 result += wt[i] * e->y[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1193 for (
int i = 0; i < n; i++) {
1194 result += wt[i] * e->x[i] * coeff->value(e->x[i], e->y[i]) * u_ext[this->previous_iteration_space_index]->val[i] * v->val[i];
1202 template<
typename Scalar>
1203 VectorFormSurf<Scalar>* DefaultResidualSurf<Scalar>::clone()
const
1205 return new DefaultResidualSurf(this->i, this->areas, this->coeff, this->gt);
1208 template<
typename Scalar>
1209 DefaultWeakFormLaplace<Scalar>::DefaultWeakFormLaplace(
std::string area,
1210 Hermes1DFunction<Scalar>* coeff,
1214 this->add_matrix_form(
new DefaultJacobianDiffusion<Scalar>(0, 0, area, coeff, HERMES_NONSYM, gt));
1217 this->add_vector_form(
new DefaultResidualDiffusion<Scalar>(0, area, coeff, gt));
1220 template<
typename Scalar>
1221 DefaultWeakFormLaplaceLinear<Scalar>::DefaultWeakFormLaplaceLinear(
std::string area,
GeomType gt) : WeakForm<Scalar>()
1224 this->add_matrix_form(
new DefaultMatrixFormDiffusion<Scalar>(0, 0, area,
nullptr, HERMES_SYM, gt));
1227 template<
typename Scalar>
1228 DefaultWeakFormPoisson<Scalar>::DefaultWeakFormPoisson() : WeakForm<Scalar>()
1232 template<
typename Scalar>
1233 DefaultWeakFormPoisson<Scalar>::DefaultWeakFormPoisson(
std::string area,
1234 Hermes1DFunction<Scalar>* coeff,
1235 Hermes2DFunction<Scalar>* f,
1240 this->add_matrix_form(
new DefaultJacobianDiffusion<Scalar>(0, 0, area, coeff, HERMES_NONSYM, gt));
1243 this->add_vector_form(
new DefaultResidualDiffusion<Scalar>(0, area, coeff, gt));
1244 this->add_vector_form(
new DefaultVectorFormVol<Scalar>(0, area, f, gt));
1247 template<
typename Scalar>
1248 DefaultWeakFormPoissonLinear<Scalar>::DefaultWeakFormPoissonLinear(
std::string area,
1249 Hermes2DFunction<Scalar>* f,
1253 this->add_matrix_form(
new DefaultMatrixFormDiffusion<Scalar>(0, 0, area,
nullptr, HERMES_SYM));
1256 this->add_vector_form(
new DefaultVectorFormVol<Scalar>(0, area, f));
1259 template class HERMES_API DefaultMatrixFormVol < double > ;
1260 template class HERMES_API DefaultMatrixFormVol < std::complex<double> > ;
1261 template class HERMES_API DefaultJacobianDiffusion < double > ;
1262 template class HERMES_API DefaultJacobianDiffusion < std::complex<double> > ;
1263 template class HERMES_API DefaultMatrixFormDiffusion < double > ;
1264 template class HERMES_API DefaultMatrixFormDiffusion < std::complex<double> > ;
1265 template class HERMES_API DefaultResidualAdvection < double > ;
1266 template class HERMES_API DefaultResidualAdvection < std::complex<double> > ;
1267 template class HERMES_API DefaultJacobianAdvection < double > ;
1268 template class HERMES_API DefaultJacobianAdvection < std::complex<double> > ;
1269 template class HERMES_API DefaultResidualDiffusion < double > ;
1270 template class HERMES_API DefaultResidualDiffusion < std::complex<double> > ;
1271 template class HERMES_API DefaultMatrixFormSurf < double > ;
1272 template class HERMES_API DefaultMatrixFormSurf < std::complex<double> > ;
1273 template class HERMES_API DefaultVectorFormSurf < double > ;
1274 template class HERMES_API DefaultVectorFormSurf < std::complex<double> > ;
1275 template class HERMES_API DefaultVectorFormVol < double > ;
1276 template class HERMES_API DefaultVectorFormVol < std::complex<double> > ;
1277 template class HERMES_API DefaultJacobianFormSurf < double > ;
1278 template class HERMES_API DefaultJacobianFormSurf < std::complex<double> > ;
1279 template class HERMES_API DefaultWeakFormLaplace < double > ;
1280 template class HERMES_API DefaultWeakFormLaplace < std::complex<double> > ;
1281 template class HERMES_API DefaultWeakFormLaplaceLinear < double > ;
1282 template class HERMES_API DefaultWeakFormLaplaceLinear < std::complex<double> > ;
1283 template class HERMES_API DefaultWeakFormPoisson < double > ;
1284 template class HERMES_API DefaultWeakFormPoisson < std::complex<double> > ;
1285 template class HERMES_API DefaultWeakFormPoissonLinear < double > ;
1286 template class HERMES_API DefaultWeakFormPoissonLinear < std::complex<double> > ;
1287 template class HERMES_API DefaultResidualSurf < double > ;
1288 template class HERMES_API DefaultResidualSurf < std::complex<double> > ;
1289 template class HERMES_API DefaultResidualVol < double > ;
1290 template class HERMES_API DefaultResidualVol < std::complex<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.