А4 «Случай Perdigão» — постановка для совместной калибровки (C10 v1)
Исполнитель А4, ветка air/a4. Код — tools/research/cases/perdigao.py, скрипты и данные —
tools/research/cases/perdigao/ (README с командами воспроизведения). Решатель не менялся
(git diff feature/air-model -- tools/research/air3d scripts пуст).
Статус: случай собран, оба подслучая считаются (ok, 141–231 итераций, 10–26 с на решателе при dx 30 м), контрактный
тест C10 — 0 нарушений. Пробный прогон — только проверка постановки, не калибровка.
1. Постановка
| Что | Значение | Почему |
|---|---|---|
| Область | 6 × 6 км, центр долины (PT-TM06 E 33900, N 4800 → 39,7108° с. ш., 7,7378° з. д.), оси: x — восток, y — север | гряды ~1,4 км между гребнями и ~6 км длиной вдоль оси СЗ–ЮВ; области ≫ зоны (≈ 0,7 км); от гребней до границ притока ≥ 2 км; мачты в пределах ±1,3 км |
| Шаг | dx = 30 м (номинал), dz = dx/2 = 15 м; потолок 1300 м над нулём сетки (BASE = 100 м над морем, минимум DSM 105 м) | 30 м — разрешение Copernicus GLO-30; половина ширины гряды на половине высоты A ≈ 400–600 м → 13–20 клеток; 200 × 200 × 88 клеток (Askervein: 160 × 160 × ≈80) |
| Губки | боковая 1000 м (как Askervein), верхняя 700 м (начало на 600 м над нулём = ≥ 200 м выше гребней: у Askervein верхняя губка 1000 м при потолке 1000 м, здесь потолок 1300 м и гряды 400 м) | air.Params.sponge_* |
| Вход | нейтраль γ = 0, без нагрева, f_cor = 9,32·10⁻⁵ 1/с (39,7°), max_profile 2,5 (степенной профиль U/U10 до 494 м над поверхностью при α = 0,235; у Askervein 2,0 при холме 126 м) | физика случаев: Ri = −0,10…+0,08, z/L = −0,14…+0,05 (README данных); остальное Params() (Pr_t 0,85, local_k, closure = hb, adv2 = False) + перекалибровка Askervein (λ/h 0,031, α 0,235) |
| NE | 27.04.2017 17–19 UTC, ветер с 60,7° (tse13 100 м, среднее окна), U100 = 8,79 м/с; наветренная мачта tse13 (гребень NE-гряды, 453 м) | cases/ne_20170427_windowmean.csv |
| SW | 11.05.2017 10–11 UTC, ветер с 216,5° (tse04 100 м), U100 = 8,82 м/с; наветренная мачта tse04 (гребень SW-гряды, 473 м) | cases/sw_20170511_windowmean.csv |
| Опорная скорость | U10 фона (U10_IN: NE 3,15, SW 3,03 м/с) подобран один раз, чтобы S_ref модели на наветренной мачте на номинале = U100 данных (8,78 против 8,79 / 8,82 м/с); затем фиксирован — разгон на гребне ≈ 2,8 от U10 (3D-гряда), S/S_ref от подгонки скорости не зависит | фон задан степенным профилем от поверхности, а не на гребне |
Рельеф и сверка с мачтами
Конвейер игры: tools/terrain/fetch_dem.py::build_layer (→ sample_copernicus, кеш ~/.cache/deltaplan_terrain) с шагом
10 м и гауссовым сглаживанием 20 м (σ 2 клетки; у игры — 0,8 клетки 25 м, убирает ступеньки леса в DSM), дальше блочное среднее
до dx (как askervein.terrain). Локация игры не заводилась, tools/terrain/ не правился. Мачты — E/N PT-TM06 из
towers_layout.csv → WGS84 (pyproj; проверено по широте/долготе NetCDF до 3-го знака) → кадр игры.
Таблица по 59 мачтам — cases/perdigao/out/terrain_check.md (DSM − высота мачты): среднее −0,6 м, медиана +0,1 м, σ 2,9 м,
10–90 %: −4,5…+1,9 м. Гребни занижены на 3–10 м (rsw07/08 −7/−10 м: 30 м разрешение + сглаживание, срезает вершину), дно
долины и склоны — в пределах ±2 м. Следствие для калибровки: высота гряды в модели на 2–5 % ниже реальной (H модели 150–170 м
по разрезам против 174 м у Menke, табл. 2).
Лес → смещение d и z0 (решение)
Факты. (1) DSM Copernicus здесь не содержит полог: у 29 мачт с долей леса WorldCover ≥ 0,9 (радиус 50 м) DSM − высота земли в среднем +0,6 м (от −9,7 на гребнях rsw до +4,6 м), у 10 мачт с долей < 0,3 — −1,9 м: разница 2,5 м при кронах 15–25 м. Утверждение VR-21 («DSM с кронами») для этого места не подтверждается (проникновение X-диапазона в плотные посадки эвкалипта
- сглаживание); поэтому DSM — это рельеф земли. (2) Карт полога нет (README данных), лидар 2015 (doi:10.34626/uporto/fms2-rd63) не качал — дорого. (3) air.py принимает скалярное z0, без смещения.
Решение (решатель не меняем): поверхность модели = DSM + d·(доля леса WorldCover в клетке), d = 0,7·h_c = 12,6 м, h_c = 18 м (эвкалипт 20–25 м, сосна до 15 м пятнами; взвешенная оценка, не измерение); z0 = скаляр, среднее по ln z0 между лесом (0,1·h_c = 1,8 м) и открытым (0,1 м, CORINE) по доле леса области (WorldCover, 0,645): z0 = 0,645 м. Смысл: Raupach 1994 — над пологом профиль логарифмический со смещением d ≈ 0,7–0,8 h и z0 ≈ 0,1 h; смещение — сдвиг поверхности вверх, а не шероховатость (иначе теряется подъём потока на кроны и запирание долины). Усреднение z0 по ln — эффективная шероховатость смешанной поверхности (Mason 1988 / Claussen). Ссылки — Palma et al. 2020, WES 5, 1469 и Wagner et al. 2019, ACP 19, 1129 (лес z0 ≈ 1–2 м, открытое ≈ 0,1 м, README данных); сами статьи при работе не перечитывались. Независимая прикидка: по u*/U100 на гребнях (u* 0,48–0,60, U100 7,9–8,8, tse13/tse04 NE; κU/u* = 5,9–7,3, d = 12,6 м) z0 ≈ 0,06–0,24 м — ниже (нейтральность приближённая, гребневой разгон, поток в слое 100 м не равен приземному); диапазон для волны Б: z0 0,1–1 м, выше при dx 30 м (первая клетка 7,5 м) теряет смысл (z0 1,8 м → z1/z0 = 4, зона пропадает). Чувствительность (пробный прогон, dx 30): z0 0,1 ↔ 0,645 ↔ 1,8 — χ² NE 37 / 41 / 59, SW 107 / 115 / 109; без смещения d (d = 0): 33 / 99 — смещение d на номинале ничего не улучшает, эффекты z0 и d слабее эффекта λ/h (см. §3). Это не доказывает выбор, а говорит: при текущей модели z0/d — второстепенные параметры (вывод проверять при калибровке). Вопрос координатору — в §5 (карта z0/d по клеткам требует решателя; стоит ли — решает К2).
2. Наблюдаемые (38; таблица — cases/perdigao/out/observations.md)
Определения одинаковы у данных и модели: отношение S/S_ref, S — модуль скорости (u, v, w) на мачте на высоте ground + z_tower (абсолютная высота, а не «z над DSM»: DSM в лесу = земля, поверхность модели = земля + d), S_ref — там же, на наветренной мачте на 100 м; модельная точка — билинейно по столбцам, линейно по z; нет наблюдения (NaN), если точка ниже 10 м над поверхностью модели (у Askervein первая клетка; слепая зона). Уровни мачт: только ≥ 30 м (внутри полога и в подслое шероховатости 2–3 h_c ≈ 40–55 м логарифм не работает; 10–20 м не брались), по три уровня на мачту (30, 60, 100 м) — остальные уровни коррелируют. Мачты NE: tse13, tse04, rsw03, tse09, tse11, tse06, tse10, tse01, tse02; SW: tse04, tse13, tse09, tse11, tse06, tse10, tse01, tse02 (tse12, tse07, tse08 — только уровни ≤ 20 м: не берутся).
Группа grp | Что | data | σ | Источник |
|---|---|---|---|---|
pd_<sub>_<мачта> (по мачте и подслучаю) | S(мачта, z)/S(наветр., 100 м), 17 (NE) + 15 (SW) точек | 0,18…1,06 | √(σ_5мин² ⊕ (0,10·r)² ⊕ 0,03²), 0,07–0,15 | ISFS 5 мин NCAR/EOL, *_windowmean.csv (среднее окна 2 ч NE / 1 ч SW), σ_5мин — разброс отношения по 5-мин рядам окна (24 / 12 точек) |
pd_menke (обе подслучая) | zoneL = L/D (D = 1407 м, табл. 2, разрезы 1–2) | 0,498 (700 м) | 0,10 (140 м = 100 ⊕ 100) | Menke 2019: 697 ± 100 м по разрезам (540–760); ⊕ 100 м — среднее поле против осреднения по периодам (Рис. 8: 420–680 м) |
pd_menke | zoneDepth = глубина/H (H = гребень − дно = 173,6 м, табл. 2, разрезы 1–2) | 0,905 (157 м) | 0,21 (36 м = 30 ⊕ 20) | Menke 2019: 157 ± 30 м над дном; 20 м — слепая зона у земли. (В summary.md стоит отношение к «h ≈ 250 м» = 0,63; здесь H — то же, что у модели, т. е. «гребень − дно» по табл. 2) |
pd_menke | zoneRev = max(−u_∥)/U100 | 0,22 | 0,10 | Menke 2019 Рис. 10 (оцифровка ±0,03): облако 0,05–0,55, центр при Ri ≈ 0 — 0,22 |
Зона рециркуляции в модели (perdigao.zone_metrics): три разреза вдоль ветра через центр долины со сдвигами вдоль гряды
−500/0/+500 м (у Menke — три разреза вдоль гряды; разрез 3 с холмом не брался), поле u_∥ = u·e_ветра на сетке 10 м, область
u_∥ < −0,5 м/с выше 15 м над поверхностью (слепая зона), наибольшая связная область, длина > 50 м (как у Menke, с. 2717);
L — горизонтальный размер, глубина — верх над дном долины (минимум сглаженной поверхности в ±700 м), H и D — по рельефу разреза
(гребень−дно, расстояние гребень–гребень), max(−u_∥) — по разрезу между гребнями, делённый на S_ref. Результат — среднее по
разрезам (разрез без зоны даёт L = глубина = 0). Статистика Menke условна («периоды с рециркуляцией», 52 % всех), модель
— одно среднее поле, а не ансамбль реализаций; поэтому σ увеличено и все шесть зонных наблюдаемых в одной группе pd_menke
(зависимы: одни и те же числа для NE и SW; волна Б должна считать группу как одно наблюдение, а не шесть).
sig_grid = |obs(dx 30) − obs(dx 20)| (out/grid_sigma.json): профили 0,00–0,09, зона 0,00–0,16 (пороговые величины шумят).
grid_corr = 0. Не включено: вероятность зоны, ΔU на гребне и ΔTI (Menke №4–6) — требуют ансамбля/турбулентности.
3. Пробный прогон (только проверка постановки)
Номинал перекалибровки (λ/h 0,031, α 0,235, z0 0,645 м, Pr_t 0,85, прочее Params()), out/trial_table.md, out/trial_runs.jsonl
(14 строк C10, все ok). Решатель на RTX 4070 SUPER:
| вариант | dx | итераций | t решателя, с | χ² NE (20) | χ² SW (18) |
|---|---|---|---|---|---|
| номинал | 30 | 181 | 12,6 / 12,5 | 41 | 115 |
| номинал | 20 | 371 / 381 | 91,9 / 96,4 | 38 | 104 |
| номинал | 40 | 251 | 9,4 / 9,7 | 45 | 116 |
| z0 = 0,1 м | 30 | 231 / 191 | 26,3 / 15,0 | 37 | 107 |
| z0 = 1,8 м | 30 | 151 / 161 | 10,6 / 18,5 | 59 | 109 |
| d = 0 | 30 | 181 | 20,7 / 12,5 | 33 | 99 |
| λ/h = 0,25 (Params) | 30 | 141 | 9,9 / 9,8 | 63 | 85 |
(NE — первое значение в паре, SW — второе; χ² — контрактная формула без grid_corr, строки одного подслучая; время решателя при
занятом GPU (параллельно считает А2) колеблется до 2×: 10,6–26,3 с для одних и тех же 181 итерации.)
Модель против данных (номинал, dx 30; полная — out/trial_table.md, out/fig_obs.png):
- Наветренные гребни и над ними: S(tse04, 60–100 м)/S_ref: NE 0,84–0,93 против 0,86–0,89; SW tse04 60 м 0,96 против 0,98 — профили над гребнями воспроизводятся в пределах σ (нижний уровень 30 м на 0,1 ниже: слой в пологе).
- Долина и подветренный склон: заниженные скорости — NE tse09 30/60 м 0,13/0,11 против 0,44/0,41 (−2,7σ/−3σ); SW tse09 0,11/0,18/0,31 против 0,54/0,57/0,59 (−4σ/−3,6σ/−2,5σ), tse11, tse06, tse10 (−2…−3σ). Поток в долине в модели «запирается» сильнее, чем в природе. У SW на мачтах долины направление 105–170° против 216° — сильная каналная составляющая вдоль долины (README данных: «ближе к граничному по направлению»), модуль скорости S не сводится к разгону по ветру: SW-скорости долины вряд ли воспроизведутся параметрами среднего поля — вопрос координатору.
- Зона рециркуляции: на номинале зоны почти нет. NE: L/D 0,32 (данные 0,50 ± 0,10), глубина/H 0,36 (0,90 ± 0,21), max(−u)/U100 0,07
(0,22 ± 0,10): зона у поверхности у левого склона, короткая и мелкая. SW: L/D 0,04, зоны нет на двух разрезах из трёх.
Откликается на параметры: при λ/h = 0,25 зона исчезает совсем (L = 0 в обоих подслучаях); в сторону меньших λ/h (номинал 0,031 уже у нижнего края сетки Askervein) не проверялось.
Итог: постановка отличает λ/h (зона и скорости долины меняются заметно), от z0 и d зависит слабее; прогон пригоден для калибровки,
но при Askervein-номинале модель даёт слишком слабую зону — калибровщик потянет λ/h и, возможно,
local_k/lam.
Цена пачки. Решатель 12,4–12,6 с (141–231 итерации: 10–26 с) + ~2,5 с на сборку и наблюдаемые (замер без ожидания замка,
12,4 + 2,5 ≈ 15 с) при dx 30. Точка калибровки = два подслучая ≈ 30 с. 200 точек ≈ 1,7 ч; 495 (как сетка Askervein) ≈ 4,1 ч;
пачка Морриса/LHS на 16 факторов с 600 точками ≈ 5 ч. dx 40: ≈ 9,5 с решателя (≈ 12 с на прогон; −25 %, ошибка сетки для профилей
в пределах σ, для зоны — нет: L/D 0,27 против 0,32). dx 20: 92–96 с — только для sig_grid/проверок (3–5 точек). При делении GPU
с другими агентами (замок на прогон) ожидание замка давало до 240 с на прогон в этом запуске.
4. Границы применимости
- Среднее (RANS-подобное) поле, нейтраль; поток в SW-случае частично определён стратификацией и каналированием вдоль долины (Ri +0,075, направление в долине 105–170°) — не захватывается.
- Лес — только смещение d (по WorldCover-маске, h_c = 18 м одна для всей области) и скалярное z0; высота и густота полога не измерены, эвкалипт/сосна не различаются, открытые участки получают z0 = 0,645 м вместо 0,1 (и наоборот лес 0,645 вместо 1,8).
- Копернику не верить по кронам; гребни занижены на 3–10 м; dx 30 м — на пределе разрешения для гребня (13–20 клеток на A).
- Зона Menke — условная статистика по 10-мин периодам с 3 разрезов, слепая зона у земли, порог 0,5 м/с на лучевой скорости; модельный аналог — осреднённое поле, порог на u_∥, выше 15 м: определения близки, не идентичны.
- Погрешности σ выбраны по разбросу 5-мин отношений и представительности 10 % (DEM 30 м, лес, положение мачты): не статистика.
- Формулы z0/d опираются на литературные значения (не перечитывались; ссылки — README данных), карты полога нет.
- Граничные условия на боковых границах — губки 1 км (как Askervein); влияние размера области (6 км) на зону не проверялось.
5. Вопросы координатору
- Лес / z0. Скалярное z0 плюс смещение d обёрткой закрывают постановку, но z0 не зависит от места (лес 1,8 м и поле 0,1 м сведены в 0,645 м, а на dx 30 м z0 ≳ 1 м уже ломает пристенную функцию: z1/z0 < 8). Нужна ли в решателе карта z0 (и d) по клеткам? Доводы «за»: лес занимает 64 % области и 79 % между гряд, а зона рециркуляции как раз определяется контрастом «лес на гребне/поле в долине»; доводы «против»: чувствительность к скалярному z0 и d на номинале мала (χ² 33–59 NE при 0,1…1,8 м и d 0/12,6) и сильнее откликается λ/h. Предлагаю сначала калибровку волны Б на текущей постановке, карту — если остаточная невязка по зоне не уйдёт.
- C10. (а) Смысл
grpв контракте не определён — здесь: «одни и те же числа/одна мачта; зависимы»; подтвердить, как потребитель его использует. (б)obsдля зоны — пороговые величины: при исчезновении зоны (L = 0) наблюдаемое перестаёт меняться и не даёт градиента — калибровке (MIGRAD и т. п.) нужна гладкая замена; введено max(−u_∥)/U100 как непрерывная, но в SW она тоже мала. (в)run_oneвозвращает дополнительные поляinputs,zone_sections,t_lock_wait— контрактом допустимо, прошу подтвердить. - SW-подслучай. Профиль SW на мачтах долины (направление 105–170°) — каналированный поток; предлагаю волне Б проверить, не стоит ли снизить вес SW-мачт долины (tse09, tse11, tse06, tse10: χ² по ним −2…−4σ при любых z0/d/λ/h из пробного набора) или перейти на компоненту вдоль ветра.