현실의 일기예보는 관측에서 시작합니다. 관측소와 레이더와 위성이 지금의 대기를 재고, 그 값을 방정식에 넣어 미래를 풉니다. BLOCK에는 관측소가 없습니다. 그래서 BLOCK의 날씨는 재는 것이 아니라 만드는 것입니다. 무엇을 만들고 무엇을 만들지 않는지가 이 보고서의 내용입니다.
관측하지 않는 날씨
BLOCK 날씨 모델의 공식 이름은 atlas-procedural-v6입니다. Atlas가 월드에서 읽어낸 공간 근거와 절대시각, 시드, 광역 forcing을 입력받아 256블록 셀마다 날씨 상태를 계산하는 결정론적 규칙 기반 시뮬레이션입니다.
이름에 붙은 세 가지를 분명히 해 둡니다. 학습 모델이 아닙니다. 가중치도 체크포인트도 없고 사람이 정한 계수와 생물군계 프로파일만 씁니다. 수치예보가 아닙니다. 대기의 유체역학과 열역학을 적분하지 않습니다. 관측 동화 모델이 아닙니다. 관측소도 레이더도 외부 API도 쓰지 않습니다.
Atlas 환경 근거 + 절대시각 + seed + 광역 forcing → 규칙 적용 → 256블록 셀별 날씨 상태
결과는 절대시각의 순수 함수입니다. 같은 시각을 넣으면 언제 계산하든 같은 값이 나옵니다. 그래서 과거를 재구성하는 식과 미래를 미리 만드는 식이 같습니다. 지난주 날씨를 다시 그리는 것과 다음 주 날씨를 미리 만드는 것이 모델 입장에서는 구분되지 않습니다.
날씨를 만드는 방법
모델은 두 층으로 나뉩니다. 위에는 월드 전체에 공통으로 걸리는 광역 forcing이 있습니다. 기온, 상대습도, 기압, 동서·남북 바람, 이류 오프셋, 구름과 비, 일조 위상입니다. 아래에는 Atlas가 셀마다 준 정적 근거가 있습니다. 고도와 경사, 물·나무·농경·식생·인공·맨땅의 비율, 그리고 커버리지입니다.
광역 forcing이 "오늘 이 월드는 대체로 이렇다"를 정하면, 셀마다의 근거가 "여기서는 그게 이렇게 나타난다"로 바꿉니다. 호숫가와 산등성이가 같은 forcing에서 다른 값을 갖는 이유입니다.
데이터 분석 파이프라인
환경 근거에서 3시간 도시 예보까지
정적 환경과 시간 forcing을 분리해 같은 셀 근거를 여러 시각에 재사용합니다. 품질 검사를 통과한 완전한 frame만 공개 릴리스가 될 수 있습니다.
- 01 환경 고정 Atlas의 고도·경사·피복·생물군계와 셀 커버리지를 immutable run으로 읽습니다.
- 02 시간 forcing KST 계절·일주기와 600초 tick, 광역 기온·습도·기압·바람을 만듭니다.
- 03 이류·공간장 고정 seed의 구름 texture와 이동하는 종관 고·저기압장을 셀 좌표에 놓습니다.
- 04 셀 계산 지형 상승·하강, 수변, 피복과 거칠기로 기온·습도·바람·강수를 병렬 계산합니다.
- 05 품질 게이트 범위·유한값·격자 일치·결정성을 검사하고 모든 실수를 소수 6자리로 고정합니다.
- 06 릴리스·집계 3시간 frame을 저장하고 공개 격자와 행정경계별 도시 예보를 같은 run에서 만듭니다.
| 공간 해상도 | 256×256 블록 / 셀 |
|---|---|
| 계산 tick | 600초 |
| 저장 단위 | 10,800초 (3시간) 권위 frame |
| 기본 seed | 20260710 |
| 계절·일주기 기준 | KST (UTC+9) |
| 저장 시각 | UTC / Unix seconds |
내부적으로는 600초마다 계산하지만 저장하고 공개하는 것은 3시간 간격의 frame입니다. 이 3시간이 지도 애니메이션과 도시 예보의 기본 단위가 됩니다.
셀 단위 계산식
먼저 셀 좌표를 128블록 기준 좌표로 바꾸고 누적 이류 오프셋을 뺍니다. 그래서 128블록과 256블록 격자에서도 기상 패턴의 물리적 폭이 유지됩니다. 바람 방향과 지형 경사의 내적이 양수면 상승류, 음수면 풍하측 하강류로 나눕니다.
x_adv = cell_x * (grid_size / 128) - advection_east
n_adv = -cell_z * (grid_size / 128) - advection_north
along_wind_slope = gradient_x * dir_east - gradient_z * dir_north
uplift = clamp01(max(along_wind_slope, 0) / 0.15) * clamp01(wind_speed)
lee = clamp01(max(-along_wind_slope, 0) / 0.15) * clamp01(wind_speed)
temperature = base_T + biome_T - lapse * (elevation - reference_elevation)
+ (1.8 + 1.7 * day) * built - 2.2 * day * tree
- 2.0 * daylight_phase * nearby_water + 1.5 * lee
- 2.4 * synoptic + 1.1 * temperature_noise
상대습도는 값을 0과 1 사이에서 단순히 잘라 포화 셀이 쌓이지 않도록, 양의 변화에는 남은 여유 1-base를 쓰고 음의 변화에는 현재 값 base를 씁니다. 구름과 강수는 이 습도, 종관장, 생물군계와 지형 상승을 sigmoid로 결합합니다.
moisture = 0.38*water + 0.16*tree + 0.09*agriculture + 0.05*low_vegetation
+ 0.05*vegetation_bias - 0.14*built - 0.06*bare
humidity_delta = biome_RH + moisture - 0.10*lee + 0.15*synoptic
+ 0.07*cloud_noise + 0.012*((base_T + biome_T) - temperature)
bounded_shift(base, d) = base + (1-base)*clamp01(d) if d >= 0
else base*(1 + clamp(d, -1, 0))
RH = max(0.02, bounded_shift(base_RH, humidity_delta))
roughness = clamp(0.55*tree + 0.65*built + 0.18*low_vegetation
+ 0.12*agriculture, 0, 0.85)
local_wind = incident_wind * (1 - 0.55*roughness)
local_cloud_forcing = bounded_shift(cloud_forcing, 0.55*synoptic)
local_rain_forcing = bounded_shift(rain_forcing, 0.52*synoptic)
condensation = smoothstep(0.68, 0.95, RH)
cloud = sigmoid(3 * (-1.25 + 1.15*RH + 0.80*local_cloud_forcing
+ 0.35*noise + 0.85*uplift - 0.35*lee + 0.25*rain_bias))
rain_score = cloud*(0.55*condensation + 0.35*local_rain_forcing + 0.45*uplift
- 0.20*lee + 0.18*rain_bias + 0.12*max(noise, 0)) - 0.32
precipitation_probability = sigmoid(6 * rain_score)
precipitation_intensity = clamp01(rain_score / 0.68); values < 0.05 become 0
pressure = (base_pressure - 9*synoptic) * exp(-elevation / 8434.5)
confidence = clamp01(0.15 + 0.85*sqrt(surface_coverage*biome_coverage))
강도가 0이면 강수 없음, 기온이 0°C 이하면 눈, 0~2°C면 진눈깨비, 2°C 이상이면 비로 분류합니다. 이 임계값과 모든 계수는 학습값이 아니라 버전에 고정된 규칙입니다. 계수를 바꾸면 같은 입력을 v5와 v6에 나란히 넣는 방식으로 효과를 다시 검증합니다.
내부적으로는 600초마다 계산하고, 3시간마다 한 프레임을 확정해 공개합니다.
v6는 무엇을 고쳤는가
이전 버전 v5에는 알려진 문제가 있었습니다. 비가 너무 자주, 너무 넓게 왔습니다. 습도는 쉽게 포화되고, 강수 면적에는 사실상 바닥이 있어서 맑은 날이 나오지 않았습니다.
v6를 검증한 방식은 짝지은 재생입니다. 같은 시각, 같은 환경 스캔, 같은 시드, 같은 생물군계 프로파일, 같은 forcing 계열을 두 모델에 동일하게 넣고 504개 frame을 나란히 돌렸습니다. 대상은 66,719개 셀, 기간은 2026년 6월 1일부터 8월 2일까지입니다. 이 셀은 날씨 모델이 만든 것이 아니라 Atlas의 환경 스캔이 덮은 범위를 그대로 쓴 것입니다. 두 모델의 forcing 차이는 부동소수점 오차 수준(최대 3.55e-15)이고 tick은 정수까지 일치합니다. 즉 모델 규칙 말고는 아무것도 다르지 않은 비교입니다.
짝지은 재생
v5와 v6의 frame별 강수 셀 면적 분포
각 값은 한 frame에서 강수가 있는 셀이 전체 66,719개 셀에서 차지하는 비율입니다. 모든 막대는 0%에서 시작합니다.
평균
중앙값
최소
상위 5% 지점
| 지표 | v5 | v6 |
|---|---|---|
| 평균 강수 셀 면적 | 72.36% | 56.71% |
| 중앙값 강수 셀 면적 | 74.65% | 57.86% |
| 최소 강수 셀 면적 | 30.55% | 5.17% |
| 상위 5% 강수 셀 면적 | 94.25% | 95.27% |
| 비가 90% 이상인 frame | 85 / 504 | 94 / 504 |
| 비가 10% 이하인 frame | 0 / 504 | 8 / 504 |
| 3시간 연속성 (lag-1 상관) | 0.930 | 0.921 |
| 3시간 변화폭 상위 5% | 10.67%p | 21.76%p |
읽는 순서가 중요합니다. 평균 강수 면적이 72.36%에서 56.71%로 내려간 것은 "비가 덜 온다"가 아니라 비가 오는 범위가 더 선택적이 됐다는 뜻입니다. 결정적인 숫자는 최소값입니다. v5에서는 가장 맑은 frame조차 월드의 30.55%에 비가 왔습니다. v6에서는 5.17%까지 내려갑니다. 맑은 날이 돌아왔습니다. 비가 10% 이하인 frame이 0개에서 8개가 된 것도 같은 이야기입니다.
반대로 강한 비는 그대로입니다. 상위 5% 면적은 94.25%에서 95.27%로 오히려 조금 올랐고, 비가 90% 이상 덮는 frame은 85개에서 94개로 늘었습니다. 장마 같은 장면을 잃지 않으면서 건조한 구간을 되찾은 셈입니다.
운영 스냅샷
2026년 7월 16일 기준으로 저장된 운영 감사 결과입니다. 게시된 run은 #19이고 모델 버전은 atlas-procedural-v6입니다.
| frame 수 | 요청 113 / 생성 113 |
|---|---|
| frame당 셀 | 66,719 (Atlas 환경 스캔 범위) |
| 생성된 셀 상태 | 7,539,247 |
| 기간 | 2026-07-09 ~ 2026-07-23 KST |
| 3시간 간격 위반 | 0건 |
| 습도 포화 셀 | 0 |
| 강수 강도 상한 셀 | 692 (0.0092%) |
113개 frame × 66,719개 셀 = 7,539,247개 상태가 빠짐없이 생성됐고, 3시간 간격을 어긴 frame은 하나도 없습니다. v5에서 문제였던 습도 포화 셀은 0개입니다. 강수 강도가 상한에 닿은 셀은 692개로 전체의 0.01%에 못 미칩니다.
한계와 사용 범위
가장 큰 한계를 먼저 적습니다. 이 모델의 현실 예보 정확도는 측정된 적이 없습니다. 비교할 관측소도 레이더도 없기 때문입니다. 그래서 이 보고서에 나오는 모든 숫자는 모델과 모델을 비교한 값이거나 모델 내부의 일관성입니다. "얼마나 맞았는가"에 대한 답은 이 문서에 없습니다.
단위에 대한 주의도 필요합니다.
- 강수 강도는 mm/h가 아닙니다. 물리적으로 교정된 값이 아닙니다.
- 바람은 m/s가 아닙니다. 화면 표시용 상대값입니다.
- 기압은 정식 해면기압(MSLP)이 아닙니다.
비교할 때도 조건이 있습니다.
- v5와 v6 비교는 내부 합성 시나리오에서만 성립합니다. 현실 기후의 건조·습윤 특성을 재현했다는 뜻이 아닙니다.
- 처리 속도는 저장된 기록이며 하드웨어 정보가 함께 기록되어 있지 않아 일반적인 성능 기준으로 인용할 수 없습니다.
- 날씨는 Atlas 환경 근거를 그대로 물려받습니다. Atlas의 한계는 그대로 날씨의 한계입니다. 환경 스캔이 바뀌면 날씨도 다시 계산해야 합니다.
쓸 수 있는 것 → 세계관용 합성 날씨, 지도 애니메이션, 결정론적 과거 재구성·사전 생성, 버전 간 비교
쓸 수 없는 것 → 현실 예보, mm/h·m/s·MSLP, 재난·안전·농업·전력 판단
앞으로의 과제는 분명합니다. 현실 정확도를 주장하려면 비교할 기준셋이 있어야 하고, 지금은 없습니다. 그때까지 이 모델은 일관되게 그럴듯한 날씨를 만드는 도구이지 맞히는 도구가 아닙니다.