Ten Minute Physics - 18 How to write a FLIP Water Simulator.
입자 방식(Lagrangian) : 입자 하나하나를 추적해 디테일을 살리기에는 좋으나 계산량이 너무 많음.
격자 방식(Eulerian) : 공간을 나눠 계산량을 줄일 수 있으나 디테일이 뭉개지기 쉬움.
PIC Method

- 입자 시뮬레이션: 입자들을 단순히 움직이는 Mass Points처럼 시뮬레이션
- 속도 전달(입자 → 격자): 입자가 가진 속도를 격자에 전달해 격자 속도장(velocity field) 을 만듦
- 비압축성 만들기: 격자 위의 속도장이 압축되지 않도록 비압축성(incompressible)으로 만듦
- 속도 전달(격자 → 입자): 수정된 격자의 속도 정보를 입자에 전달
Simulate particles

- 중력을 속도에 더하고, 속도를 이용해 위치를 업데이트하여 입자 시뮬레이션을 진행함.

- 입자의 위치 (xp,yp)를 격자 간격(h)으로 나누고 내림하여 입자가 속한 셀 좌표 (xcell,ycell)를 찾음.
Velocity transfer (Particles → Grid)

-
q필드(속도), r필드(가중치 합)를 0으로 초기화
-
모든 입자에 대해 입자의 속도 (qp), 가중치 (w)를 곱해 주변 네 개의 격자 모서리 (q1,q2,q3,q4)에 더하며, 동시에 가중치 w도 r필드에 더함.
-
마지막으로 격자 위의 q값을 r값으로 나누어 평균 속도를 구함.
→ 개별 입자의 속도 정보를 주변 격자 모서리에 뿌려줌.
Velocity transfer (Grid → Particles)

PIC Viscosity

- PIC 방식은 유체 운동을 매끄럽게 만들지만, 격자에서 입자로 속도로 전달하면, 입자의 개별적인 움직임 대부분이 손실되는 수치적 점성(numerical viscosity) 문제가 발생함.

- 격자에서 발생한 속도의 변화량 (ΔV)만 입자의 기존 속도에 더해주는 FLIP 문제 해결
- FLIP 방식의 경우 더 세부적이지만, 노이즈가 많이 발생함.
- PIC + FLIP 방식의 혼합으로 두 방식의 단점을 완화하여 시뮬레이션 구축
Forcing Incompressibility

- D는 셀을 드나드는 유체의 총 유출량
- D가 양수이면 유출이 너무 많은것, 음수이면 유입이 너무 많은 것이며, 0이어야 비압축성임.

- D를 0으로 만들기 위해 주변 속도들을 동일한 양만큼 수정함.
- 장애물/벽을 처리하기 위해 셀에 S값을 할당(S=0은 고체, S=1은 물 또는 공기) → 이를 통해 벽과 접한 셀은 유체의 흐름이 밖으로 나가지 않도록 속도 수정량을 조절함.
- 해당 방식을 가우스-자이델 방법(Gauss-Seidel method)으로 여러 번 반복하여 계산함.
- 수렴 속도를 극적으로 높이기 위해 과잉 이완(overrelaxation) 방식 사용
d←o(ui+1,j−ui,j+vi,j+1−vi,j)
Drift

- Solver는 속도가 입자들을 충돌하게 만드는 경향은 알지만 이미 충돌하고 있는지는 확인 불가능
- Push Particles Apart

- 모든 입자 쌍을 확인하는 것은 많은 계산량을 요구하기에, 격자를 사용해 충돌 검사 속도를 향상시킴.
- Modify Divergence
- 셀의 중심에서 입자 밀도 (ρ)를 계산
- 계산된 밀도를 사용해 divergence (d)를 수정해, 밀도가 높은 영역에서는 d를 줄여 솔버가 더 많은 outward push를 생성하도록 유도
d←o(ui+1,j−ui,j+vi,j+1−vi,j)−k(ρ−ρ0)
ρ0 : 물 셀의 평균 밀도, k : 강성 계수