LehrFEM++ 1.0.0
A simple Finite Element Library for teaching
dirac_operator_zero.cc
1
6#include <dirac_operator_experiment.h>
7
8using lf::uscalfe::operator-;
9
14int main(int argc, char *argv[]) {
15 if (argc != 4 && argc != 5) {
16 std::cerr << "Usage: " << argv[0]
17 << " max_refinement_level min_k max_k step=0.1 " << std::endl;
18 exit(1);
19 }
20
21 double min_k;
22 double max_k;
23 double step = 0.1;
24 const unsigned refinement_level = atoi(argv[1]);
25 sscanf(argv[2], "%lf", &min_k);
26 sscanf(argv[3], "%lf", &max_k);
27 if (argc == 5) sscanf(argv[4], "%lf", &step);
28 std::cout << "max_refinement_level : " << refinement_level << std::endl;
29 std::cout << "min_k : " << min_k << ", max_k = " << max_k
30 << " step = " << step << std::endl;
31
32 // needs to be a reference such that it can be reassigned
33 double &k = min_k;
34
35 std::vector<unsigned> refinement_levels(refinement_level + 1);
36 for (int i = 0; i < refinement_level + 1; i++) {
37 refinement_levels[i] = i;
38 }
39
40 std::vector<double> ks;
41 for (double i = min_k; i <= max_k; i += step) {
42 ks.push_back(i);
43 }
44
45 // righthandside for the zero and two form
46 auto f_zero = [&](const Eigen::Vector3d &x_vec) -> std::complex<double> {
47 return 0;
48 };
49
50 // righthandside for the one form
51 auto f_one = [&](const Eigen::Vector3d &x_vec) -> Eigen::VectorXcd {
52 Eigen::VectorXcd ret(3);
53 ret << 0, 0, 0;
54 return ret;
55 };
56
57 // Compute the analytic solution of the problem
58 auto u_zero = [&](const Eigen::Vector3d &x_vec) -> std::complex<double> {
59 return 0;
60 };
61
62 // Compute the analytic solution of the problem
63 auto u_one = [&](const Eigen::Vector3d &x_vec) -> Eigen::Vector3cd {
64 Eigen::VectorXcd ret(3);
65 ret.setZero();
66 return ret;
67 };
68
70 u_zero, u_one, u_zero, f_zero, f_one, f_zero, k, "zero");
71
72 experiment.Compute(refinement_levels, ks);
73
74 return 0;
75}
Creates and solves the discretised Dirac Operator source problems for a given list of levels and valu...