Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/geomfuncs.cpp
3206 views
1
#include <mystdlib.h>
2
3
#include <myadt.hpp>
4
#include <gprim.hpp>
5
6
namespace netgen
7
{
8
9
/*
10
// template <>
11
inline void CalcInverse (const Mat<2,2> & m, Mat<2,2> & inv)
12
{
13
double det = m(0,0) * m(1,1) - m(0,1) * m(1,0);
14
if (det == 0)
15
{
16
inv = 0;
17
return;
18
}
19
20
double idet = 1.0 / det;
21
inv(0,0) = idet * m(1,1);
22
inv(0,1) = -idet * m(0,1);
23
inv(1,0) = -idet * m(1,0);
24
inv(1,1) = idet * m(0,0);
25
}
26
*/
27
28
29
30
// template <>
31
void CalcInverse (const Mat<3,3> & m, Mat<3,3> & inv)
32
{
33
double det = Det (m);
34
if (det == 0)
35
{
36
inv = 0;
37
return;
38
}
39
40
double idet = 1.0 / det;
41
inv(0,0) = idet * (m(1,1) * m(2,2) - m(1,2) * m(2,1));
42
inv(1,0) = -idet * (m(1,0) * m(2,2) - m(1,2) * m(2,0));
43
inv(2,0) = idet * (m(1,0) * m(2,1) - m(1,1) * m(2,0));
44
45
inv(0,1) = -idet * (m(0,1) * m(2,2) - m(0,2) * m(2,1));
46
inv(1,1) = idet * (m(0,0) * m(2,2) - m(0,2) * m(2,0));
47
inv(2,1) = -idet * (m(0,0) * m(2,1) - m(0,1) * m(2,0));
48
49
inv(0,2) = idet * (m(0,1) * m(1,2) - m(0,2) * m(1,1));
50
inv(1,2) = -idet * (m(0,0) * m(1,2) - m(0,2) * m(1,0));
51
inv(2,2) = idet * (m(0,0) * m(1,1) - m(0,1) * m(1,0));
52
}
53
54
/*
55
// template <>
56
void CalcInverse (const Mat<2,3> & m, Mat<3,2> & inv)
57
{
58
Mat<2,2> a = m * Trans (m);
59
Mat<2,2> ainv;
60
CalcInverse (a, ainv);
61
inv = Trans (m) * ainv;
62
}
63
*/
64
65
66
67
double Det (const Mat<2,2> & m)
68
{
69
return m(0,0) * m(1,1) - m(0,1) * m(1,0);
70
}
71
72
double Det (const Mat<3,3> & m)
73
{
74
return
75
m(0,0) * m(1,1) * m(2,2)
76
+ m(1,0) * m(2,1) * m(0,2)
77
+ m(2,0) * m(0,1) * m(1,2)
78
- m(0,0) * m(2,1) * m(1,2)
79
- m(1,0) * m(0,1) * m(2,2)
80
- m(2,0) * m(1,1) * m(0,2);
81
}
82
83
84
void EigenValues (const Mat<3,3> & m, Vec<3> & ev)
85
{
86
const double pi = 3.141592;
87
double a, b, c, d;
88
double p, q;
89
double arg;
90
91
a = -1.;
92
b = m(0,0) + m(1,1) + m(2,2);
93
c = -( m(0,0)*m(2,2) + m(1,1)*m(2,2) + m(0,0)*m(1,1) - sqr(m(0,1)) - sqr(m(0,2)) - sqr(m(1,2)) );
94
d = Det (m);
95
p = 3.*a*c - sqr(b);
96
q = 27.*sqr(a)*d - 9.*a*b*c + 2.*sqr(b)*b;
97
98
99
arg = acos((-q/2)/sqrt(-(p*p*p)));
100
101
102
ev(0) = (2. * sqrt(-p) * cos(arg/3.) - b) / 3.*a;
103
ev(1) = (-2. * sqrt(-p) * cos(arg/3.+pi/3) - b) / 3.*a;
104
ev(2) = (-2. * sqrt(-p) * cos(arg/3.-pi/3)- b) / 3.*a;
105
106
107
108
}
109
110
111
}
112
113