rotatingAxisI.hpp
Go to the documentation of this file.
1 /*------------------------------- phasicFlow ---------------------------------
2  O C enter of
3  O O E ngineering and
4  O O M ultiscale modeling of
5  OOOOOOO F luid flow
6 ------------------------------------------------------------------------------
7  Copyright (C): www.cemf.ir
8  email: hamid.r.norouzi AT gmail.com
9 ------------------------------------------------------------------------------
10 Licence:
11  This file is part of phasicFlow code. It is a free software for simulating
12  granular and multiphase flows. You can redistribute it and/or modify it under
13  the terms of GNU General Public License v3 or any other later versions.
14 
15  phasicFlow is distributed to help others in their research in the field of
16  granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the
17  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 
19 -----------------------------------------------------------------------------*/
20 
23 {
24 
25  if(!inTimeRange()) return {0,0,0};
26 
27  realx3 L = p - projectPoint(p);
28  return cross(omega_*unitVector(),L);
29 }
30 
32 pFlow::realx3 pFlow::rotate(const realx3& p, const rotatingAxis& ax, real dt)
33 {
34 
35  if(!ax.inTimeRange()) return p;
36 
37  realx3 nv = ax.unitVector();
38  real cos_tet = cos(ax.omega()*dt);
39  real sin_tet = sin(ax.omega()*dt);
40  real u2 = nv.x()*nv.x();
41  real v2 = nv.y()*nv.y();
42  real w2 = nv.z()*nv.z();
43  realx3 lp1 = ax.point1();
44 
45  // (a(v2+w2) - u( bv + cw - ux - vy - wz)) (1-cos_tet) + x cos_tet + (- cv + bw - wy + vz) sin_tet
46  realx3 res;
47 
48  res.x_ = (lp1.x_*(v2 + w2) - (nv.x_*(lp1.y_*nv.y_ + lp1.z_*nv.z_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
49  p.x_ * cos_tet +
50  (-lp1.z_*nv.y_ + lp1.y_*nv.z_ - nv.z_*p.y_ + nv.y_*p.z_) * sin_tet;
51 
52 
53  // ( b(u2+w2) - v( au + cw - ux - vy - wz))(1-cos_tet) + y cos_tet + ( cu - aw + wx - uz ) sin_tet
54  res.y_ = (lp1.y_*(u2 + w2) - (nv.y_*(lp1.x_*nv.x_ + lp1.z_*nv.z_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
55  p.y_ * cos_tet +
56  (lp1.z_*nv.x_ - lp1.x_*nv.z_ + nv.z_*p.x_ - nv.x_*p.z_) * sin_tet;
57 
58  // (c(u2+v2) - w( au + bv - ux - vy - wz ))(1-cos_tet) + z cos_tet + (-bu + av - vx + uy) sin_tet
59  res.z_ = (lp1.z_*(u2 + v2) - (nv.z_*(lp1.x_*nv.x_ + lp1.y_*nv.y_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
60  p.z_ * cos_tet +
61  (-lp1.y_*nv.x_ + lp1.x_*nv.y_ - nv.y_*p.x_ + nv.x_*p.y_) * sin_tet;
62 
63  return res;
64 }
65 
67 pFlow::realx3 pFlow::rotate(const realx3 &p, const line& ln, real theta)
68 {
69 
70  realx3 nv = ln.unitVector();
71  real cos_tet = cos(theta);
72  real sin_tet = sin(theta);
73  real u2 = nv.x()*nv.x();
74  real v2 = nv.y()*nv.y();
75  real w2 = nv.z()*nv.z();
76  realx3 lp1 = ln.point1();
77 
78  // (a(v2+w2) - u( bv + cw - ux - vy - wz)) (1-cos_tet) + x cos_tet + (- cv + bw - wy + vz) sin_tet
79  realx3 res;
80 
81  res.x_ = (lp1.x_*(v2 + w2) - (nv.x_*(lp1.y_*nv.y_ + lp1.z_*nv.z_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
82  p.x_ * cos_tet +
83  (-lp1.z_*nv.y_ + lp1.y_*nv.z_ - nv.z_*p.y_ + nv.y_*p.z_) * sin_tet;
84 
85 
86  // ( b(u2+w2) - v( au + cw - ux - vy - wz))(1-cos_tet) + y cos_tet + ( cu - aw + wx - uz ) sin_tet
87  res.y_ = (lp1.y_*(u2 + w2) - (nv.y_*(lp1.x_*nv.x_ + lp1.z_*nv.z_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
88  p.y_ * cos_tet +
89  (lp1.z_*nv.x_ - lp1.x_*nv.z_ + nv.z_*p.x_ - nv.x_*p.z_) * sin_tet;
90 
91  // (c(u2+v2) - w( au + bv - ux - vy - wz ))(1-cos_tet) + z cos_tet + (-bu + av - vx + uy) sin_tet
92  res.z_ = (lp1.z_*(u2 + v2) - (nv.z_*(lp1.x_*nv.x_ + lp1.y_*nv.y_ - nv.x_*p.x_ - nv.y_*p.y_ - nv.z_*p.z_)))*(1 - cos_tet) +
93  p.z_ * cos_tet +
94  (-lp1.y_*nv.x_ + lp1.x_*nv.y_ - nv.y_*p.x_ + nv.x_*p.y_) * sin_tet;
95 
96  return res;
97 }
98 
100 void pFlow::rotate(realx3* p, size_t n, const line& ln, real theta)
101 {
102  realx3 nv = ln.unitVector();
103  real cos_tet = cos(theta);
104  real sin_tet = sin(theta);
105  real u2 = nv.x()*nv.x();
106  real v2 = nv.y()*nv.y();
107  real w2 = nv.z()*nv.z();
108  realx3 lp1 = ln.point1();
109 
110  // (a(v2+w2) - u( bv + cw - ux - vy - wz)) (1-cos_tet) + x cos_tet + (- cv + bw - wy + vz) sin_tet
111  realx3 res;
112 
113  for(label i=0; i<n; i++ )
114  {
115  res.x_ = (lp1.x_*(v2 + w2) - (nv.x_*(lp1.y_*nv.y_ + lp1.z_*nv.z_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
116  p[i].x_ * cos_tet +
117  (-lp1.z_*nv.y_ + lp1.y_*nv.z_ - nv.z_*p[i].y_ + nv.y_*p[i].z_) * sin_tet;
118 
119 
120  // ( b(u2+w2) - v( au + cw - ux - vy - wz))(1-cos_tet) + y cos_tet + ( cu - aw + wx - uz ) sin_tet
121  res.y_ = (lp1.y_*(u2 + w2) - (nv.y_*(lp1.x_*nv.x_ + lp1.z_*nv.z_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
122  p[i].y_ * cos_tet +
123  (lp1.z_*nv.x_ - lp1.x_*nv.z_ + nv.z_*p[i].x_ - nv.x_*p[i].z_) * sin_tet;
124 
125  // (c(u2+v2) - w( au + bv - ux - vy - wz ))(1-cos_tet) + z cos_tet + (-bu + av - vx + uy) sin_tet
126  res.z_ = (lp1.z_*(u2 + v2) - (nv.z_*(lp1.x_*nv.x_ + lp1.y_*nv.y_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
127  p[i].z_ * cos_tet +
128  (-lp1.y_*nv.x_ + lp1.x_*nv.y_ - nv.y_*p[i].x_ + nv.x_*p[i].y_) * sin_tet;
129 
130  p[i] = res;
131  }
132 
133 }
134 
136 void pFlow::rotate(realx3* p, size_t n, const rotatingAxis& ax, real dt)
137 {
138  if(!ax.inTimeRange()) return;
139 
140  realx3 nv = ax.unitVector();
141  real cos_tet = cos(ax.omega()*dt);
142  real sin_tet = sin(ax.omega()*dt);
143  real u2 = nv.x()*nv.x();
144  real v2 = nv.y()*nv.y();
145  real w2 = nv.z()*nv.z();
146  realx3 lp1 = ax.point1();
147 
148  // (a(v2+w2) - u( bv + cw - ux - vy - wz)) (1-cos_tet) + x cos_tet + (- cv + bw - wy + vz) sin_tet
149  realx3 res;
150 
151  for(label i=0; i<n; i++ )
152  {
153  res.x_ = (lp1.x_*(v2 + w2) - (nv.x_*(lp1.y_*nv.y_ + lp1.z_*nv.z_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
154  p[i].x_ * cos_tet +
155  (-lp1.z_*nv.y_ + lp1.y_*nv.z_ - nv.z_*p[i].y_ + nv.y_*p[i].z_) * sin_tet;
156 
157 
158  // ( b(u2+w2) - v( au + cw - ux - vy - wz))(1-cos_tet) + y cos_tet + ( cu - aw + wx - uz ) sin_tet
159  res.y_ = (lp1.y_*(u2 + w2) - (nv.y_*(lp1.x_*nv.x_ + lp1.z_*nv.z_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
160  p[i].y_ * cos_tet +
161  (lp1.z_*nv.x_ - lp1.x_*nv.z_ + nv.z_*p[i].x_ - nv.x_*p[i].z_) * sin_tet;
162 
163  // (c(u2+v2) - w( au + bv - ux - vy - wz ))(1-cos_tet) + z cos_tet + (-bu + av - vx + uy) sin_tet
164  res.z_ = (lp1.z_*(u2 + v2) - (nv.z_*(lp1.x_*nv.x_ + lp1.y_*nv.y_ - nv.x_*p[i].x_ - nv.y_*p[i].y_ - nv.z_*p[i].z_)))*(1 - cos_tet) +
165  p[i].z_ * cos_tet +
166  (-lp1.y_*nv.x_ + lp1.x_*nv.y_ - nv.y_*p[i].x_ + nv.x_*p[i].y_) * sin_tet;
167 
168  p[i] = res;
169  }
170 
171 }
pFlow::real
float real
Definition: builtinTypes.hpp:46
pFlow::cos
INLINE_FUNCTION_HD real cos(real x)
Definition: math.hpp:178
pFlow::sin
INLINE_FUNCTION_HD real sin(real x)
Definition: math.hpp:168
pFlow::realx3
triple< real > realx3
Definition: types.hpp:48
pFlow::triple::y
INLINE_FUNCTION_HD T & y()
Definition: triple.hpp:141
cross
INLINE_FUNCTION_HD triple< T > cross(const triple< T > &v1, const triple< T > &v2)
n
int32 n
Definition: NBSCrossLoop.hpp:24
pFlow::line::projectPoint
INLINE_FUNCTION_HD realx3 projectPoint(const realx3 &p) const
Definition: line.hpp:106
pFlow::rotatingAxis::omega_
real omega_
Definition: rotatingAxis.hpp:43
pFlow::rotatingAxis
Definition: rotatingAxis.hpp:35
pFlow::timeInterval::inTimeRange
INLINE_FUNCTION_HD bool inTimeRange(real t) const
Definition: timeInterval.hpp:70
pFlow::timeInterval::inTimeRange
INLINE_FUNCTION_HD bool inTimeRange() const
Definition: timeInterval.hpp:76
pFlow::rotatingAxis::omega
INLINE_FUNCTION_HD real omega() const
Definition: rotatingAxis.hpp:68
pFlow::triple::x_
T x_
Definition: triple.hpp:49
pFlow::triple::z
INLINE_FUNCTION_HD T & z()
Definition: triple.hpp:144
rotate
INLINE_FUNCTION_HD realx3 rotate(const realx3 &p, const line &ln, real theta)
pFlow::triple::y_
T y_
Definition: triple.hpp:50
pFlow::triple::z_
T z_
Definition: triple.hpp:51
pFlow::line::point1
INLINE_FUNCTION_HD realx3 point1() const
Definition: line.hpp:86
pFlow::label
std::size_t label
Definition: builtinTypes.hpp:61
pFlow::rotatingAxis::linTangentialVelocityPoint
INLINE_FUNCTION_HD realx3 linTangentialVelocityPoint(const realx3 &p) const
Definition: rotatingAxisI.hpp:22
pFlow::triple::x
INLINE_FUNCTION_HD T & x()
Definition: triple.hpp:138
INLINE_FUNCTION_HD
#define INLINE_FUNCTION_HD
Definition: pFlowMacros.hpp:51
pFlow::line::unitVector
INLINE_FUNCTION_HD realx3 unitVector() const
Definition: line.hpp:102
pFlow::triple< real >