38 #ifdef CONSTUCTOR_OUTPUT
39 std::cout<<
"InfiniteWall () finished"<<std::endl;
73 for(
int m=0; m<n; m++)
78 AB[id] /= sqrt(
AB[
id].GetLength2());
95 C.resize((n-1)*n*(n+1)/6);
96 for(
int m=0; m<n; m++)
98 for(
int l=0; l<m; l++)
100 int id = (n-2)*(n-1)*n/6+(m-1)*m/2+l;
120 for(
unsigned int i=0; i<Points.size()-1; i++)
133 GetUnitVector(Points[1]-Points[0]),
134 GetUnitVector(Points[2]-Points[1]));
136 for(
unsigned int i=0; i<Points.size()-1; i++)
143 GetUnitVector(Points[2]-Points[0]),
144 GetUnitVector(Points[1]-Points[0]));
172 if (distance_new>distance)
177 else {distance2 = distance; id2 = id;}
179 distance = distance_new;
id = i;
183 else {distance2 = distance_new; id2 = i;}
194 bool intersection_with_id2 = (
finite_walls[id2].get_distance(D)>0.0);
198 if (intersection_with_id2)
203 (
id<id2)?( (id3-2)*(id3-1)*id3/6+(id2-1)*id2/2+id ):
204 (
id<id3)?( (id3-2)*(id3-1)*id3/6+(
id -1)*
id /2+id2 ):
205 ( (
id -2)*(
id -1)*
id /6+(id3-1)*id3/2+id2 );
209 normal_return /= -distance;
211 }
else { intersection_with_id2 =
true; distance2 = distance3; id2 = id3; }
214 if (intersection_with_id2)
216 int index = (
id>id2)?((
id-1)*
id/2+id2):((id2-1)*id2/2+id);
218 normal_return = AC -
AB[index] * Dot(AC,
AB[index]);
221 normal_return /= -distance;
241 for (
int i=0; i<n; i++)
243 is >> dummy >> normal >> dummy >> position;
252 os <<
"FiniteWall numFiniteWalls " <<
finite_walls.size();
255 os <<
" normal " << it->get_Normal() <<
" position " << it->get_Position();
265 std::vector<Vec3D>
A;
266 std::vector<Vec3D>
AB;
267 std::vector<Vec3D>
C;
void read(std::istream &is)
reads wall
Vec3D velocity
velocity of the wall (used to calculate the relative velocity in the force calculation) ...
virtual FiniteWall * copy() const
Wall copy method. It calls the copy contrustor of this Wall, usefull for polymorfism.
void create_open_prism_wall(std::vector< Vec3D > Points, Vec3D PrismAxis)
Matrix3D Cross(const Vec3D &A, const Matrix3D &B)
void create_open_prism_wall(std::vector< Vec3D > Points)
void create_prism_wall(std::vector< Vec3D > Points)
friend Mdouble GetLength2(const Vec3D &A)
bool get_distance_and_normal(BaseParticle &P, Mdouble &distance, Vec3D &normal_return)
Since this function should be called before calculating any Particle-Wall interactions, it can also be used to set the normal vector in case of curved walls.
Mdouble get_WallInteractionRadius() const
const Vec3D & get_Position() const
void add_finite_wall(Vec3D normal, Vec3D point)
Adds a wall to the set of finite walls, given an outward normal vector s.t. normal*x=normal*point.
std::vector< InfiniteWall > finite_walls
Implementation of a 3D vector (by Vitaliy).
void print(std::ostream &os) const
outputs wall
Vec3D get_Velocity() const
access function for velocity
void add_finite_wall(Vec3D normal_, Mdouble position_)
Adds a wall to the set of finite walls, given an outward normal vector s. t. normal*x=position.
void create_prism_wall(std::vector< Vec3D > Points, Vec3D PrismAxis)