-
Notifications
You must be signed in to change notification settings - Fork 1
/
boundary_walls.cu
132 lines (110 loc) · 5.36 KB
/
boundary_walls.cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef __BOUNDARY_WALLS_CU__
#define __BOUNDARY_WALLS_CU__
#include "boundary.cu"
namespace Boundary {
namespace Walls {
__device__ float3 calculateWallsNoPenetrationForce(
float3 const& pos,
float3 const& vel,
float3 const& grid_min,
float3 const& grid_max,
float const& boundary_distance,
float const& boundary_stiffness,
float const& boundary_dampening,
float const& scale_to_simulation)
{
float3 repulsion_force = make_float3(0,0,0);
float diff;
// simple limit for "wall" in Y direction (min of simulated volume)
diff = boundary_distance - ((pos.y - grid_min.y ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,1,0);
repulsion_force += calculateRepulsionForce(vel, normal, diff, boundary_dampening, boundary_stiffness);
}
// simple limit for "wall" in Y direction (max of simulated volume)
diff = boundary_distance - ((grid_max.y - pos.y ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,-1,0);
repulsion_force += calculateRepulsionForce(vel, normal, diff, boundary_dampening, boundary_stiffness);
}
// simple limit for "wall" in Z direction (min of simulated volume)
diff = boundary_distance - ((pos.z - grid_min.z ) * scale_to_simulation);
if (diff > EPSILON ) {
float3 normal = make_float3(0,0,1);
repulsion_force += calculateRepulsionForce(vel, normal, diff, boundary_dampening, boundary_stiffness);
}
// simple limit for "wall" in Z direction (max of simulated volume)
diff = boundary_distance - ((grid_max.z - pos.z ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,0,-1);
float adj = boundary_stiffness * diff - boundary_dampening * dot(normal, vel);
repulsion_force += adj * normal;
}
// simple limit for "wall" in X direction (min of simulated volume)
diff = boundary_distance - ((pos.x - grid_min.x ) * scale_to_simulation);
if (diff > EPSILON ) {
float3 normal = make_float3(1,0,0);
repulsion_force += calculateRepulsionForce(vel, normal, diff, boundary_dampening, boundary_stiffness);
}
// simple limit for "wall" in X direction (max of simulated volume)
diff = boundary_distance - ((grid_max.x - pos.x ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(-1,0,0);
repulsion_force += calculateRepulsionForce(vel, normal, diff, boundary_dampening, boundary_stiffness);
}
return repulsion_force;
}
__device__ float3 calculateWallsNoSlipForce(
float3 const& pos,
float3 const& vel,
float3 const& force,
float3 const& grid_min,
float3 const& grid_max,
float const& boundary_distance,
float const& friction_kinetic,
float const& friction_static_limit,
float const& scale_to_simulation)
{
float3 friction_force = make_float3(0,0,0);
float diff;
// simple limit for "wall" in Y direction (min of simulated volume)
diff = boundary_distance - ((pos.y - grid_min.y ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,1,0);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
// simple limit for "wall" in Y direction (max of simulated volume)
diff = boundary_distance - ((grid_max.y - pos.y ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,-1,0);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
// simple limit for "wall" in Z direction (min of simulated volume)
diff = boundary_distance - ((pos.z - grid_min.z ) * scale_to_simulation);
if (diff > EPSILON ) {
float3 normal = make_float3(0,0,1);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
// simple limit for "wall" in Z direction (max of simulated volume)
diff = boundary_distance - ((grid_max.z - pos.z ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(0,0,-1);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
// simple limit for "wall" in X direction (min of simulated volume)
diff = boundary_distance - ((pos.x - grid_min.x ) * scale_to_simulation);
if (diff > EPSILON ) {
float3 normal = make_float3(1,0,0);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
// simple limit for "wall" in X direction (max of simulated volume)
diff = boundary_distance - ((grid_max.x - pos.x ) * scale_to_simulation);
if (diff > EPSILON) {
float3 normal = make_float3(-1,0,0);
friction_force += calculateFrictionForce(vel, force, normal, friction_kinetic, friction_static_limit);
}
return friction_force;
}
};
};
#endif // __BOUNDARY_WALLS_CU__