Computational Fluid Dyna mics
Real-time animation of low-Reynolds-number flow using Smoothed Particle Hydrodynamics
presentation by 薛德明 Dominik Seifert B97902122
Visualization of my results
http://csie.ntu.edu.tw/~b97122/archive/fluid_dyn amics/capture.mp4
My code
http://csie.ntu.edu.tw/~b97122/archive/fluid_
dynamics/OpenTissue_backup.rar
My motivation: From Dust
http
://www.youtube.com/watch?v=CfKQCAxizrA
The framework OpenTissue
OpenTissue is an open source simulation framew ork with a simple, working SPH implementation
I added some features to their implementation
Their original implementation is described in this 88 page document:
“Lagrangian Fluid Dynamics Using Smoothed Parti cle Hydrodynamics”
Smoothed Particle Hydrodynamics Quick review
Note: SPH particles are not actual particles!
They are really fluid samples of constant mass
Particles are placed inside a container to represen t a fluid
Every particle is then assigned a set of initial pr operties
After every time step (a few milliseconds), update the properties of all particles
Use interpolation methods to solve the Navier-Stoke s equation to find force contributions, then integr ate to find new velocity and position
SPH
Particle Properties
Support Radius (constant)
Minimum interaction distance between particles
Mass (constant; ensures Conservation of Mass explicitly)
Position (varying)
Surface normal (varying)
Velocity (varying)
Acceleration (varying)
Sum of external forces (varying)
Density (varying due to constant mass and varying volum e)
Pressure (varying)
Viscosity (constant)
Smoothed Particle Hydrodynamics
Solver pseudocode
Smoothed Particle Hydrodynamics The pressure problem
Fluids cannot be accurately incompressible
Pressure value approximated by Ideal Gas Law:
k called “gas-stiffness”
Entails assumptions of gas in steady state
Does not consider weight pressure
Causes “pulsing” because of lagging interplay between gravity a nd pressure force
Large gas-stiffness can reduce/eliminate the lag and the pulsing
Alternatively, take density to the power of heat capacity ratio
But high pressure requires a smaller time-step and thus makes the simulation more expensive
pV = nRT ⇒ p= ( k ' ) V = k ρ
My contributions I
Fluid-fluid interactions
In OpenTissue, a system can be comprised of only a single fluid
I changed the code to support more than one fluid at a tim e
The math and physics are mostly the same, except for:
Viscosity
Kernel support radius
Still missing:
Surface tension interfaces between fluids of different polarity
But I still spent three days on changing the framework due to heavily templated C++ code
My contributions II
Fluid-solid interactions
In OpenTissue only supports static (immovable) obje cts
I wanted to add the ability to add objects that int eract with the fluid, objects that can float, sink etc.
Solid dynamics are very complicated! What are…
Tensile Strength?
Compressive Strength?
Young’s modulus?
I came up with an intuitive but not quite correct a pproach
My contributions II Restoring force
Place an invisible spring between every two pa rticles that are close to each other initially
Store the initial distance between every two
“neighboring” particles
Add a new spring force component that contribu tes:
k * abs(current_distance – original_distance)
Works for very few particles, but not for many
My contributions III
Control Volumes - Overview
Control volumes are used in the analysis of fl uid flow phenomena
They are used to represent the conservation la ws in integral form
Conservation of mass over a given (control) vo lume c.v. with surface area c.s.:
= density; u = velocity; n = surface normal
0= d
dt
∫
c.v.
ρ dV +
∮
c.s.
ρ (u⋅̂n ) dA
My contributions III
Control Volumes in SPH
Volume integrators are easy: Simply accumulate all contributions of all particles in volume
Area integrators are trickier
Time derivative can be obtained via difference quotients: for any property
Fluid properties at some point in the field ca n be obtained by interpolation
d η
d t ≈Δ η
Δ t = ηT0+ 1− ηT0
Δ t η
My contributions III
Field evaluator function
ValueType evaluate(vector pos, real radius, ParticleProperty A):
ParticleContainer particles;
search(pos, radius, particles);
ValueType res = ValueType(0);
foreach particle p in particles:
real W = DefaultKernel.evaluate(pos - p.position);
res += (p.*A)() * p.mass/p.density * W;
return res;
This required me to change the spatial partioning grid to support queries at arbitrary locations
After that, I only had to implement the famous SPH field evaluation template for some property A:
Translates to:
A( x)=∑
j∈Ω
AjV jW ( x− x j , h)=∑
j ∈Ω
Aj mj
ρj W ( x −xj , h)
My contributions III Area Integrator
Goal: Find average of property at discretely sa mpled points
I went for an evenly distributing sampler
Aliasing is not an issue, don’t need random samp ling
# of samples ns should be proportional to # of particles that can fit into the surface:
So we get:
D ̄f =
∫
D
f ( A)dA
∮
c.s.ρ (u⋅̂n) dA≈ AC 1
ns
∑
j ns
qj= AC ns
∑
j ns
ρ j(u j⋅ ̂nj)
ns=ceil
(
AACp)
My contributions III Disk Integrator
real integrateDiskXZ(real ns, vector2 p_center, real r, field_evalutor f):
real q_total = 0
real ds = sqrt(PI / ns) * r //
int samples_in_diameter = sqrt(ns * 4/PI) //
vector2 min = p_center – r
for (int i = 0; i < samples_in_diameter; i++) for (int j = 0; j < samples_in_diameter; j++)
vector2 pos = (min.x + i * ds, min.z + j * ds) if (length(pos - p_center) > r) continue
q_total += f(pos) return q_total / ns
In this approach, every kind of surface needs their own integrator
I only have to consider disks in my pipe flow example
The disk integrator iterates over the cells of an imaginary grid that we lay over the disk to find the average of fluid property f
AC= π
4 (2 r )2=ns⋅ds2⇒ 2 r
ds =
√
π4 nsMy contributions III
Area Integrator - Considerations
No need to sample over an already sampled set
Can use spatial selection instead:
Find all particles in distance d from the surface
Use scaled smoothing kernel to add up contributions
I was not quite sure how to mathematically scale the k ernel, so I went for the sampling approach
I also used the integrator to place the cylindrically- shaped fluid inside the pipe
My contributions III Conservation of mass
M T0+ 1−M T0
Δ t + AC
ns
∑
j ns
ρ j(u j⋅ ̂n j)
0= d
dt
∫
c.v.
ρ dV +
∮
c.s.
ρ (u⋅̂n ) dA
The integral form:
Becomes:
The first term is the time derivative of Mass inside the c.v.
The second term is the mass flux through the c.v.’s surface area
Particle boundary deficiency, Holes in the fluid and
Control Volume - Correctness
Boundary deficiency:
Since atmosphere and structure are not represented in this mod el, computations have to cope with a pseudo-vacuum ( 真空 )
Governing equations are adjusted to cope with the deficiency
e.g. Level set function for surface tension considers:
Inside fluid = 1
Outside fluid = 0
C.v.’s must always be completely filled!
Fluid volume is never correct which causes “holes” in the fluid
Think: What is the space between the particles/samples?
C.v. computations can also never be 100% correct!
Bibliography
[1] OpenTissue @ http://www.opentissue.org/ “ OpenTissue is a collection of generic algorith ms and data structures for rapid development of interactive modeling and simulation.”
[2] Smoothed Particle Hydrodynamics – A Meshf ree Particle Method (book)
[3] Lagrangian Fluid Dynamics Using Smoothed P article Hydrodynamics
[4] Particle-Based Fluid-Fluid Interaction
Summary
Given high enough gas stiffness, SPH model is OK to simulat e visually appealing real-time flow but is quite inaccurate
OpenTissue SPH implementation is not very mature, lacks a l ot of features
I really miss:
Accurate pressure values
Correct fluid-solid interaction
Arbitrary geometry
I still cannot create real-time interactive applications in volving fluid flow but it was still an insightful endeavour .
What’s next?
Surface rendering until next week
Then choose one from the list…
Improve SPH implementation
Add generic surfaces (currently only supports implicit primitives)
Make it adaptive (choose sample size dynamically)
Learn solid dynamics and work on Fluid-Structure interaction
More work on surface rendering
Optimized OpenGL/DX/XNA implementation that runs on the GPU
Work on Computational Galactic Dynamics ( 計算星系動力學 )
with professor 闕志鴻 from the Institute of Astronomy ( 天文所 )
Simulation of dark matter & fluid during galaxy formation
Work on level sets and the level set method in CFD
with professor Yi-Ju 周 from the Institute of Applied Mechanics ( 應力所 )