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_dynamics/capt ure.mp4 My code http://csie.ntu.edu.tw/~b97122/archive/fluid_dynamics/Ope nTissue_backup.rar My motivation: From Dust http://www.youtube.com/watch?v=CfKQCAxizrA The framework OpenTissue OpenTissue is an open source simulation framework 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 Particle 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 represent a fluid Every particle is then assigned a set of initial properties After every time step (a few milliseconds), update the properties of all particles Use interpolation methods to solve the NavierStokes equation to find force contributions, then integrate 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 volume) 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: pV = nRT ⇒ p= (k ')V = k ρ k called “gas-stiffness” Entails assumptions of gas in steady state Does not consider weight pressure Causes “pulsing” because of lagging interplay between gravity and 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 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 time 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) objects I wanted to add the ability to add objects that interact 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 approach My contributions II Restoring force Place an invisible spring between every two particles that are close to each other initially Store the initial distance between every two “neighboring” particles Add a new spring force component that contributes: 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 fluid flow phenomena They are used to represent the conservation laws in integral form Conservation of mass over a given (control) volume c.v. with surface area c.s.: 0= d ρ dV + ∮ ρ(u⋅ ̂n)dA ∫ dt c.v. c.s. 𝜌 = density; u = velocity; n = surface normal 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: dd ηt ≈ ΔΔ ηt = T0+Δ1 t T0 for any property η Fluid properties at some point in the field can be obtained by interpolation My contributions III Field evaluator function 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∈Ω mj A j V j W (x− x j , h)= ∑ A j W (x − x j , h) ρ j∈Ω j 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; My contributions III Area Integrator D ̄ f = ∫ f ( A)dA D Goal: Find average of property at discretely sampled points I went for an evenly distributing sampler Aliasing is not an issue, don’t need random sampling # of samples ns should be proportional to # of particles that can fit into the surface: So we get: ns= ceil ̂ AC ∮ ρ(u⋅ n)dA≈ c.s. ns () 1 ∑ ns j AC Ap AC ns q j= ρ j (u j⋅ n̂ j ) ∑ ns j My contributions III Disk Integrator 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 real integrateDiskXZ(real ns, vector2 p_center, real r, field_evalutor f): real q_total = 0 π( 2 r )2= real ds = sqrt(PI / ns) * r // A C= int samples_in_diameter = sqrt(ns * 4/PI) // 4 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 ns⋅ ds 2 ⇒ √ 2r 4 = ns ds π My 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 kernel, 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 The integral form: Becomes: d 0= ∫ ρ dV + ∮ ρ(u⋅ ̂n)dA dt c.v. c.s. M T0+ 1− M T0 AC ns + ρ j (u j⋅ n̂ j) ∑ Δt ns j 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 model, 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 algorithms and data structures for rapid development of interactive modeling and simulation.” [2] Smoothed Particle Hydrodynamics – A Meshfree Particle Method (book) [3] Lagrangian Fluid Dynamics Using Smoothed Particle Hydrodynamics [4] Particle-Based Fluid-Fluid Interaction Summary Given high enough gas stiffness, SPH model is OK to simulate visually appealing real-time flow but is quite inaccurate OpenTissue SPH implementation is not very mature, lacks a lot of features I really miss: Accurate pressure values Correct fluid-solid interaction Arbitrary geometry I still cannot create real-time interactive applications involving 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 (應力所)