FLIP

정민용·2025년 12월 1일

Simulation

목록 보기
4/5

Ten Minute Physics - 18 How to write a FLIP Water Simulator.

입자 방식(Lagrangian) : 입자 하나하나를 추적해 디테일을 살리기에는 좋으나 계산량이 너무 많음.

격자 방식(Eulerian) : 공간을 나눠 계산량을 줄일 수 있으나 디테일이 뭉개지기 쉬움.

PIC Method

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

Simulate particles

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

  • 입자의 위치 (xp,yp)(x_p, y_p)를 격자 간격(h)으로 나누고 내림하여 입자가 속한 셀 좌표 (xcell,ycell)(x_{cell}, y_{cell})를 찾음.

Velocity transfer (Particles → Grid)

  • qq필드(속도), rr필드(가중치 합)를 0으로 초기화

  • 모든 입자에 대해 입자의 속도 (qp)(q_p), 가중치 (w)(w)를 곱해 주변 네 개의 격자 모서리 (q1,q2,q3,q4)(q_1, q_2, q_3, q_4)에 더하며, 동시에 가중치 wwrr필드에 더함.

  • 마지막으로 격자 위의 qq값을 rr값으로 나누어 평균 속도를 구함.

    → 개별 입자의 속도 정보를 주변 격자 모서리에 뿌려줌.

Velocity transfer (Grid → Particles)

  • Bilinear Interpolation을 사용해 주변 네 모서리 값을 가중치 합산함.

    • 이때 네 모서리 중 하나라도 속도가 정의되지 않았다면, 해당 값을 분자와 분모 모두에서 제외 후 계산
    • 격자엔 수평 속도와 수직 속도가 서로 다른 위치에 저장되어 있기에 u 성분을 계산할 땐 입자의 y 좌표 대신 yh2y-\frac{h}{2} 를 사용하면 됨.

    → 격자에서 계산된 매끄러운 속도 정보 (Q)(Q)를 입자 (Qp)(Q_p)에게 전달.

PIC Viscosity

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

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

Forcing Incompressibility

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

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

Drift

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

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

0개의 댓글