Why does the same sauna feel completely different depending on who's running it?
The answer is in the fluid dynamics.
A zero-dimensional heat balance simulator running entirely in your browser:
- Slide heater power, room humidity, water volume, ventilation — see Humidex and thermal comfort shift instantly
- Charts showing latent, convective, and radiant heat split in real time
- Dependency graphs with sensitivity popovers and governing equations
- Full printable output, English and 日本語 toggle
No login, no install, no waiting. Works offline.
A sauna is a deceptively complex thermal system. An 18 kW heater with non-uniform surface temperatures creates buoyancy-driven stratification: the upper bench sits at 95 °C while the lower bench lingers at 54 °C — in the same room. A bucket of water (löyly) becomes a pulse of latent heat and vapor that travels upward in seconds. A towel wave (Aufguss) disrupts the flow locally, sending wind gusts across your face.
SaunaFlow combines three things:
- Browser demo — understand sauna thermodynamics without code or theory
- Python harness — declarative YAML case definitions that generate reproducible OpenFOAM simulations
- CFD pipeline — computes sauna-specific KPIs (stratification, löyly peaks, wind speed, thermal stress) with full experimental validation roadmap
Whether you're a sauna enthusiast curious about why one löyly session feels different from the next, or a thermal engineer modeling building HVAC — this is the tool.
13 parametric cases run on Finnish-style sauna geometry with buoyantPimpleFoam:
| Case | Heater | Upper bench | Lower bench | Target range |
|---|---|---|---|---|
| L-1 | 13 kW | 95 °C | 54 °C | 80–100 / 40–60 °C ✅ |
| K-1 | 18 kW | 102 °C | 61 °C | — |
| K-2 | 18 kW + vent | 88 °C | 49 °C | — |
| K-3 | 18 kW + löyly | peak +12 °C | peak +7 °C | — |
Key finding: buoyantPimpleFoam is essential. simpleFoam fails to converge for buoyancy-dominated flows even at 50,000 iterations — the pressure-velocity coupling cannot resolve the density-driven feedback loop.
| Phenomenon | Model |
|---|---|
| Buoyancy-driven stratification | Boussinesq approximation, k-ε turbulence |
| Heater radiation | View factor (surface-to-surface) |
| Löyly steam | Transient vapor volume source with latent heat |
| Aufguss airflow | Momentum source (towel wave), local convective enhancement |
| Skin heat transfer | 0D: convection + radiation + evaporative (sweating) |
configs/cases/dry_sauna_steady.yaml ← declarative input
│
▼
case_builder.py ← expands YAML → OpenFOAM directory
│
▼
solver_runner.py ← runs buoyantPimpleFoam (local or WSL2)
│
▼
probe_parser.py ← reads time-series probe output
│
▼
kpi.py ← K-01 … K-07
│
▼
reporting.py ← Markdown + HTML report
Swap a YAML file, re-run — identical inputs produce identical results.
| ID | Metric |
|---|---|
| K-01 | Steady-state temperature differential (upper / lower bench) |
| K-02 | Post-löyly peak temperature |
| K-03 | Post-löyly peak humidity |
| K-04 | Steam peak arrival time |
| K-05 | Face-level wind speed peak (Aufguss) |
| K-06 | Simplified thermal stress index |
| K-07 | Upper / lower relative temperature difference |
Prerequisites: Python 3.11+, OpenFOAM v2312 (Ubuntu native or WSL2)
git clone https://github.com/Taguchi-1989/SAUNAFEM.git
cd SAUNAFEM
pip install -e .Build and run a case:
# 1. Expand YAML → OpenFOAM directory structure
PYTHONPATH=src python -m harness.cli build configs/cases/dry_sauna_steady.yaml
# 2. Run solver (WSL2)
wsl -- /usr/bin/openfoam2312 bash scripts/run_openfoam_wsl.sh
# 3. Generate report
PYTHONPATH=src python -m harness.cli report results/dry_sauna_steady/
# 4. Run tests
pytest tests/ -x -q29 YAML-defined cases across:
- Heater power: 8–18 kW
- Löyly water: 0.1–0.5 L per throw
- Ventilation: none / natural / forced
- Wall material: spruce / cedar, 45–90 mm
- Occupancy: empty / 2-person
src/harness/ Python orchestration — CLI, case builder, solver runner, KPI, reporting
configs/cases/ 29 YAML case definitions
foam_templates/ OpenFOAM base case templates (generated, never hand-edited)
tools/ Standalone HTML calculators (no server required)
experiments/ Sensor data — raw CSV + processed (Phase 4)
firmware/ Sensor firmware for the experimental rig
docs/ Governing equations (PDF/TeX), parametric study reports, field notes
| Phase | Description | Status |
|---|---|---|
| 0 | Repo, schema, CLI | ✅ |
| 1 | Dry sauna steady-state CFD | ✅ |
| 2 | Löyly transient | ✅ |
| 3 | Aufguss momentum source | 🔄 |
| 4 | Experimental sensor validation | 📋 |
| 5 | Automated batch comparison | 📋 |
Issues and PRs are welcome. This is likely the only public repository combining OpenFOAM with sauna-specific thermal modeling. If you're working on thermal comfort in small enclosures, transient buoyancy-driven flows, building physics / HVAC with OpenFOAM, or sauna design and research — you're in the right place.
SaunaFlow は、サウナ熱環境を物理シミュレーションで解析するオープンソースプロジェクトです。
スライダーを動かすだけで、熱指標・熱収支・感度グラフが即座に更新されます。インストール不要、オフライン対応。
「同じサウナなのに、誰が管理するかで体感が全然違う」という疑問が出発点です。温度計の数値だけでは説明できない — ロウリュの蒸気がどう広がるか、上下の温度成層がどう形成されるか、Aufgussの風がどう熱流束を変えるか。これを流体力学で定量化することが目的です。
| ツール | |
|---|---|
| ブラウザでいますぐ | ロウリュシミュレータ — インストール不要、オフライン対応 |
| OpenFOAMでCFD計算 | YAMLで条件定義 → 自動でOpenFOAMケース生成 → ソルバー実行 → KPI自動計算 |
| パラメトリックスタディ | ヒーター出力・ロウリュ水量・換気・壁材の組み合わせを29ケース実施済み |
- 上段95°C / 下段54°C の温度成層を13kWヒーターで再現(実測目標値内 ✅)
buoyantPimpleFoamが浮力主導流れに必須。simpleFoamは5万イテレーションでも収束しない- ヒーター壁温の感度は低い(473→673K で気温差 <1°C)
- 換気の境界条件設定が結果に大きく影響する
Issueで質問・提案を歓迎します。サウナ設計、建築熱環境、OpenFOAM活用に興味のある方はぜひ。
Apache License 2.0 — Copyright 2026 ZEAL-BOOT-CAMP