Home
Downloads
Documentation
Installation
User Guide
man-pages
API Documentation
README
Release Notes
Changes
License
Support
SourceForge Project
Main Page
Related Pages
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
src
OpenFOAM
primitives
transform
transform.H
Go to the documentation of this file.
1
/*---------------------------------------------------------------------------*\
2
========= |
3
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4
\\ / O peration |
5
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
6
\\/ M anipulation |
7
-------------------------------------------------------------------------------
8
License
9
This file is part of OpenFOAM.
10
11
OpenFOAM is free software: you can redistribute it and/or modify it
12
under the terms of the GNU General Public License as published by
13
the Free Software Foundation, either version 3 of the License, or
14
(at your option) any later version.
15
16
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19
for more details.
20
21
You should have received a copy of the GNU General Public License
22
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23
24
InNamespace
25
Foam
26
27
Description
28
3D tensor transformation operations.
29
30
\*---------------------------------------------------------------------------*/
31
32
#ifndef transform_H
33
#define transform_H
34
35
#include <
OpenFOAM/tensor.H
>
36
#include <
OpenFOAM/mathematicalConstants.H
>
37
38
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39
40
namespace
Foam
41
{
42
43
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
44
45
inline
tensor
rotationTensor
46
(
47
const
vector
& n1,
48
const
vector
& n2
49
)
50
{
51
return
52
(n1 & n2)*
I
53
+ (1 - (n1 & n2))*
sqr
(n1 ^ n2)/(
magSqr
(n1 ^ n2) + VSMALL)
54
+ (n2*n1 - n1*n2);
55
}
56
57
58
inline
label
transform
(
const
tensor
&,
const
label i)
59
{
60
return
i;
61
}
62
63
64
inline
scalar
transform
(
const
tensor
&,
const
scalar s)
65
{
66
return
s;
67
}
68
69
70
template
<
class
Cmpt>
71
inline
Vector<Cmpt>
transform
(
const
tensor
& tt,
const
Vector<Cmpt>
& v)
72
{
73
return
tt & v;
74
}
75
76
77
template
<
class
Cmpt>
78
inline
Tensor<Cmpt>
transform
(
const
tensor
& tt,
const
Tensor<Cmpt>
& t)
79
{
80
//return tt & t & tt.T();
81
return
Tensor<Cmpt>
82
(
83
(tt.
xx
()*t.
xx
() + tt.
xy
()*t.
yx
() + tt.
xz
()*t.
zx
())*tt.
xx
()
84
+ (tt.
xx
()*t.
xy
() + tt.
xy
()*t.
yy
() + tt.
xz
()*t.
zy
())*tt.
xy
()
85
+ (tt.
xx
()*t.
xz
() + tt.
xy
()*t.
yz
() + tt.
xz
()*t.
zz
())*tt.
xz
(),
86
87
(tt.
xx
()*t.
xx
() + tt.
xy
()*t.
yx
() + tt.
xz
()*t.
zx
())*tt.
yx
()
88
+ (tt.
xx
()*t.
xy
() + tt.
xy
()*t.
yy
() + tt.
xz
()*t.
zy
())*tt.
yy
()
89
+ (tt.
xx
()*t.
xz
() + tt.
xy
()*t.
yz
() + tt.
xz
()*t.
zz
())*tt.
yz
(),
90
91
(tt.
xx
()*t.
xx
() + tt.
xy
()*t.
yx
() + tt.
xz
()*t.
zx
())*tt.
zx
()
92
+ (tt.
xx
()*t.
xy
() + tt.
xy
()*t.
yy
() + tt.
xz
()*t.
zy
())*tt.
zy
()
93
+ (tt.
xx
()*t.
xz
() + tt.
xy
()*t.
yz
() + tt.
xz
()*t.
zz
())*tt.
zz
(),
94
95
(tt.
yx
()*t.
xx
() + tt.
yy
()*t.
yx
() + tt.
yz
()*t.
zx
())*tt.
xx
()
96
+ (tt.
yx
()*t.
xy
() + tt.
yy
()*t.
yy
() + tt.
yz
()*t.
zy
())*tt.
xy
()
97
+ (tt.
yx
()*t.
xz
() + tt.
yy
()*t.
yz
() + tt.
yz
()*t.
zz
())*tt.
xz
(),
98
99
(tt.
yx
()*t.
xx
() + tt.
yy
()*t.
yx
() + tt.
yz
()*t.
zx
())*tt.
yx
()
100
+ (tt.
yx
()*t.
xy
() + tt.
yy
()*t.
yy
() + tt.
yz
()*t.
zy
())*tt.
yy
()
101
+ (tt.
yx
()*t.
xz
() + tt.
yy
()*t.
yz
() + tt.
yz
()*t.
zz
())*tt.
yz
(),
102
103
(tt.
yx
()*t.
xx
() + tt.
yy
()*t.
yx
() + tt.
yz
()*t.
zx
())*tt.
zx
()
104
+ (tt.
yx
()*t.
xy
() + tt.
yy
()*t.
yy
() + tt.
yz
()*t.
zy
())*tt.
zy
()
105
+ (tt.
yx
()*t.
xz
() + tt.
yy
()*t.
yz
() + tt.
yz
()*t.
zz
())*tt.
zz
(),
106
107
(tt.
zx
()*t.
xx
() + tt.
zy
()*t.
yx
() + tt.
zz
()*t.
zx
())*tt.
xx
()
108
+ (tt.
zx
()*t.
xy
() + tt.
zy
()*t.
yy
() + tt.
zz
()*t.
zy
())*tt.
xy
()
109
+ (tt.
zx
()*t.
xz
() + tt.
zy
()*t.
yz
() + tt.
zz
()*t.
zz
())*tt.
xz
(),
110
111
(tt.
zx
()*t.
xx
() + tt.
zy
()*t.
yx
() + tt.
zz
()*t.
zx
())*tt.
yx
()
112
+ (tt.
zx
()*t.
xy
() + tt.
zy
()*t.
yy
() + tt.
zz
()*t.
zy
())*tt.
yy
()
113
+ (tt.
zx
()*t.
xz
() + tt.
zy
()*t.
yz
() + tt.
zz
()*t.
zz
())*tt.
yz
(),
114
115
(tt.
zx
()*t.
xx
() + tt.
zy
()*t.
yx
() + tt.
zz
()*t.
zx
())*tt.
zx
()
116
+ (tt.
zx
()*t.
xy
() + tt.
zy
()*t.
yy
() + tt.
zz
()*t.
zy
())*tt.
zy
()
117
+ (tt.
zx
()*t.
xz
() + tt.
zy
()*t.
yz
() + tt.
zz
()*t.
zz
())*tt.
zz
()
118
);
119
}
120
121
122
template
<
class
Cmpt>
123
inline
SphericalTensor<Cmpt>
transform
124
(
125
const
tensor
& tt,
126
const
SphericalTensor<Cmpt>
& st
127
)
128
{
129
return
st;
130
}
131
132
133
template
<
class
Cmpt>
134
inline
SymmTensor<Cmpt>
transform
(
const
tensor
& tt,
const
SymmTensor<Cmpt>
& st)
135
{
136
return
SymmTensor<Cmpt>
137
(
138
(tt.
xx
()*st.
xx
() + tt.
xy
()*st.
xy
() + tt.
xz
()*st.
xz
())*tt.
xx
()
139
+ (tt.
xx
()*st.
xy
() + tt.
xy
()*st.
yy
() + tt.
xz
()*st.
yz
())*tt.
xy
()
140
+ (tt.
xx
()*st.
xz
() + tt.
xy
()*st.
yz
() + tt.
xz
()*st.
zz
())*tt.
xz
(),
141
142
(tt.
xx
()*st.
xx
() + tt.
xy
()*st.
xy
() + tt.
xz
()*st.
xz
())*tt.
yx
()
143
+ (tt.
xx
()*st.
xy
() + tt.
xy
()*st.
yy
() + tt.
xz
()*st.
yz
())*tt.
yy
()
144
+ (tt.
xx
()*st.
xz
() + tt.
xy
()*st.
yz
() + tt.
xz
()*st.
zz
())*tt.
yz
(),
145
146
(tt.
xx
()*st.
xx
() + tt.
xy
()*st.
xy
() + tt.
xz
()*st.
xz
())*tt.
zx
()
147
+ (tt.
xx
()*st.
xy
() + tt.
xy
()*st.
yy
() + tt.
xz
()*st.
yz
())*tt.
zy
()
148
+ (tt.
xx
()*st.
xz
() + tt.
xy
()*st.
yz
() + tt.
xz
()*st.
zz
())*tt.
zz
(),
149
150
(tt.
yx
()*st.
xx
() + tt.
yy
()*st.
xy
() + tt.
yz
()*st.
xz
())*tt.
yx
()
151
+ (tt.
yx
()*st.
xy
() + tt.
yy
()*st.
yy
() + tt.
yz
()*st.
yz
())*tt.
yy
()
152
+ (tt.
yx
()*st.
xz
() + tt.
yy
()*st.
yz
() + tt.
yz
()*st.
zz
())*tt.
yz
(),
153
154
(tt.
yx
()*st.
xx
() + tt.
yy
()*st.
xy
() + tt.
yz
()*st.
xz
())*tt.
zx
()
155
+ (tt.
yx
()*st.
xy
() + tt.
yy
()*st.
yy
() + tt.
yz
()*st.
yz
())*tt.
zy
()
156
+ (tt.
yx
()*st.
xz
() + tt.
yy
()*st.
yz
() + tt.
yz
()*st.
zz
())*tt.
zz
(),
157
158
(tt.
zx
()*st.
xx
() + tt.
zy
()*st.
xy
() + tt.
zz
()*st.
xz
())*tt.
zx
()
159
+ (tt.
zx
()*st.
xy
() + tt.
zy
()*st.
yy
() + tt.
zz
()*st.
yz
())*tt.
zy
()
160
+ (tt.
zx
()*st.
xz
() + tt.
zy
()*st.
yz
() + tt.
zz
()*st.
zz
())*tt.
zz
()
161
);
162
}
163
164
165
template
<
class
Type1,
class
Type2>
166
inline
Type1
transformMask
(
const
Type2& t)
167
{
168
return
t;
169
}
170
171
172
template
<>
173
inline
sphericalTensor
transformMask<sphericalTensor>
(
const
tensor
& t)
174
{
175
return
sph
(t);
176
}
177
178
179
template
<>
180
inline
symmTensor
transformMask<symmTensor>
(
const
tensor
& t)
181
{
182
return
symm
(t);
183
}
184
185
//- Estimate angle of vec in coordinate system (e0, e1, e0^e1).
186
// Is guaranteed to return increasing number but is not correct
187
// angle. Used for sorting angles. All input vectors need to be normalized.
188
//
189
// Calculates scalar which increases with angle going from e0 to vec in
190
// the coordinate system e0, e1, e0^e1
191
//
192
// Jumps from 2PI -> 0 at -SMALL so parallel vectors with small rounding errors
193
// should hopefully still get the same quadrant.
194
//
195
inline
scalar
pseudoAngle
196
(
197
const
vector
& e0,
198
const
vector
& e1,
199
const
vector
& vec
200
)
201
{
202
scalar
cos
= vec & e0;
203
scalar
sin
= vec & e1;
204
205
if
(sin < -SMALL)
206
{
207
return
(3.0 + cos)*
mathematicalConstant::piByTwo
;
208
}
209
else
210
{
211
return
(1.0 - cos)*
mathematicalConstant::piByTwo
;
212
}
213
}
214
215
216
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
217
218
}
// End namespace Foam
219
220
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
221
222
#endif
223
224
// ************************ vim: set sw=4 sts=4 et: ************************ //