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