7#include <dirac_operator_experiment.h>
9using lf::uscalfe::operator-;
10using complex = std::complex<double>;
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;
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;
37 std::vector<unsigned> refinement_levels(refinement_level + 1);
38 for (
int i = 0; i < refinement_level + 1; i++) {
39 refinement_levels[i] = i;
42 std::vector<double> ks;
43 for (
double i = min_k; i <= max_k; i += step) {
48 auto Power = [](complex a, complex b) -> complex {
return std::pow(a, b); };
49 auto Complex = [](
double a,
double b) -> complex {
return complex(a, b); };
50 auto Sin = [](complex a) -> complex {
return std::sin(a); };
51 auto Cos = [](complex a) -> complex {
return std::cos(a); };
52 auto Sqrt = [](complex a) -> complex {
return std::sqrt(a); };
55 auto f_zero = [&](
const Eigen::Vector3d &x_vec) -> complex {
57 Eigen::Vector3d x_ = x_vec / x_vec.norm();
63 complex ret = Complex(0, 1) * k * (Cos(y) + Sin(x) + Sin(z)) +
64 (x * z * Cos(x) + x * y * Cos(y) + y * z * Cos(z) +
65 2 * z * Sin(x) + 2 * x * Sin(y) + 2 * y * Sin(z)) /
66 (Power(x, 2) + Power(y, 2) + Power(z, 2));
71 auto f_one = [&](
const Eigen::Vector3d &x_vec) -> Eigen::VectorXcd {
73 Eigen::Vector3d x_ = x_vec / x_vec.norm();
79 Eigen::VectorXcd ret(3);
80 ret << ((Power(y, 2) + Power(z, 2)) * Cos(x) - x * z * Cos(z) +
82 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
83 (y * Cos(z) + z * Sin(y)) -
85 (x * z * Sin(x) - (Power(y, 2) + Power(z, 2)) * Sin(y) +
87 (Power(x, 2) + Power(y, 2) + Power(z, 2)),
88 -((x * y * Cos(x) + y * z * Cos(z) +
89 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
90 (-(z * Cos(x)) + x * Cos(z)) +
91 (Power(x, 2) + Power(z, 2)) * Sin(y) +
93 (y * z * Sin(x) + x * y * Sin(y) -
94 (Power(x, 2) + Power(z, 2)) * Sin(z))) /
95 (Power(x, 2) + Power(y, 2) + Power(z, 2))),
96 (-(x * z * Cos(x)) + (Power(x, 2) + Power(y, 2)) * Cos(z) +
98 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) *
99 (y * Cos(x) + x * Sin(y)) +
101 ((Power(x, 2) + Power(y, 2)) * Sin(x) -
102 z * (x * Sin(y) + y * Sin(z)))) /
103 (Power(x, 2) + Power(y, 2) + Power(z, 2));
108 auto f_two = [&](
const Eigen::Vector3d &x_vec) -> complex {
110 Eigen::Vector3d x_ = x_vec / x_vec.norm();
116 complex ret = (y * Cos(x) + z * Cos(y) + x * Cos(z)) /
117 Sqrt(Power(x, 2) + Power(y, 2) + Power(z, 2)) +
118 Complex(0, 1) * k * (Cos(y) + Sin(x) + Sin(z));
123 auto u_zero = [&](
const Eigen::Vector3d x_vec) -> complex {
125 Eigen::Vector3d x_ = x_vec / x_vec.norm();
130 return Cos(y) + Sin(x) + Sin(z);
134 auto u_one = [&](
const Eigen::Vector3d x_vec) -> Eigen::Vector3cd {
136 Eigen::Vector3d x_ = x_vec / x_vec.norm();
141 Eigen::VectorXcd ret(3);
144 ret << (-(x * z * Sin(x)) + (Power(y, 2) + Power(z, 2)) * Sin(y) -
146 (Power(x, 2) + Power(y, 2) + Power(z, 2)),
147 (-(y * z * Sin(x)) - x * y * Sin(y) +
148 (Power(x, 2) + Power(z, 2)) * Sin(z)) /
149 (Power(x, 2) + Power(y, 2) + Power(z, 2)),
150 ((Power(x, 2) + Power(y, 2)) * Sin(x) - z * (x * Sin(y) + y * Sin(z))) /
151 (Power(x, 2) + Power(y, 2) + Power(z, 2));
156 auto u_two = [&](
const Eigen::Vector3d x_vec) -> complex {
158 Eigen::Vector3d x_ = x_vec / x_vec.norm();
163 return Cos(y) + Sin(x) + Sin(z);
167 u_zero, u_one, u_two, f_zero, f_one, f_two, k,
"test");
169 experiment.Compute(refinement_levels, ks);
Creates and solves the discretised Dirac Operator source problems for a given list of levels and valu...