PolyFEM
Loading...
Searching...
No Matches
auto_eigs.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Dense>
4
5namespace polyfem {
6namespace autogen {
7template<typename T>
8T int_pow(T val, int exp) { T res = exp <=0 ? T(0.): val; for(int i = 1; i < exp; ++i) res = res*val; return res; }
9
10template<typename T>
11void eigs_2d(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> &m, Eigen::Matrix<T, Eigen::Dynamic, 1, 0, 3, 1> &res) {
12res.resize(2);
13const auto helper_0 = m(0,0) + m(1,1);
14const auto helper_1 = (1.0/2.0)*helper_0;
15const auto helper_2 = 4*pow(m(0,1), 2) + pow(m(0,0) - m(1,1), 2);
16const auto helper_3 = helper_2 < 1.0e-10;
17const auto helper_4 = sqrt(helper_2);
18if (helper_3) {
19 res(0) = helper_1;
20}
21else {
22 res(0) = 0.5*helper_0 - 0.5*helper_4;
23}
24if (helper_3) {
25 res(1) = helper_1;
26}
27else {
28 res(1) = 0.5*helper_0 + 0.5*helper_4;
29}
30}
31
32template<typename T>
33void eigs_3d(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> &m, Eigen::Matrix<T, Eigen::Dynamic, 1, 0, 3, 1> &res) {
34res.resize(3);
35const auto helper_0 = m(0,0) + m(1,1);
36const auto helper_1 = helper_0 + m(2,2);
37const auto helper_2 = 0.33333333333333331*helper_1;
38const auto helper_3 = pow(m(0,1), 2);
39const auto helper_4 = pow(m(0,2), 2);
40const auto helper_5 = pow(m(1,2), 2);
41const auto helper_6 = -m(2,2);
42const auto helper_7 = 3.0*helper_3 + 3.0*helper_4 + 3.0*helper_5 + 0.5*pow(helper_6 + m(0,0), 2) + 0.5*pow(helper_6 + m(1,1), 2) + 0.5*pow(m(0,0) - m(1,1), 2);
43const auto helper_8 = sqrt(helper_7);
44const auto helper_9 = 2.0*helper_8 < 1.0e-10;
45const auto helper_10 = (-1.5*helper_0*(m(0,0) + m(2,2))*(m(1,1) + m(2,2)) + 4.5*helper_1*(helper_3 + helper_4 + helper_5) - 13.5*helper_3*m(2,2) - 13.5*helper_4*m(1,1) - 13.5*helper_5*m(0,0) + 1.0*pow(m(0,0), 3) + 9.0*m(0,0)*m(1,1)*m(2,2) + 27.0*m(0,1)*m(0,2)*m(1,2) + 1.0*pow(m(1,1), 3) + 1.0*pow(m(2,2), 3))/pow(helper_7, 3.0/2.0);
46const auto helper_11 = 0.33333333333333331*((helper_10 >= 1.0) ? (
47 T(0)
48)
49: ((helper_10 <= -1.0) ? (
50 T(M_PI)
51)
52: (
53 acos(helper_10)
54)));
55const auto helper_12 = 0.66666666666666663*helper_8;
56const auto helper_13 = 0.33333333333333331*m(0,0) + 0.33333333333333331*m(1,1) + 0.33333333333333331*m(2,2);
57const auto helper_14 = 0.66666666666666663*M_PI;
58if (helper_9) {
59 res(0) = helper_2;
60}
61else {
62 res(0) = helper_12*cos(helper_11) + helper_13;
63}
64if (helper_9) {
65 res(1) = helper_2;
66}
67else {
68 res(1) = helper_12*cos(helper_11 + helper_14) + helper_13;
69}
70if (helper_9) {
71 res(2) = helper_2;
72}
73else {
74 res(2) = helper_12*cos(helper_11 - helper_14) + helper_13;
75}
76}
77
78
79
80}}
double val
Definition Assembler.cpp:86
void eigs_3d(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &m, Eigen::Matrix< T, Eigen::Dynamic, 1, 0, 3, 1 > &res)
Definition auto_eigs.hpp:33
T int_pow(T val, int exp)
Definition auto_eigs.hpp:8
void eigs_2d(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &m, Eigen::Matrix< T, Eigen::Dynamic, 1, 0, 3, 1 > &res)
Definition auto_eigs.hpp:11