26.3 난류와 closure 모델 학습

실습 · 연습문제 1개

블록 평균 필터로 subgrid 응력 계산하기 subgrid-stress

고해상도 격자의 값 uiu_i(길이 NfN_f)를 연속한 KK칸씩 묶어 평균하면 거친 격자의 값 uˉJ\bar{u}_J(길이 Nf/KN_f/K)가 된다. Burgers 방정식의 비선형 항 u2/2u^2/2를 같은 방식으로 걸러 내면 u2‾/2≠uˉ2/2\overline{u^2}/2 \ne \bar{u}^2/2이고, 그 차이

τJ=12(u2‾J−uˉJ 2)\tau_J = \frac{1}{2}\Big(\overline{u^2}_J - \bar{u}_J^{\,2}\Big)

가 거친 격자에서 해상하지 못하는 규모의 효과, 즉 subgrid 응력이다.

함수 filter_and_stress(u, K)를 완성해 (ubar, tau)를 반환한다.

  • u: shape (Nf,) 또는 (B, Nf)인 배열(여러 스냅샷을 한 번에 줄 수 있다). Nf는 K의 배수다.
  • ubar, tau: shape (Nf // K,) 또는 (B, Nf // K).

테스트는 다음을 확인한다.

  • 블록 안에서 값이 일정하면 τ=0\tau = 0이다.
  • 블록 안에서 기울기 ss로 선형인 장에서는 τ=s2Δx2(K2−1)/24\tau = s^2 \Delta x^2 (K^2 - 1)/24이다(Δx\Delta x는 고해상도 격자 간격). 블록 안 분산의 절반이다.
  • 어떤 입력에서도 τ≥0\tau \ge 0이다(실현성, realizability). 블록 평균 필터에서 u2‾−uˉ2\overline{u^2} - \bar{u}^2은 블록 안의 분산이기 때문이다.
  • 2차원 입력(스냅샷 여러 개)도 처리한다.

힌트: u.reshape(*u.shape[:-1], -1, K).mean(-1)이 마지막 축을 K칸씩 묶어 평균한다. 반올림 오차로 아주 작은 음수가 나오지 않게 하려면 분산을 직접 계산하는 방식(블록 평균을 뺀 값의 제곱 평균)이 더 안전하다.