실측 결과#

설계를 정할 때 실제로 재 본 값들을 모아 둔 페이지다. 각 절은 "무엇이 궁금해서 쟀는지 → 숫자 → 그래서 뭘 정했는지" 순서로 읽으면 된다. 그 결정이 전체 설계에서 어디에 걸리는지는 설계 근거 에 있다.

보간 안전장치의 효과#

보간이 만드는 overshoot 가 실제로 얼마나 되는지, 안전장치를 넣으면 사라지는지 확인한 것이다. aicfd-grid-indoor-physical 데이터 기준이다.

항목 수정 전 수정 후
격자 velocity 크기 최댓값 30~36 m/s (원본 점군의 8~13배) 원본 점군 최댓값과 동등
overshoot 화소 위치 100% 도메인 경계 —
원본 대 p99.9 윈저화 표준편차 차이 18% 1%

원본 점군의 velocity 크기 최댓값은 2.3~4.5 m/s 였다. 그런데 격자에서는 30 m/s 를 넘었고, 그 화소가 전부 도메인 경계에 있었다. 실제 현상이라면 극단값이 경계에만 100% 몰릴 이유가 없으므로, 보간 과정에서 생긴 아티팩트로 판단했다. 게다가 이 값들이 양자화 범위 경계에서 포화하면서 정규화 표준편차를 18% 나 밀어 올렸고, 그 영향이 L2 계열 지표까지 이어졌다.

그래서 필드별 안전장치를 넣기로 했다. 넣고 난 뒤 indoor 의 clip 비율은 velocity 0.0008%, temperature 0.0350% 다.

지표와 시각적 품질의 괴리#

평가 이미지로는 문제가 없어 보이는데 지표만 나쁘게 나오는 현상을 어디까지 믿어야 하는지 따져 본 것이다. aicfd-grid-indoor-physical 회귀 모델, fold 1 테스트 기준이다.

증상: 평가 이미지에서는 예측과 정답이 거의 똑같아 보이는데, velocity 크기의 rel_l2% 가 37%(샘플 평균) / 55%(전체 합산)이고 temperature r2 는 −0.20 이었다.

원인을 나눠 보니 계산이 틀린 것이 아니라 세 가지가 겹친 결과였다.

  1. 데이터 포화 — 당시 velocity 성분의 양자화 범위가 ±12 m/s 였고 급기구 실제 속도가 그보다 커서 139개 화소가 경계에 붙어 있었다.
  2. 학습 loss 는 L1 — 급기구가 선형으로만 기여하고 전체 격자점 수로 희석되므로, 모델이 그 스파이크를 무시하고 매끄럽게 예측한다. 급기구를 뺀 나머지 영역은 잘 맞춘다.
  3. 지표는 L2 상대 — 급기구를 제곱해서 보고, 분모의 정답 RMS 는 0.37 로 작다. 그 결과 약 140개 화소가 지표 값을 거의 다 결정한다.

오차 에너지의 정답 크기별 분포:

구간 화소 비율 신호 오차 평균
0 ~ p50 (정지 영역) 50% 2.8% 0.9% 0.019
p50 ~ p90 40% 17% 2.8% 0.035
p90 ~ p99 9% 28% 3.5% 0.083
p99 ~ max (제트·급기구) 1% 50% 88% 0.49

표를 보면 오차 에너지의 88% 가 상위 1% 화소에 있다. 실제로 정답이 5 m/s 이상인 화소 201개(전체의 0.02%)만 빼면 전체 합산 rel_l2% 가 55.4 에서 23.2 로 떨어진다. 샘플별 rel_l2% 는 최소 12 / 중앙 28 / 최대 96 으로 퍼져 있다.

물리 단위 velocity 크기 분포 (fluid): 평균 0.14~0.26, RMS 0.26~0.44, 중앙값 0.09~0.18, p95 0.40~0.74 m/s. 학습 공간 표준편차가 1.011 이므로 급기구를 뺀 나머지 영역은 이 맞다. 다만 급기구 근처의 값이 표준편차의 85배까지 올라간다.

결론은 이렇다. 이 필드에서 rel_l2% 는 예측 품질을 말해 주는 지표가 아니라 분포의 상단 꼬리를 말해 주는 지표에 가깝다. 그래서 판단은 물리 단위 mae 로 하고, rel_l2% 는 다른 결과와 숫자를 맞춰 볼 때만 쓴다 (해석 기준).

5-fold 테스트 지표#

aicfd-grid-indoor-physical, 회귀 모델.

지표 범위
velocity r2 0.53 ~ 0.71
velocity 크기 r2 0.37 ~ 0.73
temperature r2 −1.14 ~ 0.74 (요동. 거의 균일한 필드라 분산이 작다)
velocity 크기 mae 0.029 ~ 0.066 m/s
temperature mae 0.20 ~ 0.90 °C

학습 loss(정규화 공간 L1)는 약 0.076 이다.

배치 크기 독립성#

배치를 어떻게 쪼개든 지표가 같은 값이 나오는지 확인한 것이다. 샘플 단위로 계산하고 샘플 수로 가중 평균하면 분할 방식과 무관해야 한다. 실제로 배치 크기 1·2·3·4·6·12 에서 6개 지표가 소수점 9자리까지 같았다.

반대로 배치 전체를 한 덩어리로 모아 계산하면 배치 크기를 따라 값이 움직인다. 같은 데이터인데도 배치 1 에서 2.01, 배치 12 에서 1.57 로 28% 차이가 났다. 그래서 지표는 샘플 단위로만 계산한다.

WSS 극단값 오염 내성#

WSS 분포를 대표값 하나로 요약할 때 중앙값과 평균·RMS 중 무엇을 믿을 수 있는지 본 것이다. 상위 값을 일부러 오염시켜 놓고 각 통계가 얼마나 흔들리는지 쟀다. 전체 데이터셋 기준이고 대상은 다.

조건 중앙값 RMS
원본 0.006280 0.013983
상위 1개 ×1000 +0.00% +193%
상위 0.1% ×100 +0.00% +1811%

더 세게 밀어도 마찬가지였다. fold 1 에서 면적 질량의 10% 를 100배로 오염시켜도 중앙값은 그대로였고, RMS 는 8113%, 평균은 3646% 움직였다.

그래서 WSS 분포를 요약할 때는 평균이나 RMS 가 아니라 면적가중 중앙값을 쓴다. 형상별 잔여 scale (nondim Remark 7) 과 꼬리 통계가 그 값이다. 변환의 크기 계수는 통계가 아니라 해석 설정값에서 오므로 (nondim — 크기 계수) 이 오염 내성과는 무관하다.

WSS 유속 지수 측정#

WSS 를 유속의 몇 제곱으로 나눠야 하는지 데이터로 확인한 것이다. 같은 형상에서 유속만 바꾼 조합을 모아 면적가중 로그-로그 기울기를 쟀다.

범위 값
전체 평균 1.43 (결정계수 약 0.89)
형상별 1.33 ~ 1.58
면 단위 0.34 ~ 2.42

측정값 1.43 은 Blasius 가 주는 1.5 에 가깝고, 동압 기준인 2.0 은 기각된다. 면 단위 값이 0.34~2.42 로 넓게 퍼진 것은 0 근처에서 국소 기울기가 발산하기 때문이지 지수가 흔들려서가 아니다. 그래서 변환에는 유도값 3/2 를 그대로 쓴다.

마스크 안티에일리어싱#

모델 마스크 값 종류 중간값 화소 비율
aicfd-grid-building-physical 255 0.098%
aicfd-grid-indoor-physical 67 0.048%

마스크 경계의 반투명 화소를 fluid 로 볼지 말지가 통계를 바꾸는지 확인했다. 결론부터 말하면 != 0 으로 하든 == 255 로 하든 통계가 사실상 같다 (indoor 실측):

필드 == 255 != 0
velocity 표준편차 0.1727 0.1726
velocity p99.9 1.4819 1.4816
temperature 표준편차 6.3336 6.3473
temperature p99.9 71.10 71.09

최댓값은 양쪽이 같다. 안티에일리어싱은 값을 0 쪽으로만 당기기 때문에 상단 꼬리를 건드리지 않는다. 어느 기준을 써도 결과가 같으므로, 판정 기준은 코드가 이미 쓰고 있는 쪽으로 두었다.

센서 위치 민감도#

aicfd-grid-indoor-physical 은 조건 입력이 센서 5점뿐이라, 센서를 몇 cm 잘못 달면 그대로 입력 오차가 된다. 그래서 센서를 조금 옮겼을 때 값이 얼마나 달라지는지를 봤다. 표는 각 센서 좌표에서 반경 안의 CFD 온도 표준편차 [°C] 이고, 범위는 저부하~고부하 케이스다.

센서 위치 r=5 cm r=10 cm r=20 cm
S1 대표 책상 앞 0.00~0.03 0.00~0.05 0.00~0.08
S3 대표 의자 반대편 벽 0.02~0.07 0.05~0.14 0.11~0.27
S4 대표 의자 옆 상단 0.04~0.52 0.07~0.89 0.12~1.49
S2 대표 의자 옆 0.04~1.44 0.08~2.47 0.16~3.54
S5 대표 의자 뒤 0.22~1.70 0.54~3.84 1.11~6.04

센서 좌표 (해석 좌표계 기준):

센서 위치 (x, y, z) [m] GPIO
S1 대표 책상 앞 (2.8, 2.8, 1.0) 4
S2 대표 의자 옆 (0.9, 2.8, 1.1) 17
S3 대표 의자 반대편 벽 (0.8, 0.0, 1.0) 27
S4 대표 의자 옆 상단 (0.9, 2.8, 1.6) 22
S5 대표 의자 뒤 (0.1, 2.3, 0.6) 23

S1 과 S3 은 어디에 두어도 거의 같은 값이 나온다. 문제는 S2 와 S5 다. 둘 다 인체와 책상 위 열기둥 안에 있어 온도 기울기가 가파르고, 고부하 조건에서는 센서가 5 cm 어긋나면 온도가 약 1.5 °C 달라진다.

그래서 센서 위치는 2 cm 정밀도로 실측해서 기록한다. 그만큼 고정하기 어려운 현장이라면, 학습할 때 센서 위치를 조금씩 흔드는 증강으로 대응하는 편이 낫다.

센서 좌표를 해석 좌표계에 그대로 써도 되는지도 확인했다. 가구 기준점과 마스크의 높이 분포로 맞춰 보니 8가지 후보 중 항등 변환이 가장 잘 맞았고(기준점 평균거리 0.57 m, 차점 1.07 m), 그 결과 S5 가 창측 낮은 블록 상단보다 1 cm 위에 놓인다. 별도 변환 없이 해석 좌표를 쓴다.