Skip to content
cfd-lab:~/ko/posts/2026-06-14-acoustic-inte…● online
NOTE #072DAY SUN 논문리뷰DATE 2026.06.14UPDATED 2026.10.19READ 5 min read#Aeroacoustics#Diffuse-Interface#Weak-Compressibility#Multiphase#Paper-Review

물 위에서 외친 소리는 왜 물속에 닿지 않는가 — 분산 계면 음향 투과

압력 투과 계수 T가 1을 넘어도 에너지는 안 늘어난다. 99.9%는 임피던스 비를 제곱한 쪽에 가깝다.

수영장 가장자리에서 친구를 불러도, 물에 잠긴 사람은 거의 듣지 못한다. 공기 중 소리의 99.9%가 수면에서 튕겨 나오기 때문이다. 같은 물리가 해양 음향, 의료 초음파, 수중 소음을 가른다. Ballout 등(2025)을 따라, 계면의 반사·투과·굴절을 1D 음향 솔버로 다시 적는다.

음속비와 밀도비로 z2/z1z_2/z_1을 벌리면, 가운데 계면에서 반사 펄스가 커지고 투과 펄스는 줄어든다.

z1 = 1.00z2 = 4.50R = 0.636T = 1.636

두 임피던스를 1:1로 맞추면 펄스가 계면을 통과하고 반사가 사라진다. 공기–물처럼 점프가 크면 왼쪽에는 반사만 남는다.

Abbas Ballout 외, "Acoustic Propagation/Refraction Through Diffuse Interface Models", arXiv:2504.01727 (2025). 비압축 Navier–Stokes/Cahn–Hilliard의 약압축성(weak compressibility) 항을 손봐서, 두 상(phase)이 서로 다른 음속을 갖게 하고 그 위로 음파를 보낸다.

음향 임피던스 — 매질이 소리에 거는 저항#

소리가 한 매질을 통과할 때 느끼는 저항을 음향 임피던스(acoustic impedance, 밀도×음속) 라 부른다.

z=ρ csz = \rho\, c_s

여기서 ρ\rho는 밀도, csc_s는 음속이다. 공기는 zair=1.2×343≈410z_\text{air} = 1.2 \times 343 \approx 410, 물은 zwater=1000×1481≈1.5×106z_\text{water} = 1000 \times 1481 \approx 1.5\times10^6. 무려 3600배 차이다.

임피던스는 소리가 그 매질에 얼마나 잘 실리는가를 나타낸다. 두 매질의 임피던스가 비슷하면 음파는 매끄럽게 넘어간다. 크게 다르면 대부분 튕겨 나온다. 수면에서 소리가 거의 반사되는 이유가 바로 이 점프다.

그 점프를 반사 계수에 다시 넣는다. 위에 적은 반올림 z1≈410z_1\approx 410, z2≈1.5×106z_2\approx 1.5\times 10^6이면 비는 약 3600이다. R=(z2−z1)/(z1+z2)R=(z_2-z_1)/(z_1+z_2)는 0.999에 붙는다. 그 제곱이 0.999 근처라, 앞에서 말한 99.9%와 맞는다. 압력 투과 T=2z2/(z1+z2)T=2z_2/(z_1+z_2)는 2 바로 아래다. 1을 넘어도 에너지가 늘어난 것은 아니다. 물속의 입자 속도는 임피던스에 반비례해서 작아진다.

반사와 투과 — 임피던스 점프가 가른다#

수직 입사하는 평면파의 반사 계수 RR과 투과 계수 TT는 임피던스만으로 결정된다(논문 식 37).

R=z2−z1z1+z2,T=2z2z1+z2R = \frac{z_2 - z_1}{z_1 + z_2}, \qquad T = \frac{2 z_2}{z_1 + z_2}

z1z_1, z2z_2는 각각 입사 측·투과 측 임피던스다. 공기→물이라면 z2≫z1z_2 \gg z_1이므로 R→1R \to 1. 거의 완전 반사다. 압력 투과 계수 TT는 1을 넘을 수 있다. 압력 진폭이 커지는 것은 에너지 보존을 깨지 않는다. 투과파의 입자 속도가 작아져 에너지 플럭스는 여전히 보존된다.

앞의 관에서 이미 그 점프를 밀었다. 음속비와 밀도비가 커질수록 투과 펄스는 작아지고 반사 펄스가 커진다. 1:1이면 반사가 사라진다. 같은 음파가 출구에서 되돌아오지 않게 막는 다른 자리는 NSCBC 출구 경계다.

13도의 벽 — Snell 법칙과 임계각#

비스듬히 입사하면 투과파의 방향이 꺾인다. 빛의 굴절과 똑같은 Snell 법칙(입사각과 투과각의 사인비가 음속비와 같다) 이 음파에도 성립한다(논문 식 41).

sin⁡θics1=sin⁡θtcs2\frac{\sin\theta_i}{c_{s1}} = \frac{\sin\theta_t}{c_{s2}}

θi\theta_i는 입사각, θt\theta_t는 투과각이다. 공기→물처럼 투과 측 음속이 더 빠르면(cs2>cs1c_{s2} > c_{s1}), 입사각이 일정 값을 넘는 순간 sin⁡θt\sin\theta_t가 1을 초과한다. 투과파가 존재할 수 없다. 이 문턱이 임계각(critical angle) 이다.

θc=arcsin⁡ ⁣(cs1cs2)=arcsin⁡ ⁣(3431481)≈13.4∘\theta_c = \arcsin\!\left(\frac{c_{s1}}{c_{s2}}\right) = \arcsin\!\left(\frac{343}{1481}\right) \approx 13.4^\circ

343/1481343/1481은 약 0.232다. 그 아크사인이 13.4도다. 공기 중 음원이 수면에 이 각도보다 더 비스듬히 닿으면, 소리는 물속에 들어가지 못한다. 전반사다.

입사각과 음속비를 움직이면 투과 광선이 수면에 눕거나 다시 선다.

critical angle θc = 13.38°wave transmits into medium 2

입사각을 13도 부근까지 올리면 투과 광선이 수면에 거의 누우며 사라진다. 그 순간 반사 광선만 남는다. 음속비를 줄이면 임계각이 커져 더 비스듬한 입사도 투과를 허용한다.

약압축성으로 음파를 싣는다#

비압축 솔버는 압력을 단지 발산 제약을 맞추는 도구로 쓴다. 그 압력장으로는 음파를 전파시킬 수 없다. 논문은 약압축성(weak compressibility, 압력에 시간 미분 항을 더해 유한 음속을 부여) 식을 도입한다.

∂tp+ρ cs2 ∇⋅u=0\partial_t p + \rho\, c_s^2\, \nabla\cdot\mathbf{u} = 0

pp는 압력, u\mathbf{u}는 속도, csc_s는 그 점의 음속이다. 손댄 자리는 csc_s를 상(相)마다 다르게 보간한 점이다. 농도 cc로 밀도·음속을 섞는다.

( ⋅ )=( ⋅ )1 c+( ⋅ )2 (1−c)(\,\cdot\,) = (\,\cdot\,)_1\, c + (\,\cdot\,)_2\,(1 - c)

이 수정으로, 같은 솔버가 매질1에서는 cs1c_{s1}로, 매질2에서는 cs2c_{s2}로 음파를 옮긴다. 저자들은 이를 엔트로피 안정 불연속 갤러킨 스펙트럴 요소법(DGSEM)으로 이산화해 스펙트럴 수렴을 보였다.

분산 계면이 만드는 모델링 오차#

VOF나 레벨셋이 계면을 한 칸으로 자르는 것과 달리, Cahn–Hilliard 모델은 계면을 폭 ε\varepsilon으로 번지게 한다.

c0=1−0.5(1+tanh⁡2xε)c_0 = 1 - 0.5\left(1 + \tanh\frac{2x}{\varepsilon}\right)

이 번짐은 모델링 오차를 낳는다. 논문은 그 오차가 계면 폭의 제곱, 정확히는 파장으로 정규화한 O ⁣((ε/λ)2)\mathcal{O}\!\left((\varepsilon/\lambda)^2\right)로 줄어듦을 수치 실험으로 확인했다. ε→0\varepsilon \to 0이면 날카로운 계면의 해석해로 수렴한다. 앞 1D 관의 "interface width" 슬라이더가 바로 이 ε\varepsilon이다. 키우면 투과·반사 펄스가 살짝 뭉개진다.

Python — 1D 관에서 계수를 재현#

선형 음향 방정식을 staggered 격자 위 FDTD로 적분한다. 가우시안 펄스를 쏘고, 경계면을 지난 뒤의 반사·투과 진폭을 해석해와 비교한다.

import numpy as np
 
def impedance(rho, c):
    """음향 임피던스 z = rho * c (밀도 × 음속)"""
    return rho * c
 
def analytic_coeffs(z1, z2):
    """수직 입사 평면파의 반사·투과 계수 (논문 식 37)"""
    R = (z2 - z1) / (z1 + z2)
    T = 2.0 * z2 / (z1 + z2)
    return R, T
 
def tanh_interface(x, eps):
    """경계면을 폭 eps로 번지게 하는 농도장 (논문 식 32)"""
    return 1.0 - 0.5 * (1.0 + np.tanh(2.0 * x / eps))
 
def run_acoustic_tube(rho1=1.0, c1=1.0, rho2=2.5, c2=1.8,
                      N=2000, L=4.0, eps=0.04, steps=2600):
    """1D 선형 음향계를 적분해 반사·투과 펄스 진폭을 측정한다."""
    dx = L / N
    x = -L / 2 + (np.arange(N) + 0.5) * dx
    conc = tanh_interface(x, eps)            # 1: 매질1, 0: 매질2
    rho = rho1 * conc + rho2 * (1.0 - conc)  # 밀도 보간
    cs  = c1   * conc + c2   * (1.0 - conc)  # 음속 보간
    K   = rho * cs**2                        # 체적탄성률 rho c^2
 
    p = np.exp(-((x + 0.55) / 0.12)**2)      # 우향 가우시안 펄스
    u = p / (rho1 * c1)                      # 매질1 특성: u = p/(rho c)
 
    dt = 0.4 * dx / cs.max()                 # CFL 제한 시간 간격
    left, right = N // 4, 3 * N // 4         # 좌·우 측정 프로브
    p_inc = p.max()
    refl_peak = tran_peak = 0.0
    for n in range(steps):
        u[:-1] += -dt / (0.5 * (rho[:-1] + rho[1:]) * dx) * (p[1:] - p[:-1])
        p[1:]  += -dt * K[1:] / dx * (u[1:] - u[:-1])
        if n > steps // 2:                   # 펄스가 계면을 통과한 뒤
            refl_peak = max(refl_peak, np.abs(p[:left]).max())
            tran_peak = max(tran_peak, np.abs(p[right:]).max())
    return p_inc, refl_peak, tran_peak
 
if __name__ == "__main__":
    rho1, c1, rho2, c2 = 1.0, 1.0, 2.5, 1.8
    z1, z2 = impedance(rho1, c1), impedance(rho2, c2)
    R, T = analytic_coeffs(z1, z2)
    p_inc, refl, tran = run_acoustic_tube(rho1, c1, rho2, c2)
    print(f"z1={z1:.3f}  z2={z2:.3f}")
    print(f"해석해   |R|={abs(R):.3f}  T={T:.3f}")
    print(f"측정값   |R|={refl / p_inc:.3f}  T={tran / p_inc:.3f}")

출력은 z1=1.0z_1=1.0, z2=4.5z_2=4.5에서 해석해 ∣R∣=0.636|R|=0.636, T=1.636T=1.636에 가깝게 측정값이 따라붙는다. 기본값은 ρ1=1\rho_1=1, c1=1c_1=1, ρ2=2.5\rho_2=2.5, c2=1.8c_2=1.8이라 z2=ρ2c2=4.5z_2=\rho_2 c_2=4.5다. R=(4.5−1)/(4.5+1)=3.5/5.5=0.636R=(4.5-1)/(4.5+1)=3.5/5.5=0.636, T=2×4.5/5.5=1.636T=2\times 4.5/5.5=1.636. 0.6360.636의 제곱은 0.405 근처다. TT가 1.636이어도, 그 제곱이 반사 에너지를 1 너머로 밀어 올리지는 않는다. 입자 속도가 임피던스 비만큼 줄어 플럭스를 맞춘다.

격자는 N=2000N=2000, L=4L=4라 dx=0.002dx=0.002다. ε=0.04\varepsilon=0.04이면 폭 파라미터가 20칸이다. 3D 공기–물이 계면 안에 10점 이상을 요구한 것과 같은 자리다. 음속 최대는 c2=1.8c_2=1.8이라 시간 간격은 dt=0.4 dx/1.8dt=0.4\,dx/1.8이다. CFL 0.4는 빠른 쪽을 본다. 스텝 2600의 절반인 1300스텝 뒤부터 좌우 프로브가 피크를 재기 시작한다. 격자를 촘촘히 하고 ε\varepsilon을 줄이면 해석해와의 차이가 더 좁아진다.

재현하며 의심스러웠던 것#

가장 먼저 부딪힌 함정은 반사파 분리다. 왼쪽 프로브는 입사파와 반사파의 합을 본다. 논문은 단상(single-phase) 시뮬레이션을 따로 돌려 입사파를 빼낸다. 위 코드는 펄스가 충분히 오른쪽으로 떠난 뒤 좌측 영역의 잔여 신호만 측정해 이 문제를 우회했지만, 입사·반사가 겹치는 구간에서는 어긋난다.

약압축성은 진짜 압축성이 아니다. 충격파나 큰 마하수에는 적용할 수 없다. 저자들도 저마하·선형 음향에 한정한다. 압축성 솔버로 직접 음향을 푸는 것과는 목적이 다르다.

3D 공기-물 예제는 6750만 자유도를 썼다. 분산 계면에 10개 이상의 점을 욱여넣어야 정확도가 나오기 때문이다. 계면이 얇아질수록 비용이 폭증한다. 이 방법이 VOF를 대체할지는 문제 규모에 달렸다.

다음에 읽을 논문#

ε\varepsilon를 줄이면 (ε/λ)2(\varepsilon/\lambda)^2로 오차는 줄어든다. 대신 3D에서는 계면 안 10점이라는 조건이 자유도를 6750만까지 밀었다. 1D 기본값 ε/dx=20\varepsilon/dx=20은 그 10점보다 두 배 두껍다. 더 얇게 자르기 전에, 0.636과 1.636이 먼저 붙는지 본다. 붙지 않으면 안티확산 계면 샤프닝이 아니라 프로브 시각이 문제다.

같은 그룹의 엔트로피 안정 DGSEM iNS/CH 원논문(Manzanero 외, 2020)은 이 약압축 항이 올라탄 이산화다. 출구에서 음파를 삼키는 경계는 앞의 NSCBC와 맞닿아 있다. 계면을 억지로 얇히기 전에, 임피던스 비가 3600인 수직 입사에서 RR이 0.999에 붙는지를 먼저 확인한다.

도움이 됐다면 공유해주세요.