Калибровка модели воздуха по схеме Professor (AM-09)
Задача AM-09 плана docs/plan/air_model.md (метод — WF-16 в docs/archive/plan/wind-field.md). Модель — docs/guide/air-model.md, эталон масштаба 1 — tools/research/air3d/ (air.py, reference.md). Скрипты, данные прогонов и картинки — tools/research/tune/, воспроизведение описано в конце документа.
Коротко
- Подгоняли один параметр модели: λ/h (
Params.lam_frac), асимптотическую длину перемешивания у рельефа как долю толщины слоя. Шероховатость z0 холма Askervein подгоняли как мешающий параметр с априорной погрешностью. Остальные параметры либо зафиксированы по литературе (список ниже), либо данными не определены: пороги признака отрыва масштаба 3, поток тепла H0, τ выхолаживания. - Масштаб 1 (Askervein, 39 наблюдаемых): λ/h = 0,25 (−0,015), это верхняя граница физичного диапазона; z0 = 0,034 ± 0,011 м. χ²/ndf = 86,2/38 (p = 1·10⁻⁵); при прежнем значении λ/h = 0,1 было 103,5. Данные тянут λ/h и дальше: без ограничения χ² падает ещё на 10, до края прогонов 0,6. Мы считаем это сигналом того, что модель не дотягивает, и не крутим параметр дальше.
- Масштаб 3 (ТКЭ на мачтах Askervein, 13 наблюдаемых): пороги отрыва данными не определены, χ² одинаков в диапазоне 0…0,5. χ² = 141/13, и почти весь он набирается на наветренном склоне и вершине: там модель даёт ТКЭ в 1,5–4 раза выше измеренного. Это граница модели.
- Проверки масштабов 2–3 по литературе (без параметров): густота термиков N_L·z_i/L = 1,39 и 1,50 против 1,2 ± 0,36; наклон спектра болтанки от −1,58 до −2,00 против −5/3. χ² = 5,4 на 6 наблюдаемых.
- Внесено в код:
lam_frac= 0,25 вair.py(Params) и в GPU-решателеair_case.gd. Вconfigs/atmosphere.jsonзначения не менялись, в_docпорогов и коэффициентов масштаба 3 добавлены итоги AM-09. Контракты не менялись. - Цена: на сетках игры в окне 50 м нужно до +40 % итераций, в окне 100 м и в области 400 м — 0–20 %. Ветер на 50 м над стартом вырос на 1–3 %.
Правила (решения пользователя) и как они выполнены
| Правило | Как выполнено |
|---|---|
| Слова пилота в подгонку не входят | Их нет в χ². Сравнение со словами пилота сделано после калибровки: docs/guide/air-model.md → «Слова пилота против модели после калибровки» |
| Подгонка только по количественным данным | Использованы измерения Askervein (Zenodo 4095052, погрешности из данных), подобие конвективного слоя (Lenschow & Stephens 1980) и закон −5/3 |
| Систематика сетки | Модель сравнивается с решением на сетке 12,5 м + 2-й порядок; оставшаяся ошибка сетки и области вошла в σ (раздел «Систематика») |
| Подгоняются только неизвестные параметры | Подогнан 1 параметр (λ/h) и 1 мешающий (z0 холма). Фиксированные параметры — со ссылками |
| c_s Смагоринского — одно стандартное значение | Выбрано 0,25 (обоснование ниже), на Askervein значение почти не влияет |
| Одинаковые определения наблюдаемых | Разгон берётся к опорной мачте на той же высоте над землёй, ТКЭ — к ТКЭ опорной мачты, густота термиков — число пересечений линии всеми ядрами (как у Lenschow & Stephens). «Шаг сильных термиков» модель тем же определением посчитать не может, поэтому он записан в «Границы модели» |
| Параметров заметно меньше наблюдаемых | 2 параметра на 59 наблюдаемых (39 + 13 + 6 + априорный член z0) |
Метод
Метод Professor, WF-16:
- Сетка прогонов эталона
air.pyпо пространству (λ/h, z0): 35 точек полной сетки 7 × 5 и 25 точек латинского гиперкуба в логарифмах, плюс 7 точек за физичной границей (λ/h 0,33–0,6). Всего 67 прогонов Askervein на сетке 25 м со 2-м порядком переноса, в области 4 км с потолком 1000 м; каждый прогон занимает 4–30 с. - Каждая наблюдаемая аппроксимируется полиномом степени 3 по (ln λ/h, ln z0). Ошибка полинома оценивалась выбросом-одним (LOO): не больше 0,002 в единицах разгона, она вошла в σ.
- Поправка сетки считается как разность между прогонами 12,5 м и 25 м (оба со 2-м порядком), 5 прогонов по 1–7 мин в разных точках пространства параметров. Поправка на область — разность между областью 8 км с потолком 1500 м (как в AM-01) и 4 км, 3 прогона.
- Минимум χ² искали в iminuit (MIGRAD, HESSE, MINOS), λ/h ограничен физичным диапазоном. Дальше строились профиль χ²(λ/h), подгонки по частям данных (проверка напряжения), eigentunes и проверка сходимости по числу прогонов (15–67) и степени полинома (2–4).
- Масштаб 3 проверялся на поле Askervein из эталона в формате игры. Проба
turb_askervein.gdвызывает те же функции, что атмосфера игры (WindField.turb_at,FieldTurbulence), и перебирает 126 сочетаний порогов отрыва. Модель здесь дешёвая, поэтому χ² считался прямым перебором, без полиномов.
Параметры
Подогнанные
| Параметр | Было (AM-01) | AM-09 | Физичный диапазон | Данные |
|---|---|---|---|---|
λ/h, Params.lam_frac (λ = max(40 м, λ/h·h)) | 0,1 | 0,25 −0,015 (MINOS; упор в границу) | 0,03–0,25: Блэкадар (1962) λ = 0,00027 G/f ≈ 0,02–0,03 h; Mellor & Yamada (1982) l₀ ≈ 0,1 масштаба ТКЭ; 0,25 — с запасом | Askervein, 39 наблюдаемых |
| z0 холма Askervein (мешающий, в игре не используется) | 0,03 | 0,034 ± 0,011 м | априорно 0,03 м × 1,5^(±1) (Taylor & Teunissen 1987) | те же |
Корреляция λ/h–z0 равна 0 (ρ = −0,00).
Eigentunes. Направления ковариации в пространстве (ln λ/h, ln z0) совпадают с осями:
- ln z0 ± 0,34 (z0 = 0,025…0,048 м), Δχ² = +1,0;
- λ/h упирается в границу, поэтому погрешность односторонняя: по профилю Δχ² = 1 это 0,235…0,25.
Оба направления определены данными, а вырождения нет.
Фиксированные (стандартные значения со ссылкой, не подгонялись)
| Масштаб | Параметр | Значение | Источник / обоснование |
|---|---|---|---|
| 1 | κ | 0,4 | Högström (1996): 0,40 ± 0,01 |
| 1 | c_s Смагоринского (гориз.), cs_h | 0,25 | Режим мезомасштабный: клетка 50–400 м намного больше длины перемешивания у земли, горизонтальная подсеточная диффузия описывает деформацию среднего поля, а не вихри инерционного интервала. Для этого режима стандарт — WRF km_opt = 4 (2D-деформация), c_s = 0,25 (Skamarock et al. 2019, NCAR/TN-556). Значение Лилли 0,17 выведено для LES, где клетка лежит внутри инерционного интервала, и к нашим клеткам не относится. На Askervein значения 0 / 0,17 / 0,25 меняют разгон не больше чем на 0,01 |
| 1 | K-профиль, w_m, 7κ, 5 z/L | как в эталоне | Troen & Mahrt (1986), Holtslag & Boville (1993) |
| 1 | F(Ri) = (1 + 5Ri)⁻², √(1 − 16Ri) | как в эталоне | Louis (1979), Businger–Dyer |
| 1 | Pr_t | 1 | Stull (1988) гл. 6; нейтральные данные его не ограничивают |
| 1 | h нейтр. = 0,3 u*/f; 0,4 √(u* L/f) | как в эталоне | Garratt (1992); Zilitinkevich (1972) |
| 1 | λ (нижний порог) | 40 м | Блэкадар / HB93 (30 м). При λ/h = 0,25 и h ≥ 300 м порог не срабатывает |
| 1 | k_fa, губки, псевдошаги, критерий | как в эталоне | численные параметры, не физика |
| 2 | r₂(ζ), n_A = 0,6/(z_l r₂(½)), сила 1,24 w*, b = 6,5, 0,28 | AM-07б | Allen (2006) по Lenschow & Stephens (1980); Holtslag & Boville (1993) |
| 3 | σ_w/u* = 1,25; анизотропия и масштабы MIL-HDBK-1797 | AM-08 | Panofsky & Dutton (1984); MIL-HDBK-1797 |
| 3 | σ_w/w* (1,8; 0,8), σ_u/w* = 0,6, 0,22 z_i | AM-08 | Lenschow et al. (1980); Kaimal et al. (1976) |
| 3 | (1 − z/h)^¾; 0,18 / 0,14 ΔU; 0,25 U_out; 0,5 превышения | AM-08 | Nieuwstadt (1984); Bell & Mehta (1990); Ishihara et al. (1999); Castro & Haque (1987) |
Неизвестные, но данными не определённые (оставлены прежними)
| Параметр | Значение | Почему не подогнан |
|---|---|---|
Пороги отрыва lee.field_deficit_attached / _separated / field_descent_slope | 0,3 / 0,7 / 0,05 | По ТКЭ Askervein χ² плоский: 141,3 при ex₀ = 0…0,5, 144 выше 0,55; ширина и наклон меняют его не больше чем на 0,2. На подветренных мачтах признак отрыва равен 1 при любых порогах из диапазона |
H0, явный поток при нормальном падении («доля нагрева луга»), weather.py/air_place.gd | 330 Вт/м² | Единственные количественные данные о силе термиков в нашем климате — наборы парапланов во Франции (Hernández-Aguayo et al. 2026): подъём 2,1–2,5 м/с с разбросом климата около 25 %. Поскольку w* ∝ H0^⅓, погрешность H0 выходит около ±75 %, то есть H0 не определён. Классов поверхности в поле нет |
| τ выхолаживания θ′ | 7200 с | Нет наблюдаемой в наборе, чувствительной к τ |
Наблюдаемые и эталоны
Масштаб 1: Askervein (Taylor & Teunissen 1985/1987; данные — Zenodo 4095052, CC BY 4.0)
Ветер 210°, нейтрально, U10 на опорной мачте RS 8,9 м/с. Разгон ΔS = S(точка, z)/S(RS, z) − 1 на той же высоте над землёй, одинаково в модели и в данных.
- 36 точек на 10 м вдоль линий A, AA, B. Повторы в одной точке усреднены. σ — полуширина FSRmin/FSRmax из данных (0,004–0,12, обычно 0,04–0,07).
- Профиль на вершине HT: 15, 24, 34 м (чашки AES к чашкам RS на той же высоте), σ = 0,05 (назначено). Высоты 3/5/8 м исключены: они ниже 1,5 Δz сетки 12,5 м (9,4 м), и значение там берётся из первой клетки.
- Соседние точки коррелированы, поэтому действительное число степеней свободы меньше 38.
Масштаб 3: ТКЭ на мачтах Askervein
ТКЭ / ТКЭ(RS, 10 м) по трёхкомпонентным Gill UVW: линия A (ASW85…ANE40, 9 точек), AASW10, CP на 5/10/16 м. Отношение к опорной мачте снимает общую недооценку дисперсии прибором. σ = 15 % отношения (назначено: статистика 3-часового ряда и отклик прибора в следе). В модели ТКЭ = ½(2σ_u² + σ_w²) (шум u и v — σ_u, как у атмосферы), признак отрыва и слой смешения — как у атмосферы (turb_askervein.gd).
Масштабы 2 и 3: подобие из литературы (проверка, без параметров)
- Термики: N_L·z_i/L на 0,4 z_i = 1,2 ± 0,36 (Lenschow & Stephens 1980, все ядра по порогу влажности, самолёт; Allen 2006 ур. 19; σ 30 %, назначено). В модели это живые ядра на площадь (стат. пробы AM-07б,
tools/research/air_thermals/out/stats.json, область 400 м, 12:00 и 15:00) × поперечник ядра на 0,4 z_l × z_l. Для случайных дисков число пересечений линии равно n·d. - Болтанка: наклон спектра в инерционном интервале −5/3 ± 0,1 (Колмогоров; разброс измеренных наклонов — Kaimal et al. 1972). Модель — AM-08, u и w на 150 и 400 м.
- Не вошло: «шаг сильных термиков 1–1,5 z_i» (масштаб конвективных ячеек, Lenschow & Stephens 1980; Stull 1988). Тем же определением в модели его не посчитать: все ядра одной силы (доля w*), порога «сильный» нет. Густота ядер по Аллену (соседнее ~400 м) описывает другую величину: все ядра, а не сильные. Записано в «Границы модели».
Систематика сетки: выбор и обоснование
Выбрано сравнение с решением на сетке 12,5 м + 2-й порядок, а не надбавка 15–20 % к решению 50 м / 1-й порядок.
- На Askervein ошибка решения 50 м / 1-й порядок на вершине — не 15–20 %, а около 65 % (0,28–0,48 против 0,88; это зависит от области). Цифра 15–20 % получена на Каянче относительно решения 25 м / 2-й порядок, которое само ещё не сошлось. Надбавка 15–20 % дала бы подгонке компенсировать численную ошибку физическим параметром. Именно этого правило и запрещает.
- 12,5 м тоже не предел. От 25 к 12,5 м (2-й порядок) разгон у вершины на 10 м растёт на 0,17 (0,44 → 0,61), а шаги сгущения не убывают. Поэтому остаток ошибки 12,5 м оценён величиной последнего шага: σ_сетки = |y₁₂.₅ − y₂₅| ⊕ разброс по параметрам. Это до 0,24 в единицах разгона у гребня и в следе и 0,01–0,05 на пологом наветренном склоне. Для сходимости порядка ≥ 1 такая оценка консервативна.
- Проверка: если вместо этого считать поправку сетки одним общим множителем с априорным N(1, 1), данные требуют множитель 2,15 ± 0,05 (то есть разгон больше, чем даже у решения 12,5 м), а χ² вырастает до 572. Значит, остаток ошибки сетки не описывается одним множителем: его картина по точкам разная. Основной вариант (независимо по точкам) честнее. λ/h в обоих вариантах упирается в 0,25.
- Область: прогоны шли в области 4 км с потолком 1000 м (иначе 12,5 м не помещается), что завышает разгон на 0,01–0,09. Поправка к области 8 км с потолком 1500 м взята по 3 прогонам на 25 м, σ — половина поправки.
Результат
Масштаб 1
| χ² | n | λ/h | |
|---|---|---|---|
| все 39, λ/h ≤ 0,25 | 86,2 (ndf 38) | 39 + априорный z0 | 0,25 −0,015 |
| прежнее λ/h = 0,1, z0 = 0,03 | 103,5 | ||
| без ограничения λ/h | 76,4 | 0,60 (край прогонов) |
Вклад по группам (при λ/h = 0,25):
| Группа | n | χ² |
|---|---|---|
| наветренная сторона (ASW, AASW) | 12 | 8,9 |
| вершина и гребень (HT, CP, профиль HT, BNW10, BSE10/20) | 8 | 19,0 |
| подветренная сторона (ANE, AANE) | 8 | 29,5 |
| линия B вдоль гребня | 11 | 28,7 |
Наибольшие вклады: AANE10 17,2 (модель 0,19 против 0,68), BSE50 10,4, BSE20 8,8, ANE10 7,6. Модель занижает разгон у гребня и за ним. Сразу за вершиной модель начинает торможение, а измерения там ещё показывают разгон.
Напряжение (подгонки по частям): наветренная сторона сама по себе даёт λ/h = 0,19 ± 0,19, то есть параметр не определён и совместим с 0,1. Все остальные части — вершина, гребень, линия B, подветренная сторона — упираются в 0,25. Сильное перемешивание модели нужно, чтобы поднять разгон у гребня и ослабить след, а физичного значения на это не хватает. Это сигнал WF-16: модель структурно не дотягивает у гребня и за ним на сетке ≥ 12,5 м. Возможные причины: K-замыкание первого порядка, стационарное среднее поле и неразрешённый внутренний слой. Крутить параметр дальше мы не стали.
Сходимость (out/fig_s1_convergence.png): при 15–67 прогонах и степенях 2–4 предпочтение данных держится: χ²(0,1) − χ²_мин = 15,8–18,3 с разбросом подвыборок ≤ 2,1, z0 = 0,033–0,035, χ²_мин = 85,6–87,9. Полином степени 3 воспроизводит прогоны с точностью не хуже 0,002 (LOO).
Повторный прогон с найденными параметрами (Askervein, 12,5 м, 2-й порядок, λ/h = 0,25, z0 = 0,042, 1831 итерация за 10 мин; out/repro.json). Суррогат совпал с прогоном: СКО 0,003, максимум 0,008. Против измерений χ² = 85,2 на 39 точках: 21 точка в пределах 1σ, 33 — в пределах 2σ. При прежнем λ/h = 0,1 было 104,3, 19 и 32. На вершине HT (10 м) модель даёт 0,59 против измеренных 0,88 ± 0,07: разница лежит в пределах σ сетки (0,17), но центральное значение ниже. Эталоны воспроизводятся в пределах погрешностей, кроме точек сразу за гребнем (AANE10, ANE10) и части линии B.
Картинки: out/fig_s1_askervein.png (данные и модель по точкам), out/fig_s1_profile.png (профиль χ²(λ/h)), out/fig_s1_convergence.png.
Масштаб 3
| Группа | n | χ² (пороги AM-08) |
|---|---|---|
| наветренная сторона | 6 | 119,3 |
| вершина (HT, CP 5/10/16 м) | 4 | 19,4 |
| подветренная сторона (ANE10/20/40) | 3 | 2,7 |
| всего | 13 | 141,4 |
Измеренная ТКЭ на наветренном склоне и вершине почти такая же, как на равнине: 0,8–1,1 от RS. Модель считает σ по местной u* и сдвигу, поэтому там ТКЭ получается в 1,4–4 раза больше: на вершине 4,2 (поле 12,5 м) и 1,8 (поле 50 м, как в игре). Над вершиной холма турбулентность не следует за разгоном среднего ветра (быстрое искажение, Britter, Hunt & Richards 1981). Модель такого закона не содержит, это граница модели. Кроме того, на ступеньках маски сдвиг у земли завышен; на поле 12,5 м это даёт выбросы до 7 от RS (CP 5 м, ANE10). За гребнем модель даёт 2,1–6,7 против 1,5–3,3 в данных, но σ сетки там 1,2–4, поэтому χ² = 2,7 на 3 точки. Абсолютная ТКЭ на RS: модель 2,66 м²/с², данные 1,46 (Gill занижает дисперсию; в χ² идут только отношения).
Картинка: out/fig_s3_tke.png.
Масштабы 2–3: проверки
| Наблюдаемая | Модель | Данные | χ² |
|---|---|---|---|
| N_L·z_i/L на 0,4 z_i, 12:00 | 1,39 ± 0,13 | 1,2 ± 0,36 | 0,25 |
| то же, 15:00 | 1,50 ± 0,12 | 1,2 ± 0,36 | 0,63 |
| наклон спектра u / w, 150 м | −1,58 / −1,70 | −5/3 ± 0,1 | 0,53 / 0,06 |
| наклон спектра u / w, 400 м | −2,00 / −1,68 | −5/3 ± 0,1 | 3,94 / 0,01 |
Густота термиков посчитана по полям с λ/h = 0,1 (проба термиков идёт около часа и не повторялась). На ветру 3–6 м/с λ/h меняет подъём у старта не больше чем на 3 % (out/cost_check.json), в штиль 12:00 — на −10 %.
Сводный χ²
| Блок | χ² | наблюдаемых | параметров |
|---|---|---|---|
| масштаб 1, Askervein | 86,2 | 39 (+1 априорный) | 2 |
| масштаб 3, ТКЭ Askervein | 141,4 | 13 | 0 (не определены) |
| масштабы 2–3, литература | 5,4 | 6 | 0 |
| всего | 233 | 59 | 2 → ndf 57, χ²/ndf = 4,1 |
χ²/ndf = 4,1 почти целиком набирают ТКЭ на наветренном склоне и вершине (119 + 19) и разгон у гребня и в следе (58). Это известные структурные границы модели, а не плохая подгонка параметров.
Цена на сетках игры (out/cost_check.json, Онгудай, 150°)
Итерации Пикара при λ/h = 0,1 → 0,25:
| Случай | область 400 м | окно 100 м | окно 50 м | ветер 50 м над стартом | подъём у старта (окно 50 м) |
|---|---|---|---|---|---|
| 12:00, штиль | 61 → 61 | 61 → 71 | 131 → 161 | 0,98 → 0,80 | 0,57 → 0,52 |
| 12:00, 3 м/с | 91 → 91 | 41 → 41 | 51 → 71 | 4,99 → 5,06 | 1,34 → 1,33 |
| 12:00, 6 м/с | 101 → 101 | 41 → 51 | 51 → 71 | 8,45 → 8,71 | 2,05 → 2,09 |
| 9:00, 3 / 6 м/с | без изменений | без изменений | без изменений | +3 % / +0,4 % | ±2 % |
| 9:00, штиль | предел 3000 (как и было) | предел → 591 (сошлось) | 461 → 281 |
На Askervein (12,5 м) итераций 451 → 1831: чем мельче клетка, тем дороже большой λ.
Что внесено
tools/research/air3d/air.py→Params.lam_frac= 0,25 (комментарий с погрешностью и источником AM-09),cs_h= 0,25 с обоснованием фиксации.scripts/atmosphere/air_model/air_case.gd→lam_frac= 0,25 (как в эталоне). Фикстурыtests/atmosphere/fixtures/air_model/ref/не пересчитывались: в них параметры записаны в JSON (λ/h = 0,1), и тест GPU берёт их оттуда.configs/atmosphere.json→ в_docуlee.field_deficit_*,field_descent_slope,turbulence.field_sigma_w_per_ustar,field_mixing_length_mдобавлены итоги AM-09. Значения не менялись.docs/guide/air-model.md→ таблица «Слова пилота против модели после калибровки», новые пункты в «Границы модели».
Воспроизведение
Из корня копии, venv калибровки — tools/research/tune/.venv (uv venv, uv pip install cupy-cuda12x==14.2.0 numpy matplotlib scipy iminuit zstandard):
cd tools/research/tune
PY=.venv/bin/python; LOCK="flock /tmp/heat_ca_gpu.lock"
$LOCK $PY askervein_runs.py out/design_s1.json out/runs_s1_25.jsonl --dx 25 # 60 прогонов, ~8 мин
$LOCK $PY askervein_runs.py out/design_ext.json out/runs_ext_25.jsonl --dx 25 # 7 за границей, ~2 мин
$LOCK $PY askervein_runs.py out/design_fine.json out/runs_s1_12p5.jsonl --dx 12.5 # 5 × 1–7 мин
$LOCK $PY askervein_runs.py out/design_dom.json out/runs_dom_25.jsonl --dx 25 --L 8000 --top 1500
$LOCK $PY cost_check.py 0.1 0.25 # цена на сетках игры
for a in "ask_25_best --dx 25 --lam_frac 0.25 --z0 0.042" "ask_50a_best --dx 50 --adv1 --lam_frac 0.25 --z0 0.042" \
"ask_12p5_best --dx 12.5 --lam_frac 0.25 --z0 0.042" "ask_12p5_nom --dx 12.5 --lam_frac 0.1 --z0 0.03"; do
$LOCK $PY askervein_fields.py fields/$a; done # поля для масштаба 3 (вне git)
cd ../../.. && sh tools/research/tune/run_rest.sh # слова пилота, поля AM-08, пробы Godot, fit_s1/fit_s3/validate_s23
tools/research/tune/.venv/bin/python tools/research/tune/repro.pyПрогоны пишутся по строке на прогон (jsonl), так что прерванную серию можно продолжить с того же места.
Итог для координатора
- Приёмка. Готовы таблица параметров с погрешностями (λ/h = 0,25 −0,015 на границе; z0 = 0,034 ± 0,011), χ²/ndf по блокам и сводный (233/57), вклад каждой наблюдаемой (
out/fit_s1.json,out/fit_s3.json,out/validate_s23.json), график сходимости и список фиксированных параметров со ссылками. Значения внесены вair.pyиair_case.gd. Повторный прогон 12,5 м воспроизводит эталоны в пределах σ: 33 из 39 точек в 2σ. Таблица «пилот → модель» и границы записаны вdocs/guide/air-model.md. - Что не вышло. (1) λ/h данными не определён внутри физичного диапазона: значение взято на границе, а данные тянут выше. (2) Пороги отрыва масштаба 3, H0 и τ данными не определены и оставлены прежними. (3) ТКЭ на вершине и наветренном склоне модель завышает в 1,5–4 раза; это структура модели, параметром не исправляется. (4) Пробы термиков и таблица болтанки с λ/h = 0,25 — сделаны в AM-09б (ниже). Повторены провалы за гребнем против AM-00 и слова пилота 4–6.
- Открытые вопросы. (a) [закрыто в AM-09б] Масштаб 3 берёт длину перемешивания 40 м (
turbulence.field_mixing_length_m), а решатель теперь max(40, 0,25 h). Согласовать нужно правкойfield_turbulence.gd(передать h и λ/h), это решение К0. (b) [закрыто в AM-09б, одно значение 0,3 u*/f] h нейтрального слоя: решатель использует 0,3 u*/f, масштаб 3 — 0,25 u*/f (field_neutral_bl_k). Оба значения в пределах литературы, но не совпадают. (c) Если пилоты скажут «на бровке и за гребнем слабо или не так», путь — 2-й порядок в окнах и окно 25 м (как в AM-01), а не λ/h. - Как проверить.
tools/gpu_tests.sh --filter=test_air_picard_gpu(подflock /tmp/heat_ca_gpu.lock);.venv/bin/python fit_s1.py,fit_s3.py,validate_s23.py,repro.py(изtools/research/tune, только CPU, по сохранённым прогонам) печатают все числа этого документа.
AM-09б: хвосты калибровки (масштаб 3 = решатель, пробы при λ/h = 0,25)
Код: коммит 019a45c; пачка проб — tools/research/tune/run_am09b.sh, итог — tools/research/tune/out/am09b/summary.{md,json} (база «было» — 4c8251e, λ/h = 0,1 у поля и 0,25 в масштабе 3 не было).
(а) Одно замыкание. Масштаб 3 (field_turbulence.gd) берёт λ = max(40 м, λ/h·h), как решатель; λ/h — одна константа AirCase.LAM_FRAC = 0,25 (её же читают air.py и GPU-решатель).
(б) Одна толщина нейтрального слоя. h = k·u*/f, k = AirCase.NEUTRAL_BL_K = 0,3 — одна константа для решателя и масштаба 3 (ключи field_neutral_bl_k, field_coriolis_per_s убраны из atmosphere.json). Литература: Blackadar & Tennekes (1968) JAS 25:1015; Tennekes (1973) JAS 30:558 (h = c·u*/f, c ≈ 0,2–0,3); обзор Sugiyama & Nasstrom (1999) J. Appl. Meteor. 38:1237; Zilitinkevich et al. (2007) BLM 125:167 (статически нейтральный слой, поправки на вращение). Значение 0,3 в пределах разброса, выбрано по решателю.
Вырожденность (λ/h)·k. В нейтральном случае h = k·u*/f входит в замыкание λ = (λ/h)·h = (λ/h)·k·u*/f, поэтому нейтральные данные Askervein определяют произведение (λ/h)·k, а не каждый множитель. λ/h = 0,25 подогнан при k = 0,3; смена k — это перекалибровка λ/h. По коду произведение — не единственное место, где входит h: (1) в решателе air_picard.glsl (K_b = κ·w_m·z·(1 − z/h)², обрезка при z ≥ h) и air_case.gd (h_bl, для устойчивого слоя h_s = min(h_mech, 0,4·√(u*·L/f))); в неустойчивом — z_i из поля и w*; (2) в масштабе 3 — затухание (1 − z/h)^¾ и λ. Значит, по k полное вырождение только в λ; профиль K_b и затухание чувствуют k отдельно. Насколько — не проверялось (Askervein ниже h во всех точках; отдельный прогон по k не делали).
Таблица λ/h = 0,1 → 0,25 (все числа — out/am09b/summary.md; «≈0 %» — изменение меньше 1 %).
Термики из поля (4 ч; 100 м у Каянчи, 400 м у Онгудая), сила, м/с / живых ядер / расстояние до соседа, м / потолок над землёй, м:
| поле | сила | ядер | сосед | потолок |
|---|---|---|---|---|
| Каянча 100 м, 12:00 | 2,94 → 2,92 | 53 → 54 | 435 → 434 | 1201 → 1166 (−3 %) |
| Онгудай 400 м, 09:00 | 1,35 → 1,36 | 301 → 294 | 318 → 320 | 551 → 547 |
| Онгудай 400 м, 12:00 | 2,96 → 2,95 | 262 → 270 (+3 %) | 394 → 393 | 1305 → 1288 |
| Онгудай 400 м, 15:00 | 3,15 → 3,14 | 211 → 204 (−3 %) | 462 → 471 (+2 %) | 1538 → 1526 |
Поток тепла (air_thermals/out/flux.json, пробой по термикам Каянчи): «получено/ожидаемое» 0,931 → 0,960 (файл пересчитан пачкой; прежнее значение взято из коммита до пачки, идентичность условий с прогоном 0,1 не проверялась).
Болтанка за гребнем, точки базы AM-00 (10 м над склоном, 20 км/ч с обратной стороны), поле «0,1 / 0,25 (AM-09) / 0,25 (AM-09б)»: σ_w = 2,05 / 2,06 / 2,06 (Синюха), 2,05 / 2,04 / 2,04 (Бияда), 1,50 / 1,66 / 1,66 (Аушкуль, +10 %); σ_u 1,28 / 1,29 / 1,29, 1,28 / 1,26 / 1,26, 1,39 / 1,37 / 1,37; рывков в минуту 15,0, 6,3, 7,7 — не менялись. Аналитика AM-00: σ_w 1,14 / 1,08 / 1,27, рывки 18,0 / 7,3 / 26,0.
Таблица σ болтанки (27 строк: 4 нейтральных ветра, устойчивая N = 0,010 и 0,018, конвекция, точки Синюхи на 20 и 100 м): изменение не более 4 % везде, кроме одной точки — Синюха, за гребнем +400 м, 100 м: σ_u 2,06 → 3,13 (+52 %), σ_w 2,04 → 2,18 (+7 %). Нейтральные, устойчивые и конвективные случаи без рельефа: +0 %.
Спектр (наклоны): u 150 м −1,58, w 150 м −1,70, u 400 м −2,00, w 400 м −1,68 — без изменений; сумма χ² по проверкам масштабов 2–3 5,43 → 5,26. N_L·z_i/L на 0,4 z_i: 12:00 1,39 → 1,42, 15:00 1,50 → 1,44 (данные 1,20 ± 0,36).
ТКЭ Askervein (масштаб 3, пороги AM-08), χ²: наветренная сторона (6 мачт) 119,3 → 20,0; вершина (4) 19,4 → 10,3; подветренная (3) 2,68 → 2,76; номинал 141,4 → 33,0. Заметное улучшение — за счёт λ = 40 м → max(40 м, 0,25·h) и единой h в масштабе 3.
Что изменилось заметно (> ~10 %): ТКЭ Askervein (χ² в 4 раза меньше, наветренная сторона — в 6 раз), σ_u за гребнем Синюхи на 100 м (+52 %), σ_w Аушкуля у склона (+10 % — эффект поля 0,25 из AM-09, не AM-09б), среднее w у точек за гребнем (−0,13 → −0,19, +49 %; 0,43 → 0,39; −0,27 → −0,33). Не изменилось: сила, число, сосед, потолок термиков (в пределах 3 %), болтанка без рельефа, спектр.
Факты, не решения. λ/h = 0,25 на границе физичного диапазона (данные тянут выше, см. «Результат»); ТКЭ на вершине и наветренном склоне модель по-прежнему завышает (χ² вершины 10,3 на 4 мачты). Тесты после слияния feature/air-model: headless по фильтрам test_air_contracts, test_air_model_atmo, test_wind_field, test_determinism, test_air_thermals, test_lee_rotor, test_air_place, test_air_window_case, test_air_gpu_headless — 0 упало; GPU tools/gpu_tests.sh --filter=test_air_ — 56 тестов, 0 упало (включая test_air_picard_gpu, test_air_window_gpu; эталоны не пересчитывались, окна берут params из JSON фикстуры).
Воспроизведение (из корня копии, venv калибровки готов, GPU-замеры под flock):
dp job start am09b-probes 12600 sh tools/research/tune/run_am09b.sh # ~1,5 ч; сделанные шаги пропускаются (out/am09b/steps.jsonl)
tools/research/tune/.venv/bin/python tools/research/tune/am09b_summary.py # таблица → out/am09b/summary.{md,json}Картинки: tools/research/air_thermals/out/ (термики), tools/research/air_turb/out/spectrum.png.
Источники
Allen M.J. (2006) AIAA 2006-1510 · Bell J.H., Mehta R.D. (1990) AIAA J. 28:2034 · Blackadar A.K. (1962) JGR 67:3095 · Britter R.E., Hunt J.C.R., Richards K.J. (1981) QJRMS 107:91 · Castro I.P., Haque A. (1987) JFM 179:439 · Garratt J.R. (1992) The Atmospheric Boundary Layer, CUP · Högström U. (1996) BLM 78:215 · Holtslag A.A.M., Boville B.A. (1993) J. Climate 6:1825 · Ishihara T. et al. (1999) JWEIA 83:95 · Kaimal J.C. et al. (1972) QJRMS 98:563; (1976) JAS 33:2152 · Lenschow D.H., Stephens P.L. (1980) BLM 19:509 · Lenschow D.H., Wyngaard J.C., Pennell W.T. (1980) JAS 37:1313 · Louis J.-F. (1979) BLM 17:187 · Mellor G.L., Yamada T. (1982) Rev. Geophys. 20:851 · MIL-HDBK-1797 · Nieuwstadt F.T.M. (1984) JAS 41:2202 · Panofsky H.A., Dutton J.A. (1984) Atmospheric Turbulence · Skamarock W.C. et al. (2019) NCAR/TN-556+STR · Stull R.B. (1988) · Taylor P.A., Teunissen H.W. (1985) MSRB-85-6; (1987) BLM 39:15; данные — Zenodo 4095052 · Troen I., Mahrt L. (1986) BLM 37:129 · Zilitinkevich S.S. (1972) BLM 3:141 · Hernández-Aguayo C. et al. (2026) arXiv:2608.00241.
Перекалибровка (λ/h, α, z0) с профилем RS
После Морриса (docs/research/air-model-sensitivity.md): к 39 разгонам AM-09 добавлен профиль опорной мачты RS — S(z)/S(24 м), чашки 15–49 м (σ 2–3 %) и змей 48–267 м (σ 4 %), 8 точек, отдельная группа χ². Сетка 9 × 11 × 5 (λ/h 0,02–0,6 лог, α 0,12–0,27, z0 0,01–0,09 м лог), прочее — номинал (hb, 2-й порядок, local_k); между узлами — кубическая интерполяция, минимум — iminuit. Интерполяция сверена прямым прогоном в минимуме (χ² 68,06 против 68,15), сетка 12,5 м сдвигает профиль RS ≤ 0,45σ.
| λ/h | α | z0, м | χ²/ndf всего | разгоны (39) | профиль RS (8) | |
|---|---|---|---|---|---|---|
| AM-09 | 0,25 | 0,17 | 0,035 | 206/45 | 85,6 | 120,9 |
| новый минимум | 0,031 (+0,018 −0,009) | 0,235 ± 0,006 | 0,090 (граница; ≥ 0,075 при Δχ² = 1) | 68,2/44 | 45,6 | 22,5 |
| то же с априорным z0 = 0,03 × 1,5^±1 | 0,025 (+0,012 −0,005) | 0,234 ± 0,006 | 0,048 (+0,022 −0,015) | 72,6/45 | 49,3 | 22,0 |
По группам (AM-09 → новый): наветренная 8,9 → 7,1; вершина 18,8 → 6,4; подветренная 29,4 → 25,4; линия B 28,5 → 6,7.
Вырождение λ/h–α: по одним разгонам долина Δχ² ≤ 2,3 тянется от (0,6; 0,20) до (0,05; 0,24) — это и был «λ/h вверх» AM-09. Профиль RS держит α в 0,229–0,240, долина рвётся: λ/h 0,022–0,044 (Δχ² = 1), корреляция λ/h–α −0,18; λ/h = 0,25 теперь стоит Δχ² ≈ 7.
Пределы: z0 упирается в верх диапазона (при 0,03 — Δχ² = 6) — z0 здесь частично подменяет неразрешённый приземный слой 25-м сетки; остаток профиля — змей на 267 м (1,62 против 1,79): профиль притока упирается в max_profile = 2,0 на ≈ 190 м. Подветренная сторона (25/8) не лечится ни одним из трёх параметров.
Воспроизведение и файлы — tools/research/recal/README.md (run_grid.py grid, fit.py); картинки — tools/research/recal/out/fig_*.png.
Согласование с игрой (предложение, конфиги не менялись): решатель и WindModel читают одно wind.shear_exponent (сейчас 0,14, max_profile_factor 1,8). Калибровка λ/h = 0,03 верна только вместе с α ≈ 0,23: при α = 0,14 Δχ² ≈ 110 по одним разгонам и ≈ 300 с профилем RS. Предложение — shear_exponent 0,23 и max_profile_factor 2,0 (как в прогонах Askervein; при 1,8 и α = 0,23 предел наступает уже на ≈ 130 м), затем пересчитать эталон GPU-теста и цены на сетках игры. α = 0,23 — значение нейтрального сильного ветра Askervein; зависимость α от z0 и устойчивости — открытый вопрос.
Совместная калибровка Askervein + Perdigão (Б1, волна Б)
Записка — docs/archive/plan/air-model-b1.md; код, данные и команды — tools/research/cases/b1/README.md. Оба случая считаются
одной схемой (cases/scheme.py: 2-й порядок, hb, local_k, cbl, Pr_t 0,85, k_relax 0,1) и по общим правилам постановки
(cases/rules.py, контракт C10 v3): dx = H/5,8, область 200 клеток, потолок над рельефом 7,5 H, насыщение профиля притока
z_sat = 0,3·(0,3u*/f), U10 по опорной точке. Сеточная поправка одним способом: dx·2/3 против dx. Систематика 1-го порядка
игры — отдельно, в параметры не входит. 765 прогонов (Askervein 315, Perdigão NE/SW 450), 3,9 ч GPU.
| λ, м | α_A | z0_A, м | α_NE / α_SW | z0_P, м | χ²/ndf | |
|---|---|---|---|---|---|---|
| совместно | 27 (+4 −3) | 0,242 ± 0,004 | 0,05 (+0,05 −0,03) | 0,33 (край) / 0,29 ± 0,03 | 1,0 (край) | 208/76 (Askervein 165/47, Perdigão 43/35) |
| только Askervein | 145 (+150 −50) | 0,235 | 0,20 | — | — | 136/44 |
| только Perdigão | 10 (край) | — | — | 0,33 / 0,28 | 1,0 | 29/31 |
- Напряжение за общий параметр — Δχ² = 44: подветренная сторона Askervein хочет большое λ, рециркуляция Perdigão — малое. Одно λ не даёт ни зону за двойной грядой (L/D 0,40 / 0,20 против 0,50), ни слабый след за холмом. Это граница модели.
- λ/h и lam по двум нейтральным случаям не разделяются: у обоих h ≈ 1600–1800 м.
- Схема игры (1-й порядок) в лучшей точке: χ² 209 → 282 (Askervein −1…−2σ по группам).
- local_k выкл: 209 → 281 (Askervein +88, Perdigão −15) — выбор А3 сохраняется.
- Регрессия матрицы А2:
- lam = 27 м, lam_frac = 0: окно 100 м в штиль с нагревом не сходится;
- lam = 40, lam_frac 0,016: все cbl сходятся, цепочка игры +14 % итераций в штиль с нагревом, область 200 м — ×4.
- Предложение для игры (конфиги не менялись): lam 40, lam_frac ≈ 0,016. По α решает координатор: Askervein даёт 0,24.