21
Slide 1 Using FLeX for Real-time Fluid Simulation in Virtual Surgery Brad Hittle May 11 th 2017

Using FLeX for Real-time Fluid Simulation in Virtual …on-demand.gputechconf.com/gtc/2017/presentation/s7209-brad-hittle...Using FLeX for Real-time Fluid Simulation in Virtual Surgery

Embed Size (px)

Citation preview

Slide 1

Using FLeX for Real-time Fluid Simulation in Virtual

Surgery

Brad Hittle

May 11th 2017

Slide 2

Introduction

• Temporal bone surgery among most complex

• Average $80,000/year to properly train ENT surgeons

• Lack of cadaveric training material

Slide 3

Virtual Surgery

• Complex surgeries

• Teaching/Training

• Informative feedback

Slide 4

Fluid Simulation?

• Multi-instrument process

• Visibility

• Temperature

Slide 5

Fluid Setup

• Fixed number of particles

• Recycle particles

• Blood and saline same phase

• Multiple mesh collisions

• Signed Distance Field (SDF)

Slide 6

SDF Issues

• Too expensive for real-time performance

• Particles fall through SDF

Dataset Size 7683

(s) 3843

(s) 1923

(s) 963

(s)

Intel Xeon E5-1650 v3 3.5 GHz 2179.01 216.517 19.6141 1.52809

Slide 7

SDF Approximation

• Subsample

• Edge detection

• Shelling algorithm

• Scale

Slide 8

SDF Results

0.001

0.01

0.1

1

10

76838419296

Tim

e (

s)

Quadro K5000

Quadro M5000

Quadro P5000

Quadro GP100

Slide 9

Cost of Approximation?

Slide 10

Irrigation

• Emitters

• Absorbers

Slide 11

Blood Label

• Setup

• Algorithm

• Cull Extra Voxels

Slide 12

Bleeding

• Create static emitter

• Constant bleeders for critical structures

• Blood and saline mixing

Slide 13

Multi-thread configuration

void updateThread (FluidSim *sim) {

sim->init ();

std::thread upThread =

std::thread([sim] { updateThread(sim); });

while (!sim->ShuttingDown) {

double dt = 1.0 / float (sim->DeltaTime);

double startTime = timer.read ();

sim->update ();

while (timer.read () - startTime < dt){}

}

upThread.join();

}

Slide 14

Multi-thread configuration

void updateThread (FluidSim *sim) {

sim->init ();

std::thread upThread =

std::thread([sim] { updateThread(sim); });

while (!sim->ShuttingDown) {

double dt = 1.0 / float (sim->DeltaTime);

double startTime = timer.read ();

sim->update ();

while (timer.read () - startTime < dt){}

}

upThread.join();

}

Slide 15

Multi-GPU

Main

Thread

(Render)

Fluid

Update

Update Fluid buffers

For Rendering

Add emitter

Remove suction

FLeX Update

GPU 0 GPU 1

Update Volume

for SDF

Slide 16

Simulation in Action

Slide 17

Simulation in Action

Slide 18

Simulation in Action

Slide 19

Simulation in Action

Slide 20

Special Thanks

• Hector Medina-Fetterman

• Dennis Sessanna (NVIDIA)

• Funded by NIDCD - R01 DC011321 (2011-2016)

Slide 21

Contact Information

Brad Hittle

[email protected]