LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
dirac_operator_constant.cc
1
7#include <dirac_operator_experiment.h>
8
9using lf::uscalfe::operator-;
10using complex = std::complex<double>;
11
16int main(int argc, char *argv[]) {
17 if (argc != 4 && argc != 5) {
18 std::cerr << "Usage: " << argv[0]
19 << " max_refinement_level min_k max_k step=0.1 " << std::endl;
20 exit(1);
21 }
22
23 double min_k;
24 double max_k;
25 double step = 0.1;
26 const unsigned refinement_level = atoi(argv[1]);
27 sscanf(argv[2], "%lf", &min_k);
28 sscanf(argv[3], "%lf", &max_k);
29 if (argc == 5) sscanf(argv[4], "%lf", &step);
30 std::cout << "max_refinement_level : " << refinement_level << std::endl;
31 std::cout << "min_k : " << min_k << ", max_k = " << max_k
32 << " step = " << step << std::endl;
33
34 // needs to be a reference such that it can be reassigned
35 double &k = min_k;
36
37 std::vector<unsigned> refinement_levels(refinement_level + 1);
38 for (int i = 0; i < refinement_level + 1; i++) {
39 refinement_levels[i] = i;
40 }
41
42 std::vector<double> ks;
43 for (double i = min_k; i <= max_k; i += step) {
44 ks.push_back(i);
45 }
46
47 // righthandside for the zero
48 auto f_zero = [&](const Eigen::Vector3d &x_vec) -> complex {
49 return complex(0, k * 5.2);
50 };
51
52 // righthandside for the one form
53 auto f_one = [&](const Eigen::Vector3d &x_vec) -> Eigen::VectorXcd {
54 Eigen::Vector3d x_ = x_vec / x_vec.norm();
55 double x = x_(0);
56 double y = x_(1);
57 double z = x_(2);
58 Eigen::Vector3cd ret;
59 ret << complex(0, -k * y), complex(0, k * x), 0;
60 return ret;
61 };
62
63 auto Power = [](double a, double b) -> double { return pow(a, b); };
64 auto Sqrt = [](double a) -> double { return sqrt(a); };
65 auto Complex = [](double a, double b) -> complex { return complex(a, b); };
66
67 // righthandside for the two form
68 auto f_two = [&](const Eigen::Vector3d &x_vec) -> complex {
69 Eigen::Vector3d x_ = x_vec / x_vec.norm();
70 double x = x_(0);
71 double y = x_(1);
72 double z = x_(2);
73 return Complex(0., 5.2) * k -
74 (2 * z) / Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2));
75 };
76
77 // Compute the analytic solution of the problem
78 auto u_zero = [&](const Eigen::Vector3d x_vec) -> complex { return 5.2; };
79 auto u_two = [&](const Eigen::Vector3d x_vec) -> complex { return 5.2; };
80
81 // Compute the analytic solution of the problem
82 auto u_one = [&](const Eigen::Vector3d x_vec) -> Eigen::Vector3cd {
83 Eigen::Vector3d x_ = x_vec / x_vec.norm();
84 double x = x_(0);
85 double y = x_(1);
86 double z = x_(2);
87 Eigen::Vector3cd ret;
88 ret << -y, x, 0;
89 return ret;
90 };
91
93 u_zero, u_one, u_two, f_zero, f_one, f_two, k, "constant");
94
95 experiment.Compute(refinement_levels, ks);
96
97 return 0;
98}
Creates and solves the discretised Dirac Operator source problems for a given list of levels and valu...