16 #include <deal.II/base/function_bessel.h> 17 #include <deal.II/base/function_lib.h> 18 #include <deal.II/base/numbers.h> 19 #include <deal.II/base/point.h> 20 #include <deal.II/base/std_cxx17/cmath.h> 21 #include <deal.II/base/tensor.h> 23 #include <deal.II/lac/vector.h> 27 DEAL_II_NAMESPACE_OPEN
53 std::vector<double> & values,
54 const unsigned int)
const 56 Assert(values.size() == points.size(),
59 for (
unsigned int i = 0; i < points.size(); ++i)
78 std::vector<double> & values,
79 const unsigned int)
const 81 Assert(values.size() == points.size(),
84 for (
unsigned int i = 0; i < points.size(); ++i)
114 const unsigned int)
const 116 Assert(gradients.size() == points.size(),
119 for (
unsigned int i = 0; i < points.size(); ++i)
140 std::vector<double> & values,
141 const unsigned int)
const 144 Assert(values.size() == points.size(),
147 for (
unsigned int i = 0; i < points.size(); ++i)
150 values[i] = p(0) * p(1);
162 Assert(values.size() == points.size(),
166 for (
unsigned int i = 0; i < points.size(); ++i)
169 values[i](0) = p(0) * p(1);
186 std::vector<double> & values,
187 const unsigned int)
const 190 Assert(values.size() == points.size(),
193 for (
unsigned int i = 0; i < points.size(); ++i)
216 const unsigned int)
const 219 Assert(gradients.size() == points.size(),
222 for (
unsigned int i = 0; i < points.size(); ++i)
224 gradients[i][0] = points[i](1);
225 gradients[i][1] = points[i](0);
237 Assert(gradients.size() == points.size(),
239 Assert(gradients[0].size() == 1,
242 for (
unsigned int i = 0; i < points.size(); ++i)
244 gradients[i][0][0] = points[i](1);
245 gradients[i][0][1] = points[i](0);
266 return 1. - p(0) * p(0) + offset;
268 return (1. - p(0) * p(0)) * (1. - p(1) * p(1)) + offset;
270 return (1. - p(0) * p(0)) * (1. - p(1) * p(1)) * (1. - p(2) * p(2)) +
281 std::vector<double> & values,
282 const unsigned int)
const 284 Assert(values.size() == points.size(),
287 for (
unsigned int i = 0; i < points.size(); ++i)
293 values[i] = 1. - p(0) * p(0) + offset;
296 values[i] = (1. - p(0) * p(0)) * (1. - p(1) * p(1)) + offset;
300 (1. - p(0) * p(0)) * (1. - p(1) * p(1)) * (1. - p(2) * p(2)) +
320 return -2. * ((1. - p(0) * p(0)) + (1. - p(1) * p(1)));
322 return -2. * ((1. - p(0) * p(0)) * (1. - p(1) * p(1)) +
323 (1. - p(1) * p(1)) * (1. - p(2) * p(2)) +
324 (1. - p(2) * p(2)) * (1. - p(0) * p(0)));
334 std::vector<double> & values,
335 const unsigned int)
const 337 Assert(values.size() == points.size(),
340 for (
unsigned int i = 0; i < points.size(); ++i)
349 values[i] = -2. * ((1. - p(0) * p(0)) + (1. - p(1) * p(1)));
352 values[i] = -2. * ((1. - p(0) * p(0)) * (1. - p(1) * p(1)) +
353 (1. - p(1) * p(1)) * (1. - p(2) * p(2)) +
354 (1. - p(2) * p(2)) * (1. - p(0) * p(0)));
370 result[0] = -2. * p(0);
373 result[0] = -2. * p(0) * (1. - p(1) * p(1));
374 result[1] = -2. * p(1) * (1. - p(0) * p(0));
377 result[0] = -2. * p(0) * (1. - p(1) * p(1)) * (1. - p(2) * p(2));
378 result[1] = -2. * p(1) * (1. - p(0) * p(0)) * (1. - p(2) * p(2));
379 result[2] = -2. * p(2) * (1. - p(0) * p(0)) * (1. - p(1) * p(1));
391 const unsigned int)
const 393 Assert(gradients.size() == points.size(),
396 for (
unsigned int i = 0; i < points.size(); ++i)
402 gradients[i][0] = -2. * p(0);
405 gradients[i][0] = -2. * p(0) * (1. - p(1) * p(1));
406 gradients[i][1] = -2. * p(1) * (1. - p(0) * p(0));
410 -2. * p(0) * (1. - p(1) * p(1)) * (1. - p(2) * p(2));
412 -2. * p(1) * (1. - p(0) * p(0)) * (1. - p(2) * p(2));
414 -2. * p(2) * (1. - p(0) * p(0)) * (1. - p(1) * p(1));
455 std::vector<double> & values,
456 const unsigned int)
const 458 Assert(values.size() == points.size(),
461 for (
unsigned int i = 0; i < points.size(); ++i)
462 values[i] =
value(points[i]);
472 Assert(values.size() == points.size(),
475 for (
unsigned int i = 0; i < points.size(); ++i)
477 const double v =
value(points[i]);
478 for (
unsigned int k = 0; k < values[i].size(); ++k)
511 std::vector<double> & values,
512 const unsigned int)
const 514 Assert(values.size() == points.size(),
517 for (
unsigned int i = 0; i < points.size(); ++i)
558 const unsigned int)
const 560 Assert(gradients.size() == points.size(),
563 for (
unsigned int i = 0; i < points.size(); ++i)
606 result[0][0] = -pi2 * std::cos(numbers::PI_2 * p(0));
611 const double coco = -pi2 * std::cos(numbers::PI_2 * p(0)) *
612 std::cos(numbers::PI_2 * p(1));
613 const double sisi = pi2 * std::sin(numbers::PI_2 * p(0)) *
614 std::sin(numbers::PI_2 * p(1));
624 const double cococo = -pi2 * std::cos(numbers::PI_2 * p(0)) *
625 std::cos(numbers::PI_2 * p(1)) *
626 std::cos(numbers::PI_2 * p(2));
627 const double sisico = pi2 * std::sin(numbers::PI_2 * p(0)) *
628 std::sin(numbers::PI_2 * p(1)) *
629 std::cos(numbers::PI_2 * p(2));
630 const double sicosi = pi2 * std::sin(numbers::PI_2 * p(0)) *
631 std::cos(numbers::PI_2 * p(1)) *
632 std::sin(numbers::PI_2 * p(2));
633 const double cosisi = pi2 * std::cos(numbers::PI_2 * p(0)) *
634 std::sin(numbers::PI_2 * p(1)) *
635 std::sin(numbers::PI_2 * p(2));
637 result[0][0] = cococo;
638 result[1][1] = cococo;
639 result[2][2] = cococo;
641 result[0][1] = sisico;
642 result[0][2] = sicosi;
643 result[1][2] = cosisi;
657 const unsigned int)
const 659 Assert(hessians.size() == points.size(),
664 for (
unsigned int i = 0; i < points.size(); ++i)
670 hessians[i][0][0] = -pi2 * std::cos(numbers::PI_2 * p(0));
675 const double coco = -pi2 * std::cos(numbers::PI_2 * p(0)) *
676 std::cos(numbers::PI_2 * p(1));
677 const double sisi = pi2 * std::sin(numbers::PI_2 * p(0)) *
678 std::sin(numbers::PI_2 * p(1));
679 hessians[i][0][0] = coco;
680 hessians[i][1][1] = coco;
682 hessians[i][0][1] = sisi;
688 const double cococo = -pi2 * std::cos(numbers::PI_2 * p(0)) *
689 std::cos(numbers::PI_2 * p(1)) *
690 std::cos(numbers::PI_2 * p(2));
691 const double sisico = pi2 * std::sin(numbers::PI_2 * p(0)) *
692 std::sin(numbers::PI_2 * p(1)) *
693 std::cos(numbers::PI_2 * p(2));
694 const double sicosi = pi2 * std::sin(numbers::PI_2 * p(0)) *
695 std::cos(numbers::PI_2 * p(1)) *
696 std::sin(numbers::PI_2 * p(2));
697 const double cosisi = pi2 * std::cos(numbers::PI_2 * p(0)) *
698 std::sin(numbers::PI_2 * p(1)) *
699 std::sin(numbers::PI_2 * p(2));
701 hessians[i][0][0] = cococo;
702 hessians[i][1][1] = cococo;
703 hessians[i][2][2] = cococo;
705 hessians[i][0][1] = sisico;
706 hessians[i][0][2] = sicosi;
707 hessians[i][1][2] = cosisi;
727 const unsigned int d)
const 730 const unsigned int d1 = (d + 1) % dim;
731 const unsigned int d2 = (d + 2) % dim;
787 std::vector<double> & values,
788 const unsigned int d)
const 790 Assert(values.size() == points.size(),
793 const unsigned int d1 = (d + 1) % dim;
794 const unsigned int d2 = (d + 2) % dim;
796 for (
unsigned int i = 0; i < points.size(); ++i)
826 Assert(values.size() == points.size(),
829 for (
unsigned int i = 0; i < points.size(); ++i)
864 const unsigned int d)
const 873 const unsigned int d)
const 876 const unsigned int d1 = (d + 1) % dim;
877 const unsigned int d2 = (d + 2) % dim;
884 result[0] = -pi2 * std::cos(numbers::PI_2 * p(0));
887 result[d] = -pi2 * std::cos(numbers::PI_2 * p(d)) *
888 std::cos(numbers::PI_2 * p(d1));
889 result[d1] = pi2 * std::sin(numbers::PI_2 * p(d)) *
890 std::sin(numbers::PI_2 * p(d1));
893 result[d] = -pi2 * std::cos(numbers::PI_2 * p(d)) *
894 std::cos(numbers::PI_2 * p(d1)) *
895 std::cos(numbers::PI_2 * p(d2));
896 result[d1] = pi2 * std::sin(numbers::PI_2 * p(d)) *
897 std::sin(numbers::PI_2 * p(d1)) *
898 std::cos(numbers::PI_2 * p(d2));
899 result[d2] = pi2 * std::sin(numbers::PI_2 * p(d)) *
900 std::cos(numbers::PI_2 * p(d1)) *
901 std::sin(numbers::PI_2 * p(d2));
914 const unsigned int d)
const 917 const unsigned int d1 = (d + 1) % dim;
918 const unsigned int d2 = (d + 2) % dim;
921 Assert(gradients.size() == points.size(),
923 for (
unsigned int i = 0; i < points.size(); ++i)
931 result[0] = -pi2 * std::cos(numbers::PI_2 * p(0));
934 result[d] = -pi2 * std::cos(numbers::PI_2 * p(d)) *
935 std::cos(numbers::PI_2 * p(d1));
936 result[d1] = pi2 * std::sin(numbers::PI_2 * p(d)) *
937 std::sin(numbers::PI_2 * p(d1));
940 result[d] = -pi2 * std::cos(numbers::PI_2 * p(d)) *
941 std::cos(numbers::PI_2 * p(d1)) *
942 std::cos(numbers::PI_2 * p(d2));
943 result[d1] = pi2 * std::sin(numbers::PI_2 * p(d)) *
944 std::sin(numbers::PI_2 * p(d1)) *
945 std::cos(numbers::PI_2 * p(d2));
946 result[d2] = pi2 * std::sin(numbers::PI_2 * p(d)) *
947 std::cos(numbers::PI_2 * p(d1)) *
948 std::sin(numbers::PI_2 * p(d2));
966 for (
unsigned int i = 0; i < points.size(); ++i)
972 gradients[i][0][0] = -pi2 * std::cos(numbers::PI_2 * p(0));
977 const double coco = -pi2 * std::cos(numbers::PI_2 * p(0)) *
978 std::cos(numbers::PI_2 * p(1));
979 const double sisi = pi2 * std::sin(numbers::PI_2 * p(0)) *
980 std::sin(numbers::PI_2 * p(1));
981 gradients[i][0][0] = coco;
982 gradients[i][1][1] = coco;
983 gradients[i][0][1] = sisi;
984 gradients[i][1][0] = sisi;
990 const double cococo = -pi2 * std::cos(numbers::PI_2 * p(0)) *
991 std::cos(numbers::PI_2 * p(1)) *
992 std::cos(numbers::PI_2 * p(2));
993 const double sisico = pi2 * std::sin(numbers::PI_2 * p(0)) *
994 std::sin(numbers::PI_2 * p(1)) *
995 std::cos(numbers::PI_2 * p(2));
996 const double sicosi = pi2 * std::sin(numbers::PI_2 * p(0)) *
997 std::cos(numbers::PI_2 * p(1)) *
998 std::sin(numbers::PI_2 * p(2));
999 const double cosisi = pi2 * std::cos(numbers::PI_2 * p(0)) *
1000 std::sin(numbers::PI_2 * p(1)) *
1001 std::sin(numbers::PI_2 * p(2));
1003 gradients[i][0][0] = cococo;
1004 gradients[i][1][1] = cococo;
1005 gradients[i][2][2] = cococo;
1006 gradients[i][0][1] = sisico;
1007 gradients[i][1][0] = sisico;
1008 gradients[i][0][2] = sicosi;
1009 gradients[i][2][0] = sicosi;
1010 gradients[i][1][2] = cosisi;
1011 gradients[i][2][1] = cosisi;
1030 return std::exp(p(0));
1032 return std::exp(p(0)) * std::exp(p(1));
1034 return std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1044 std::vector<double> & values,
1045 const unsigned int)
const 1047 Assert(values.size() == points.size(),
1050 for (
unsigned int i = 0; i < points.size(); ++i)
1056 values[i] = std::exp(p(0));
1059 values[i] = std::exp(p(0)) * std::exp(p(1));
1062 values[i] = std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1077 return std::exp(p(0));
1079 return 2 * std::exp(p(0)) * std::exp(p(1));
1081 return 3 * std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1091 std::vector<double> & values,
1092 const unsigned int)
const 1094 Assert(values.size() == points.size(),
1097 for (
unsigned int i = 0; i < points.size(); ++i)
1103 values[i] = std::exp(p(0));
1106 values[i] = 2 * std::exp(p(0)) * std::exp(p(1));
1109 values[i] = 3 * std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1125 result[0] = std::exp(p(0));
1128 result[0] = std::exp(p(0)) * std::exp(p(1));
1129 result[1] = result[0];
1132 result[0] = std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1133 result[1] = result[0];
1134 result[2] = result[0];
1146 const unsigned int)
const 1148 Assert(gradients.size() == points.size(),
1151 for (
unsigned int i = 0; i < points.size(); ++i)
1157 gradients[i][0] = std::exp(p(0));
1160 gradients[i][0] = std::exp(p(0)) * std::exp(p(1));
1161 gradients[i][1] = gradients[i][0];
1165 std::exp(p(0)) * std::exp(p(1)) * std::exp(p(2));
1166 gradients[i][1] = gradients[i][0];
1167 gradients[i][2] = gradients[i][0];
1179 LSingularityFunction::value(
const Point<2> &p,
const unsigned int)
const 1184 if ((x >= 0) && (y >= 0))
1188 double r2 = x * x + y * y;
1190 return std::pow(r2, 1. / 3.) * std::sin(2. / 3. * phi);
1195 LSingularityFunction::value_list(
const std::vector<
Point<2>> &points,
1196 std::vector<double> & values,
1197 const unsigned int)
const 1199 Assert(values.size() == points.size(),
1202 for (
unsigned int i = 0; i < points.size(); ++i)
1204 double x = points[i](0);
1205 double y = points[i](1);
1207 if ((x >= 0) && (y >= 0))
1212 double r2 = x * x + y * y;
1214 values[i] = std::pow(r2, 1. / 3.) * std::sin(2. / 3. * phi);
1221 LSingularityFunction::vector_value_list(
1222 const std::vector<
Point<2>> &points,
1225 Assert(values.size() == points.size(),
1228 for (
unsigned int i = 0; i < points.size(); ++i)
1230 Assert(values[i].size() == 1,
1232 double x = points[i](0);
1233 double y = points[i](1);
1235 if ((x >= 0) && (y >= 0))
1240 double r2 = x * x + y * y;
1242 values[i](0) = std::pow(r2, 1. / 3.) * std::sin(2. / 3. * phi);
1249 LSingularityFunction::laplacian(
const Point<2> &,
const unsigned int)
const 1256 LSingularityFunction::laplacian_list(
const std::vector<
Point<2>> &points,
1257 std::vector<double> & values,
1258 const unsigned int)
const 1260 Assert(values.size() == points.size(),
1263 for (
unsigned int i = 0; i < points.size(); ++i)
1269 LSingularityFunction::gradient(
const Point<2> &p,
const unsigned int)
const 1274 double r43 = std::pow(x * x + y * y, 2. / 3.);
1277 result[0] = 2. / 3. *
1278 (std::sin(2. / 3. * phi) * x + std::cos(2. / 3. * phi) * y) /
1280 result[1] = 2. / 3. *
1281 (std::sin(2. / 3. * phi) * y - std::cos(2. / 3. * phi) * x) /
1288 LSingularityFunction::gradient_list(
const std::vector<
Point<2>> &points,
1290 const unsigned int)
const 1292 Assert(gradients.size() == points.size(),
1295 for (
unsigned int i = 0; i < points.size(); ++i)
1301 double r43 = std::pow(x * x + y * y, 2. / 3.);
1305 (std::sin(2. / 3. * phi) * x + std::cos(2. / 3. * phi) * y) / r43;
1308 (std::sin(2. / 3. * phi) * y - std::cos(2. / 3. * phi) * x) / r43;
1314 LSingularityFunction::vector_gradient_list(
1315 const std::vector<
Point<2>> & points,
1316 std::vector<std::vector<
Tensor<1, 2>>> &gradients)
const 1318 Assert(gradients.size() == points.size(),
1321 for (
unsigned int i = 0; i < points.size(); ++i)
1323 Assert(gradients[i].size() == 1,
1329 double r43 = std::pow(x * x + y * y, 2. / 3.);
1331 gradients[i][0][0] =
1333 (std::sin(2. / 3. * phi) * x + std::cos(2. / 3. * phi) * y) / r43;
1334 gradients[i][0][1] =
1336 (std::sin(2. / 3. * phi) * y - std::cos(2. / 3. * phi) * x) / r43;
1348 LSingularityGradFunction::value(
const Point<2> &p,
const unsigned int d)
const 1352 const double x = p(0);
1353 const double y = p(1);
1354 const double phi = std::atan2(y, -x) +
numbers::PI;
1355 const double r43 = std::pow(x * x + y * y, 2. / 3.);
1358 (std::sin(2. / 3. * phi) * p(d) +
1359 (d == 0 ? (std::cos(2. / 3. * phi) * y) :
1360 (-std::cos(2. / 3. * phi) * x))) /
1366 LSingularityGradFunction::value_list(
const std::vector<
Point<2>> &points,
1367 std::vector<double> & values,
1368 const unsigned int d)
const 1373 for (
unsigned int i = 0; i < points.size(); ++i)
1376 const double x = p(0);
1377 const double y = p(1);
1378 const double phi = std::atan2(y, -x) +
numbers::PI;
1379 const double r43 = std::pow(x * x + y * y, 2. / 3.);
1381 values[i] = 2. / 3. *
1382 (std::sin(2. / 3. * phi) * p(d) +
1383 (d == 0 ? (std::cos(2. / 3. * phi) * y) :
1384 (-std::cos(2. / 3. * phi) * x))) /
1391 LSingularityGradFunction::vector_value_list(
1392 const std::vector<
Point<2>> &points,
1395 Assert(values.size() == points.size(),
1398 for (
unsigned int i = 0; i < points.size(); ++i)
1402 const double x = p(0);
1403 const double y = p(1);
1404 const double phi = std::atan2(y, -x) +
numbers::PI;
1405 const double r43 = std::pow(x * x + y * y, 2. / 3.);
1409 (std::sin(2. / 3. * phi) * x + std::cos(2. / 3. * phi) * y) / r43;
1412 (std::sin(2. / 3. * phi) * y - std::cos(2. / 3. * phi) * x) / r43;
1418 LSingularityGradFunction::laplacian(
const Point<2> &,
1419 const unsigned int)
const 1426 LSingularityGradFunction::laplacian_list(
const std::vector<
Point<2>> &points,
1427 std::vector<double> & values,
1428 const unsigned int)
const 1430 Assert(values.size() == points.size(),
1433 for (
unsigned int i = 0; i < points.size(); ++i)
1440 LSingularityGradFunction::gradient(
const Point<2> & ,
1441 const unsigned int )
const 1449 LSingularityGradFunction::gradient_list(
1452 const unsigned int )
const 1459 LSingularityGradFunction::vector_gradient_list(
1471 const unsigned int)
const 1477 double r2 = x * x + y * y;
1479 return std::pow(r2, .25) * std::sin(.5 * phi);
1487 std::vector<double> & values,
1488 const unsigned int)
const 1490 Assert(values.size() == points.size(),
1493 for (
unsigned int i = 0; i < points.size(); ++i)
1495 double x = points[i](0);
1496 double y = points[i](1);
1499 double r2 = x * x + y * y;
1501 values[i] = std::pow(r2, .25) * std::sin(.5 * phi);
1512 Assert(values.size() == points.size(),
1515 for (
unsigned int i = 0; i < points.size(); ++i)
1517 Assert(values[i].size() == 1,
1520 double x = points[i](0);
1521 double y = points[i](1);
1524 double r2 = x * x + y * y;
1526 values[i](0) = std::pow(r2, .25) * std::sin(.5 * phi);
1534 const unsigned int)
const 1544 std::vector<double> & values,
1545 const unsigned int)
const 1547 Assert(values.size() == points.size(),
1550 for (
unsigned int i = 0; i < points.size(); ++i)
1558 const unsigned int)
const 1563 double r64 = std::pow(x * x + y * y, 3. / 4.);
1566 result[0] = 1. / 2. *
1567 (std::sin(1. / 2. * phi) * x + std::cos(1. / 2. * phi) * y) /
1569 result[1] = 1. / 2. *
1570 (std::sin(1. / 2. * phi) * y - std::cos(1. / 2. * phi) * x) /
1581 const unsigned int)
const 1583 Assert(gradients.size() == points.size(),
1586 for (
unsigned int i = 0; i < points.size(); ++i)
1592 double r64 = std::pow(x * x + y * y, 3. / 4.);
1596 (std::sin(1. / 2. * phi) * x + std::cos(1. / 2. * phi) * y) / r64;
1599 (std::sin(1. / 2. * phi) * y - std::cos(1. / 2. * phi) * x) / r64;
1600 for (
unsigned int d = 2; d < dim; ++d)
1601 gradients[i][d] = 0.;
1611 Assert(gradients.size() == points.size(),
1614 for (
unsigned int i = 0; i < points.size(); ++i)
1616 Assert(gradients[i].size() == 1,
1623 double r64 = std::pow(x * x + y * y, 3. / 4.);
1625 gradients[i][0][0] =
1627 (std::sin(1. / 2. * phi) * x + std::cos(1. / 2. * phi) * y) / r64;
1628 gradients[i][0][1] =
1630 (std::sin(1. / 2. * phi) * y - std::cos(1. / 2. * phi) * x) / r64;
1631 for (
unsigned int d = 2; d < dim; ++d)
1632 gradients[i][0][d] = 0.;
1640 SlitHyperSingularityFunction::value(
const Point<2> &p,
1641 const unsigned int)
const 1647 double r2 = x * x + y * y;
1649 return std::pow(r2, .125) * std::sin(.25 * phi);
1654 SlitHyperSingularityFunction::value_list(
const std::vector<
Point<2>> &points,
1655 std::vector<double> & values,
1656 const unsigned int)
const 1658 Assert(values.size() == points.size(),
1661 for (
unsigned int i = 0; i < points.size(); ++i)
1663 double x = points[i](0);
1664 double y = points[i](1);
1667 double r2 = x * x + y * y;
1669 values[i] = std::pow(r2, .125) * std::sin(.25 * phi);
1675 SlitHyperSingularityFunction::vector_value_list(
1676 const std::vector<
Point<2>> &points,
1679 Assert(values.size() == points.size(),
1682 for (
unsigned int i = 0; i < points.size(); ++i)
1684 Assert(values[i].size() == 1,
1687 double x = points[i](0);
1688 double y = points[i](1);
1691 double r2 = x * x + y * y;
1693 values[i](0) = std::pow(r2, .125) * std::sin(.25 * phi);
1699 SlitHyperSingularityFunction::laplacian(
const Point<2> &,
1700 const unsigned int)
const 1707 SlitHyperSingularityFunction::laplacian_list(
1708 const std::vector<
Point<2>> &points,
1709 std::vector<double> & values,
1710 const unsigned int)
const 1712 Assert(values.size() == points.size(),
1715 for (
unsigned int i = 0; i < points.size(); ++i)
1721 SlitHyperSingularityFunction::gradient(
const Point<2> &p,
1722 const unsigned int)
const 1727 double r78 = std::pow(x * x + y * y, 7. / 8.);
1731 result[0] = 1. / 4. *
1732 (std::sin(1. / 4. * phi) * x + std::cos(1. / 4. * phi) * y) /
1734 result[1] = 1. / 4. *
1735 (std::sin(1. / 4. * phi) * y - std::cos(1. / 4. * phi) * x) /
1742 SlitHyperSingularityFunction::gradient_list(
1743 const std::vector<
Point<2>> &points,
1745 const unsigned int)
const 1747 Assert(gradients.size() == points.size(),
1750 for (
unsigned int i = 0; i < points.size(); ++i)
1756 double r78 = std::pow(x * x + y * y, 7. / 8.);
1760 (std::sin(1. / 4. * phi) * x + std::cos(1. / 4. * phi) * y) / r78;
1763 (std::sin(1. / 4. * phi) * y - std::cos(1. / 4. * phi) * x) / r78;
1769 SlitHyperSingularityFunction::vector_gradient_list(
1770 const std::vector<
Point<2>> & points,
1771 std::vector<std::vector<
Tensor<1, 2>>> &gradients)
const 1773 Assert(gradients.size() == points.size(),
1776 for (
unsigned int i = 0; i < points.size(); ++i)
1778 Assert(gradients[i].size() == 1,
1785 double r78 = std::pow(x * x + y * y, 7. / 8.);
1787 gradients[i][0][0] =
1789 (std::sin(1. / 4. * phi) * x + std::cos(1. / 4. * phi) * y) / r78;
1790 gradients[i][0][1] =
1792 (std::sin(1. / 4. * phi) * y - std::cos(1. / 4. * phi) * x) / r78;
1800 const double steepness)
1801 : direction(direction)
1802 , steepness(steepness)
1826 return -std::atan(x);
1834 std::vector<double> & values,
1835 const unsigned int)
const 1837 Assert(values.size() == p.size(),
1840 for (
unsigned int i = 0; i < p.size(); ++i)
1843 values[i] = -std::atan(x);
1853 double r = 1 + x * x;
1861 std::vector<double> & values,
1862 const unsigned int)
const 1864 Assert(values.size() == p.size(),
1869 for (
unsigned int i = 0; i < p.size(); ++i)
1871 double x = steepness * (-
cosine * p[i](0) +
sine * p[i](1));
1872 double r = 1 + x * x;
1873 values[i] = f * x / (r * r);
1897 const unsigned int)
const 1899 Assert(gradients.size() == p.size(),
1902 for (
unsigned int i = 0; i < p.size(); ++i)
1906 gradients[i][0] =
cosine * r;
1907 gradients[i][1] =
sine * r;
1919 return sizeof(*this);
1931 , fourier_coefficients(fourier_coefficients)
1939 const unsigned int component)
const 1951 const unsigned int component)
const 1963 const unsigned int component)
const 1968 (-std::cos(fourier_coefficients * p));
1981 , fourier_coefficients(fourier_coefficients)
1989 const unsigned int component)
const 2001 const unsigned int component)
const 2013 const unsigned int component)
const 2018 (-std::sin(fourier_coefficients * p));
2030 const std::vector<double> & weights)
2045 const unsigned int component)
const 2050 const unsigned int n = weights.size();
2052 for (
unsigned int s = 0; s < n; ++s)
2063 const unsigned int component)
const 2068 const unsigned int n = weights.size();
2070 for (
unsigned int s = 0; s < n; ++s)
2081 const unsigned int component)
const 2086 const unsigned int n = weights.size();
2088 for (
unsigned int s = 0; s < n; ++s)
2104 const std::vector<double> & weights)
2119 const unsigned int component)
const 2124 const unsigned int n = weights.size();
2126 for (
unsigned int s = 0; s < n; ++s)
2137 const unsigned int component)
const 2142 const unsigned int n = weights.size();
2144 for (
unsigned int s = 0; s < n; ++s)
2155 const unsigned int component)
const 2160 const unsigned int n = weights.size();
2162 for (
unsigned int s = 0; s < n; ++s)
2179 , exponents(exponents)
2193 for (
unsigned int s = 0; s < dim; ++s)
2197 ExcMessage(
"Exponentiation of a negative base number with " 2198 "a real exponent can't be performed."));
2213 for (
unsigned int i = 0; i < values.
size(); ++i)
2222 const unsigned int component)
const 2228 for (
unsigned int d = 0; d < dim; ++d)
2231 for (
unsigned int s = 0; s < dim; ++s)
2233 if ((s == d) && (
exponents[s] == 0) && (p[s] == 0))
2243 "Exponentiation of a negative base number with " 2244 "a real exponent can't be performed."));
2261 std::vector<double> & values,
2262 const unsigned int component)
const 2264 Assert(values.size() == points.size(),
2267 for (
unsigned int i = 0; i < points.size(); ++i)
2274 const double wave_number,
2277 , wave_number(wave_number)
2288 const double r = p.
distance(center);
2289 return std_cxx17::cyl_bessel_j(order, r * wave_number);
2296 std::vector<double> & values,
2297 const unsigned int)
const 2301 for (
unsigned int k = 0; k < points.size(); ++k)
2303 const double r = points[k].distance(center);
2304 values[k] = std_cxx17::cyl_bessel_j(order, r * wave_number);
2314 const double r = p.
distance(center);
2315 const double co = (r == 0.) ? 0. : (p(0) - center(0)) / r;
2316 const double si = (r == 0.) ? 0. : (p(1) - center(1)) / r;
2320 (-std_cxx17::cyl_bessel_j(1, r * wave_number)) :
2321 (.5 * (std_cxx17::cyl_bessel_j(order - 1, wave_number * r) -
2322 std_cxx17::cyl_bessel_j(order + 1, wave_number * r)));
2324 result[0] = wave_number * co * dJn;
2325 result[1] = wave_number * si * dJn;
2335 const unsigned int)
const 2339 for (
unsigned int k = 0; k < points.size(); ++k)
2342 const double r = p.
distance(center);
2343 const double co = (r == 0.) ? 0. : (p(0) - center(0)) / r;
2344 const double si = (r == 0.) ? 0. : (p(1) - center(1)) / r;
2348 (-std_cxx17::cyl_bessel_j(1, r * wave_number)) :
2349 (.5 * (std_cxx17::cyl_bessel_j(order - 1, wave_number * r) -
2350 std_cxx17::cyl_bessel_j(order + 1, wave_number * r)));
2352 result[0] = wave_number * co * dJn;
2353 result[1] = wave_number * si * dJn;
2369 return ((1 - xi[0]) * data_values[ix[0]] +
2370 xi[0] * data_values[ix[0] + 1]);
2378 return (((1 - p_unit[0]) * data_values[ix[0]][ix[1]] +
2379 p_unit[0] * data_values[ix[0] + 1][ix[1]]) *
2381 ((1 - p_unit[0]) * data_values[ix[0]][ix[1] + 1] +
2382 p_unit[0] * data_values[ix[0] + 1][ix[1] + 1]) *
2391 return ((((1 - p_unit[0]) * data_values[ix[0]][ix[1]][ix[2]] +
2392 p_unit[0] * data_values[ix[0] + 1][ix[1]][ix[2]]) *
2394 ((1 - p_unit[0]) * data_values[ix[0]][ix[1] + 1][ix[2]] +
2395 p_unit[0] * data_values[ix[0] + 1][ix[1] + 1][ix[2]]) *
2398 (((1 - p_unit[0]) * data_values[ix[0]][ix[1]][ix[2] + 1] +
2399 p_unit[0] * data_values[ix[0] + 1][ix[1]][ix[2] + 1]) *
2401 ((1 - p_unit[0]) * data_values[ix[0]][ix[1] + 1][ix[2] + 1] +
2402 p_unit[0] * data_values[ix[0] + 1][ix[1] + 1][ix[2] + 1]) *
2420 grad[0] = (data_values[ix[0] + 1] - data_values[ix[0]]) / dx[0];
2432 double u00 = data_values[ix[0]][ix[1]],
2433 u01 = data_values[ix[0] + 1][ix[1]],
2434 u10 = data_values[ix[0]][ix[1] + 1],
2435 u11 = data_values[ix[0] + 1][ix[1] + 1];
2438 ((1 - p_unit[1]) * (u01 - u00) + p_unit[1] * (u11 - u10)) / dx[0];
2440 ((1 - p_unit[0]) * (u10 - u00) + p_unit[0] * (u11 - u01)) / dx[1];
2452 double u000 = data_values[ix[0]][ix[1]][ix[2]],
2453 u001 = data_values[ix[0] + 1][ix[1]][ix[2]],
2454 u010 = data_values[ix[0]][ix[1] + 1][ix[2]],
2455 u100 = data_values[ix[0]][ix[1]][ix[2] + 1],
2456 u011 = data_values[ix[0] + 1][ix[1] + 1][ix[2]],
2457 u101 = data_values[ix[0] + 1][ix[1]][ix[2] + 1],
2458 u110 = data_values[ix[0]][ix[1] + 1][ix[2] + 1],
2459 u111 = data_values[ix[0] + 1][ix[1] + 1][ix[2] + 1];
2463 ((1 - p_unit[1]) * (u001 - u000) + p_unit[1] * (u011 - u010)) +
2465 ((1 - p_unit[1]) * (u101 - u100) + p_unit[1] * (u111 - u110))) /
2469 ((1 - p_unit[0]) * (u010 - u000) + p_unit[0] * (u011 - u001)) +
2471 ((1 - p_unit[0]) * (u110 - u100) + p_unit[0] * (u111 - u101))) /
2475 ((1 - p_unit[0]) * (u100 - u000) + p_unit[0] * (u101 - u001)) +
2477 ((1 - p_unit[0]) * (u110 - u010) + p_unit[0] * (u111 - u011))) /
2486 const std::array<std::vector<double>, dim> &coordinate_values,
2488 : coordinate_values(coordinate_values)
2489 , data_values(data_values)
2491 for (
unsigned int d = 0; d < dim; ++d)
2496 "Coordinate arrays must have at least two coordinate values!"));
2501 "Coordinate arrays must be sorted in strictly ascending order."));
2505 "Data and coordinate tables do not have the same size."));
2521 for (
unsigned int d = 0; d < dim; ++d)
2552 const unsigned int component)
const 2558 "This is a scalar function object, the component can only be zero."));
2567 for (
unsigned int d = 0; d < dim; ++d)
2583 const unsigned int component)
const 2589 "This is a scalar function object, the component can only be zero."));
2595 for (
unsigned int d = 0; d < dim; ++d)
2599 for (
unsigned int d = 0; d < dim; ++d)
2604 return gradient_interpolate(
data_values, ix, p_unit, dx);
2611 const std::array<std::pair<double, double>, dim> &interval_endpoints,
2612 const std::array<unsigned int, dim> & n_subintervals,
2614 : interval_endpoints(interval_endpoints)
2615 , n_subintervals(n_subintervals)
2616 , data_values(data_values)
2618 for (
unsigned int d = 0; d < dim; ++d)
2620 Assert(n_subintervals[d] >= 1,
2621 ExcMessage(
"There needs to be at least one subinterval in each " 2622 "coordinate direction."));
2624 ExcMessage(
"The interval in each coordinate direction needs " 2625 "to have positive size"));
2626 Assert(data_values.
size()[d] == n_subintervals[d] + 1,
2627 ExcMessage(
"The data table does not have the correct size."));
2635 const unsigned int component)
const 2641 "This is a scalar function object, the component can only be zero."));
2646 for (
unsigned int d = 0; d < dim; ++d)
2648 const double delta_x =
2664 for (
unsigned int d = 0; d < dim; ++d)
2666 const double delta_x =
2685 const std::vector<double> &coefficients)
2687 , exponents(exponents)
2688 , coefficients(coefficients)
2690 Assert(exponents.n_rows() == coefficients.size(),
2692 Assert(exponents.n_cols() == dim,
2701 const unsigned int component)
const 2707 for (
unsigned int monom = 0; monom <
exponents.n_rows(); ++monom)
2710 for (
unsigned int s = 0; s < dim; ++s)
2714 ExcMessage(
"Exponentiation of a negative base number with " 2715 "a real exponent can't be performed."));
2716 prod *= std::pow(p[s],
exponents[monom][s]);
2728 std::vector<double> & values,
2729 const unsigned int component)
const 2731 Assert(values.size() == points.size(),
2734 for (
unsigned int i = 0; i < points.size(); ++i)
2743 const unsigned int component)
const 2750 for (
unsigned int d = 0; d < dim; ++d)
2754 for (
unsigned int monom = 0; monom <
exponents.n_rows(); ++monom)
2757 for (
unsigned int s = 0; s < dim; ++s)
2759 if ((s == d) && (
exponents[monom][s] == 0) && (p[s] == 0))
2770 "Exponentiation of a negative base number with " 2771 "a real exponent can't be performed."));
2774 std::pow(p[s],
exponents[monom][s] - 1) :
2839 DEAL_II_NAMESPACE_CLOSE
const Tensor< 1, dim > exponents
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component) const override
virtual SymmetricTensor< 2, dim > hessian(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
#define AssertDimension(dim1, dim2)
const unsigned int n_components
virtual void hessian_list(const std::vector< Point< dim >> &points, std::vector< SymmetricTensor< 2, dim >> &hessians, const unsigned int component=0) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component) const override
LSingularityGradFunction()
Monomial(const Tensor< 1, dim > &exponents, const unsigned int n_components=1)
Polynomial(const Table< 2, double > &exponents, const std::vector< double > &coefficients)
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
#define AssertIndexRange(index, range)
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
#define AssertVectorVectorDimension(vec, dim1, dim2)
virtual void vector_value(const Point< dim > &p, Vector< double > &values) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
numbers::NumberTraits< Number >::real_type distance(const Point< dim, Number > &p) const
FourierCosineSum(const std::vector< Point< dim >> &fourier_coefficients, const std::vector< double > &weights)
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
std::size_t memory_consumption() const
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
CosineFunction(const unsigned int n_components=1)
const Table< dim, double > data_values
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &points, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcMessage(std::string arg1)
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
const Tensor< 1, dim > fourier_coefficients
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
size_type size(const unsigned int i) const
virtual void vector_value(const Point< dim > &p, Vector< double > &values) const override
#define Assert(cond, exc)
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
Bessel1(const unsigned int order, const double wave_number, const Point< dim > center=Point< dim >())
virtual void vector_value(const Point< dim > &p, Vector< double > &values) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
const std::vector< Point< dim > > fourier_coefficients
TableIndices< dim > table_index_of_point(const Point< dim > &p) const
virtual void gradient_list(const std::vector< Point< dim >> &points, std::vector< Tensor< 1, dim >> &gradients, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
const Table< 2, double > exponents
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
const std::vector< double > coefficients
numbers::NumberTraits< Number >::real_type square() const
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const override
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const override
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const override
const Point< dim > direction
const std::vector< Point< dim > > fourier_coefficients
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
PillowFunction(const double offset=0.)
const std::array< std::vector< double >, dim > coordinate_values
InterpolatedTensorProductGridData(const std::array< std::vector< double >, dim > &coordinate_values, const Table< dim, double > &data_values)
FourierCosineFunction(const Tensor< 1, dim > &fourier_coefficients)
virtual void gradient_list(const std::vector< Point< dim >> &points, std::vector< Tensor< 1, dim >> &gradients, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcNotImplemented()
FourierSineSum(const std::vector< Point< dim >> &fourier_coefficients, const std::vector< double > &weights)
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
FourierSineFunction(const Tensor< 1, dim > &fourier_coefficients)
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
const Tensor< 1, dim > fourier_coefficients
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
virtual void gradient_list(const std::vector< Point< dim >> &points, std::vector< Tensor< 1, dim >> &gradients, const unsigned int component=0) const override
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcZero()
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component) const override
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double value(const Point< dim > &p, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual double laplacian(const Point< dim > &p, const unsigned int component=0) const override
virtual void laplacian_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
virtual Tensor< 1, dim > gradient(const Point< dim > &p, const unsigned int component=0) const override
static::ExceptionBase & ExcInternalError()
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const override
JumpFunction(const Point< dim > &direction, const double steepness)