5#include <dirac_convergence_test.h>
7using lf::uscalfe::operator-;
8using complex = std::complex<double>;
13int main(
int argc,
char *argv[]) {
15 std::cerr <<
"Usage: " << argv[0] <<
" max_refinement_level k" << std::endl;
21 unsigned refinement_level = atoi(argv[1]);
22 std::sscanf(argv[2],
"%lf", &k);
23 std::cout <<
"max_refinement_level : " << refinement_level << std::endl;
24 std::cout <<
"k : " << k << std::endl;
27 auto Power = [](complex a, complex b) -> complex {
return std::pow(a, b); };
28 auto Complex = [](
double a,
double b) -> complex {
return complex(a, b); };
29 auto Sin = [](complex a) -> complex {
return std::sin(a); };
30 auto Cos = [](complex a) -> complex {
return std::cos(a); };
31 auto Sqrt = [](complex a) -> complex {
return std::sqrt(a); };
34 auto f_zero = [&](
const Eigen::Vector3d &x_vec) -> complex {
36 Eigen::Vector3d x_ = x_vec / x_vec.norm();
42 complex ret = Complex(0, 1) * k * (Cos(y) + Sin(x) + Sin(z)) +
43 (x * z * Cos(x) + x * y * Cos(y) + y * z * Cos(z) +
44 2 * z * Sin(x) + 2 * x * Sin(y) + 2 * y * Sin(z)) /
45 (Power(x, 2) + Power(y, 2) + Power(z, 2));
50 auto f_one = [&](
const Eigen::Vector3d &x_vec) -> Eigen::VectorXcd {
52 Eigen::Vector3d x_ = x_vec / x_vec.norm();
58 Eigen::VectorXcd ret(3);
59 ret << ((Power(y, 2) + Power(z, 2)) * Cos(x) - x * z * Cos(z) +
61 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
62 (y * Cos(z) + z * Sin(y)) -
64 (x * z * Sin(x) - (Power(y, 2) + Power(z, 2)) * Sin(y) +
66 (Power(x, 2) + Power(y, 2) + Power(z, 2)),
67 -((x * y * Cos(x) + y * z * Cos(z) +
68 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
69 (-(z * Cos(x)) + x * Cos(z)) +
70 (Power(x, 2) + Power(z, 2)) * Sin(y) +
72 (y * z * Sin(x) + x * y * Sin(y) -
73 (Power(x, 2) + Power(z, 2)) * Sin(z))) /
74 (Power(x, 2) + Power(y, 2) + Power(z, 2))),
75 (-(x * z * Cos(x)) + (Power(x, 2) + Power(y, 2)) * Cos(z) +
77 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
78 (y * Cos(x) + x * Sin(y)) +
80 ((Power(x, 2) + Power(y, 2)) * Sin(x) -
81 z * (x * Sin(y) + y * Sin(z)))) /
82 (Power(x, 2) + Power(y, 2) + Power(z, 2));
87 auto f_two = [&](
const Eigen::Vector3d &x_vec) -> complex {
89 Eigen::Vector3d x_ = x_vec / x_vec.norm();
95 complex ret = (y * Cos(x) + z * Cos(y) + x * Cos(z)) /
96 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) +
97 Complex(0, 1) * k * (Cos(y) + Sin(x) + Sin(z));
104 test.Compute(refinement_level);
Class to test the convergence of the Dirac operator.