А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)
NE27.04.2017 17–19 UTC, ветер с 60,7° (tse13 100 м, среднее окна), U100 = 8,79 м/с; наветренная мачта tse13 (гребень NE-гряды, 453 м)cases/ne_20170427_windowmean.csv
SW11.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,15ISFS 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_menkezoneDepth = глубина/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_menkezoneRev = max(−u_∥)/U1000,220,10Menke 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)
номинал3018112,6 / 12,541115
номинал20371 / 38191,9 / 96,438104
номинал402519,4 / 9,745116
z0 = 0,1 м30231 / 19126,3 / 15,037107
z0 = 1,8 м30151 / 16110,6 / 18,559109
d = 03018120,7 / 12,53399
λ/h = 0,25 (Params)301419,9 / 9,86385

(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. Вопросы координатору

  1. Лес / 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. Предлагаю сначала калибровку волны Б на текущей постановке, карту — если остаточная невязка по зоне не уйдёт.
  2. C10. (а) Смысл grp в контракте не определён — здесь: «одни и те же числа/одна мачта; зависимы»; подтвердить, как потребитель его использует. (б) obs для зоны — пороговые величины: при исчезновении зоны (L = 0) наблюдаемое перестаёт меняться и не даёт градиента — калибровке (MIGRAD и т. п.) нужна гладкая замена; введено max(−u_∥)/U100 как непрерывная, но в SW она тоже мала. (в) run_one возвращает дополнительные поля inputs, zone_sections, t_lock_wait — контрактом допустимо, прошу подтвердить.
  3. SW-подслучай. Профиль SW на мачтах долины (направление 105–170°) — каналированный поток; предлагаю волне Б проверить, не стоит ли снизить вес SW-мачт долины (tse09, tse11, tse06, tse10: χ² по ним −2…−4σ при любых z0/d/λ/h из пробного набора) или перейти на компоненту вдоль ветра.