# Mapeador de Grade — Eta · Manual de Uso

**Versão do manual:** 2026-09-02 (cobre até: **RESTRT do etafcst** no card de binários (§11.2 — ~95 campos do arquivo de reinício: plotagem, checagem, corte e perfil; aceita arquivo **truncado** e deduz LM/NSOIL), **costa GSHHS de alta resolução** (~55 m; §3) com **cor e espessura ajustáveis** na legenda do mapa, **filtro de visualização** da camada ativa (§6.1 — só uma classe de veg/solo, faixa mín–máx da topografia), **☑ por malha no editor** (§7 — escolher quais malhas o Aplicar/pintura alteram), **níveis eta extraídos do CNST** (§11.2.1), **INIT · BNDY · CNST do initbc** — leitura por fatias de arquivos de GB, **checagem de valores não físicos** com ofensores clicáveis, plotagem de qualquer campo/nível/tempo (PD em hPa, Q em g/kg), **corte vertical** (linha A→B ou **linha composta ✏️ com vértices arrastáveis e atualização dinâmica**; BNDY = orla desenrolada) e **perfil vertical** que acompanha o ponto do mapa, em **janela flutuante** redimensionável com zoom/pan — e ainda: **🎨 destacar valor com cor escolhida** e **máscara com valor-marcador**, **exportação da série em 🎬 WebM / 🎞 GIF**, **diff entre registros de uma série**, **isolinhas + bandas**, **medição de área ▦**, **15 paletas**, **Σ estatísticas por shape**, **calculadora de malhas**, **menu 📂 Carregar** com **carregamento em lote por diretório**, **painel direito em 4 grupos** com consulta unificada, **corte vertical A→B com níveis eta** no perfil, **LMH/HTM por nível** (🧱, com série animável), **verificador de consistência topo × máscara** com correções em clone, **animação da série multi-registro**, diff com **arquivo A externo**, **nível L + pressão** no ponto e nas células da topografia ajustada, graticule sob demanda, rótulos com anti-colisão, **preferências persistentes** — além de multi-instâncias, multi-shape, séries por shape, topografia ajustada aos níveis eta com *sunken points*, editor de níveis verticais e anotações)
**Ferramenta:** `eta-grid-mapper.html`
**Como abrir:** (a) navegador, direto no arquivo local (ex.: `wsl.localhost/Ubuntu-20.04/.../util/eta-grid-mapper/eta-grid-mapper.html`) — após atualizações, recarregue com **Ctrl+F5**; ou (b) versão publicada: <https://claude.ai/code/artifact/231d81da-70c5-4c6f-bec2-11bfedfa6888>.

A ferramenta funciona 100 % offline: nenhum dado sai do seu computador — os arquivos
carregados são lidos apenas na memória do navegador e os arquivos "salvos" são baixados
pela pasta de downloads. **Na versão publicada (Artifact)**, cada salvamento passa por
uma **confirmação do viewer** (capability `downloads`); binários Fortran cujo nome não
tem extensão aceita pelo viewer (`.dat`, `deta_*`) saem com **`.txt` no fim do nome —
os bytes são idênticos, basta renomear** após o download (a página avisa). Limite do
viewer: 16 MiB por arquivo (séries WebM/GIF grandes: use a cópia local).

---

## 1. Parâmetros da grade (barra superior)

Campos: **Resol. (km), IM, JM, INPES, JNPES, TLM0D, TPH0D, DLMD, DPHD**.

* Preenchimento automático: carregue o **ETAIN** (ver §5) — os 6 parâmetros do
  `&MODEL_GRIDS` são extraídos.
* Digite a **resolução em km** e tecle Enter: DLMD/DPHD são calculados pela convenção do
  `def_eta.scr` (e vice-versa: DLMD digitado atualiza o campo de km).
* **Redesenhar domínio** aplica os valores digitados.
* A **barra de referência** logo abaixo mostra: resolução, DLMD/DPHD, DT/NPHS/NCNVC e
  regime (hidrostático ou não) quando a resolução está na tabela do modelo, a extensão
  física do domínio em km (L-O × S-N) e o total de pontos.

## 2. Navegação no mapa

| Ação | Efeito |
|---|---|
| Roda do mouse / pinça (touch) | Zoom no ponto sob o cursor |
| Duplo clique | Aproxima no ponto |
| Arrastar | Move o mapa |
| Clique | Seleciona a célula (inspeção) |
| Botões **+ / − / ⟲** (canto direito) | Zoom / ver domínio inteiro |

O rodapé esquerdo do mapa mostra em tempo real lat/lon, I,J aproximados e o valor da
camada ativa sob o cursor. O indicador de zoom (ex.: `19.6×`) fica abaixo dos botões.

**Células**: cada ponto da grade E é representado pelo seu **losango** (vértices a
±DLMD leste/oeste e ±DPHD norte/sul) — os losangos dos vizinhos se encaixam sem folga
nem sobreposição. No zoom alto aparece um **+** no centro de cada célula, e a célula
selecionada é destacada em âmbar.

## 3. Botões do mapa (barra de toggles)

| Botão | Função |
|---|---|
| `topo` `másc` `veg` `solo` `outro` | Escolhe a camada exibida (uma por vez; clique de novo para ocultar) |
| `campo 1/2` | Alterna entre os 2 campos de um arquivo "Outro" de 2 campos (ex.: hgt/sm) |
| `diff` | Exibe a camada de comparação B−A (ver §10) |
| `másc+` | Sobrepõe a água (SM=1) em azul sobre a camada ativa |
| `grad` | Marca as células de maior gradiente de topografia |
| `perfil` | Inicia o traçado de perfil A→B (ver §11) |
| `PEs` | Grade de subdomínios (processadores) — **só sob demanda**; com zoom, mostra o número do MYPE em cada bloco |
| `gratic` | Linhas de lat/lon — **só sob demanda** (não liga mais sozinho no zoom; o estado fica salvo nas preferências, §13) |
| ⏵ *(barra da série)* | Aparece quando a instância ativa de **outro** é uma série de vários registros: ⏵/⏸ anima, o *slider* alterna o registro, o seletor define a velocidade (0,5–8 quadros/s), o rótulo mostra `nº/total · nome` e os botões **🎬 WebM** / **🎞 GIF** exportam a animação como vídeo (ver §5.2) |
| `costa` | Linha de costa real embutida (GSHHS alta resolução ~55 m — nas Américas todas as ilhas ≥ 0,4 km; no resto do mundo ≥ 3,3 km). Ao lado do rótulo "costa (GSHHS)" na legenda do mapa há um **seletor de cor** e um campo de **espessura** em px de tela (vazio = automática: 1 px até 3× e afina no zoom) — ambos persistem nas preferências e valem também p/ o PNG — a espessura afina automaticamente com o zoom |
| `valores` | Mostra o **valor da célula** (camada ativa) junto aos pontos de grade no zoom alto — a fonte é **proporcional ao losango e sempre contida nele** (cresce junto com o zoom, sem invadir as células vizinhas). Com a **topografia ajustada aos níveis eta** ativa, cada célula mostra três linhas: **pressão na metade superior**, **altitude no centro** e **LMH na metade inferior** — a máscara da topografia do `const.f`, LHGT−1 — (ex.: `867hPa` / `1287` / `LMH42`), todas na mesma fonte e cor. Na topografia **original**, a altitude usa a **mesma posição e o mesmo tamanho de fonte** da ajustada — alternar entre as instâncias não muda o rótulo de lugar |
| `✏️` | Abre a barra de **anotações**: ✎ lápis (arraste), ▭ retângulo (arraste), ◯ círculo (arraste do centro), **╱ linha reta** (arraste), **→ seta** (arraste da origem ao destino — a ponta fica no destino), **📏 medir distância** (arraste entre dois pontos: o segmento ganha tiques nas pontas e o rótulo com a **distância em km** — haversine —, atualizado ao vivo durante o arrasto), **▦ medir área** (clique os vértices do polígono — a área parcial aparece ao vivo — e feche com **duplo clique**: rótulo com a **área esférica em km²**; Esc cancela; arrastar continua sendo pan), **T** texto (digite no campo e clique no mapa), **⌖ selecionar** (clique numa anotação do mapa: ela ganha uma caixa tracejada — remova com **✕ sel.** ou a tecla **Delete**), **tamanho da fonte** (A 10–48 px; o texto depois escala junto com o zoom), **espessura da linha** (1–8 px, constante na tela) e cor — cada anotação guarda fonte/espessura/cor escolhidas na criação. ↶ desfaz a última, 🗑 limpa todas, e **↷ REINSERE o que foi removido** (vale para o ↶, para o ✕ sel. e até para o 🗑 — as remoções ficam numa pilha e voltam na posição original). As anotações ficam **ancoradas ao mapa** (acompanham zoom/pan) e **saem no 📷 PNG**. Clique de novo na ferramenta ativa para voltar ao modo normal de navegação |
| `popup` | Balão de informações sobre o ponto selecionado |
| `shape` / `pontos` | Mostra/oculta o shape ou lista de pontos carregada (sem descarregar) |
| `📷 PNG` | Exporta a vista atual como imagem (ver §12) |

## 4. Painel direito: grupos e consultas

O painel lateral é organizado em **4 grupos** (títulos em maiúsculas; cada card
individual colapsa/expande com um clique no título):

* **DADOS** — Carregar dados (arquivos, instâncias, níveis eta 🏔/📈/🧱, remover/limpar).
* **INSPEÇÃO** — Consulta, Ponto selecionado e Legenda.
* **EDIÇÃO** — Editar/salvar malha e Máscara por shape/lista.
* **ANÁLISE** — Comparar (B−A) e Consistência topo × máscara.

O card **Consulta** reúne as três formas numa só (cada linha preenche as demais):

* **PE + local**: MYPE + i,j locais (aceita halo) → preenche global e lat/lon.
* **Global**: I,J globais → preenche MYPE/local e lat/lon.
* **Lat/lon**: encontra o ponto de grade **mais próximo** e corrige a lat/lon digitada.

O cartão **Ponto selecionado** consolida: MYPE, ipe/jpe, i,j locais, I,J globais,
lat/lon, rlon/rlat e o valor da camada ativa. Clicar no mapa atualiza tudo.

## 5. Carregar dados (card "Carregar dados")

Os botões de carregamento ficam no menu **📂 Carregar ▾** (um arquivo por vez), que
também traz o **📁 Diretório (lote)** — ver §5.0. Ao lado do menu ficam o campo
**PT (Pa)** e os botões **🏔 aplicar níveis** e **📈 níveis**.

### 5.0 Carregamento em lote (📁 Diretório)

1. No menu 📂, escolha **📁 Diretório (lote)** e selecione a **pasta** com os arquivos
   (ex.: a pasta fix de uma rodada).
2. A caixa do lote lista os arquivos candidatos com o **tipo reconhecido pelo nome**
   (`etain`→ETAIN, `*topo*`→topografia, `*veg*`→vegetação, `*solo*`/`*soil*`→solo,
   `deta*`→níveis eta; o resto vem desmarcado como "ignorar"). Extensões claramente
   não-Fortran (imagens, docs, fontes, scripts) são filtradas de saída.
3. Ajuste como quiser: os **checkboxes** escolhem o que carregar e o **seletor de
   tipo** corrige a detecção (inclusive para "outro"). Vários topos/vegs/solos podem
   ser marcados (viram instâncias); ETAIN e níveis eta valem **um por lote**.
4. **📥 carregar selecionados** executa tudo na **ordem automática**:
   ETAIN → topografia/vegetação/solo/outro → níveis eta (que já ajusta a topografia
   carregada, como no botão 🏔). O status resume cada item com ✓/✗.

| Botão (menu 📂) | Arquivo | Observações |
|---|---|---|
| 📄 ETAIN | namelist com `&MODEL_GRIDS` | Preenche os parâmetros da grade. **Carregue antes das malhas** (IM/JM precisam bater) |
| ⛰️ Topografia | `etatopo.dat` (hgt+sm, 2× real*4) | Cria as camadas **topo** e **máscara**; endianness auto-detectada |
| 🌿 Vegetação / 🟫 Solo | int*4 (IM,JM) | Camadas categóricas (classes SiB/FAO — nomes de referência) |
| 📍 Pontos / Shape | `.shp` (+`.dbf` p/ rótulos), GeoJSON, CSV/lista `lat,lon[,nome]` | Selecione `.shp` e `.dbf` **juntos** para os rótulos; shapefile projetado (.prj em metros) deve ser convertido para graus |
| 📦 Outro | qualquer campo (IM,JM) Fortran unformatted | Detecta sozinho endianness, tipo (real/int) e estrutura: 1 campo, 2 campos (hgt+sm) ou **série de N registros** (opcionalmente com registro de nome `character*40`, como o 🗂 grava) — séries ganham a barra de **animação ⏵** sobre o mapa (§5.2) |
| 🏔 Níveis eta | arquivo `deta` (binário `deta+ldum`, ex.: `deta_50`) ou lista texto de DETA/interfaces ETA | Gera a **topografia ajustada aos degraus eta** (algoritmo do `prep/initbc/interp.f`, **incluindo a etapa de *sunken points***: terra afundada é elevada, água isolada é elevada, e montanhas que bloqueiam todos os ventos de um ponto são aplainadas) como **nova instância** — a original fica intacta. Requer topografia carregada; o campo **PT (Pa)** ao lado define o topo do modelo (ex.: 2500 = 25 hPa). O **LMH** de cada célula (máscara da topografia, `const.f`) vai para a camada "outro"; o status reporta as contagens de cada correção |

* **Várias malhas por tipo**: os botões de carga **acumulam** — cada arquivo vira uma
  instância distinta (topografias, vegetações, solos e "outros" podem coexistir). Com
  2+ instâncias de um tipo, aparece um seletor **"<tipo> ativa (N carregadas)"** no
  card: a instância escolhida é a usada no mapa, na edição, na máscara, no diff e como
  referência (um `*` no nome indica edições não salvas).
* A linha **✕ topo / ✕ veg / …** remove a **instância ativa** do tipo (as demais
  permanecem e a seguinte assume); **✕ shape** remove todos os shapes; **✕ perfil**
  remove só a **linha A→B** do perfil do mapa (as camadas ficam);
  **🗑 limpar tudo** remove tudo — inclusive a linha do perfil (pede um segundo clique
  se houver edições não salvas).
* Mensagens de erro do tipo `marcador=… ≠ esperado …` significam que IM/JM da grade não
  batem com o arquivo — confira o ETAIN.

### 5.1 Topografia ajustada aos níveis eta (🏔)

Reproduz o ajuste do prep do modelo (`initbc/interp.f`), que encaixa cada ponto da
topografia no degrau (interface eta) mais próximo:

1. Carregue o **ETAIN** e a **topografia** de referência.
2. Confira o **PT (Pa)** (topo do modelo; padrão 2500 Pa = 25 hPa — arquivos
   `deta_*_25mb`).
3. Clique **🏔 Níveis eta** e selecione o arquivo `deta` (binário do modelo, ex.:
   `deta_50`; também aceita lista texto de DETA ou de interfaces ETA 0…1).
4. A ferramenta aplica o encaixe **e a etapa de *sunken points*** (terra afundada sem
   vento em volta é elevada; água isolada é elevada; montanhas que bloqueiam todos os
   ventos de um ponto são aplainadas) e cria:
   * a **topografia ajustada** como nova instância (`<nome>_eta<LM>`, exibida; a
     original fica intacta no seletor de instâncias);
   * o **LMH** de cada célula (máscara da topografia do `const.f` = LHGT−1; mar = LM) como instância de "outro" (`LMH_eta<LM>_<nome>`).
5. O status reporta LM, PT, topo do modelo em metros, células alteradas e as contagens
   do *sunken points* (elevadas/aplainadas/restantes sem vento).
6. **Os níveis ficam guardados**: para ajustar outra topografia (ou outro PT), troque a
   instância ativa no seletor e clique **"🏔 aplicar níveis"** — sem recarregar o
   arquivo. É possível inclusive carregar os níveis antes da topografia.
7. **"📈 níveis"** abre o gráfico da discretização vertical: uma linha por interface na
   altura correspondente, rótulos com nº do nível, pressão (hPa) e altura (m) onde há
   espaço, barras com o **Δeta de cada camada** à direita, e leitura completa ao passar
   o cursor. Recursos do gráfico:
   * **Zoom**: roda do mouse sobre o gráfico (centrado no cursor) ou botões +/−/⟲ —
     essencial para ver as camadas finas próximas à superfície; a grade de altura se
     adapta (km → m). Com zoom ativo, aparece uma **barra de rolagem vertical** à
     direita: arraste o cursor (ou clique na pista) para posicionar a visualização no
     trecho desejado da coluna.
   * **Tema claro**: o gráfico usa fundo branco com linhas pretas (interfaces) e barras
     de Δeta em cinza — a camada selecionada fica em âmbar; o PNG sai no mesmo tema.
   * **📷 PNG**: salva o gráfico como imagem, com o título (arquivo/LM/PT) no cabeçalho.
   * **CSV**: exporta a tabela completa dos níveis — por interface: `l`, eta, pressão
     (hPa) e altura (m); por camada: Δeta e espessura em metros.
   * **Editar camadas**: clique numa camada (ou digite o nº) e informe o novo **Δeta**
     → "aplicar" ajusta a camada e **renormaliza as demais proporcionalmente**, de modo
     que **Σ Δeta = 1 sempre**.
   * **Mover uma interface**: aproxime o cursor de uma linha preta (o cursor vira ↕) e
     **arraste-a para cima/baixo** — o Δeta é redistribuído entre as duas camadas
     vizinhas (a soma das duas não muda, então **Σ = 1 é preservada exatamente**). A
     interface fica limitada entre as vizinhas.
   * **Alterar o topo do modelo**: o campo **"topo (hPa)"** muda o PT (ex.: 25 → 1 hPa)
     e **todas as camadas são recalculadas proporcionalmente**: as frações Δeta são
     mantidas sobre o novo intervalo de pressão [PT, 1013 hPa] (a espessura em pressão
     de cada camada escala pelo mesmo fator), pressões e alturas das interfaces são
     recalculadas e Σ Δeta = 1 é garantida. O campo PT (Pa) do card Carregar dados é
     sincronizado.
   * **✂ dividir**: inclui um novo nível dividindo a camada selecionada em duas metades
     (LM aumenta 1; Σ = 1 preservada automaticamente).
   * **✕ remover**: elimina a camada selecionada somando seu Δeta à vizinha
     (LM diminui 1; Σ = 1 preservada).
   * **↶ / ↷ desfazer e refazer**: os botões no cabeçalho (ou **Ctrl+Z** / **Ctrl+Y**
     com o gráfico aberto) desfazem e refazem as últimas ações do editor — alterar
     Δeta, mover interface (um passo por arrasto), dividir, remover e mudar o topo —
     até 100 passos, incluindo o PT associado a cada estado.
   * **💾 deta**: grava o conjunto editado como um novo arquivo `deta` no formato
     binário Fortran do modelo (`deta real*4 + ldum int*4`) — pronto para o prep. Um
     `*` no título indica edições ainda não salvas. Após editar, use
     **"🏔 aplicar níveis"** para regenerar a topografia ajustada com os níveis novos.
8. Para ver o efeito dos degraus: **Comparar (B−A)** entre ajustada e original, perfil
   A→B cruzando a cordilheira, ou o toggle `valores` no zoom alto.
9. **Nível L e pressão no ponto**: com a topografia **ajustada** ativa, o popup e o
   cartão "Ponto selecionado" mostram, além da elevação, o **nível L** da interface em
   que o ponto foi encaixado (o LHGT, já após o *sunken points*) e a **pressão** dessa
   superfície em hPa — o **L exibido é o LMH** (máscara da topografia do `const.f` = LHGT−1) — ex.: `1287 m · LMH=42 · 867.3 hPa`. **Terra ao nível do mar** (abaixo de meia camada inferior) aparece como `0.004 m (terra ao nível do mar)` — a sentinela do `interp.f`, distinta do oceano — e a célula (toggle `valores`) mostra `0.004` — a linha inferior da célula usa o rótulo explícito `LMH<n>`. Sobre o mar aparece
   `LMH=LM · 1013.2 hPa` (superfície). **Água continental** (rio/lago com o nível L
   ajustado) mostra a **topografia associada ao degrau** — não aparece mais como 0:
   o popup indica `água · 449 m · LMH=42 · 960.2 hPa`, a célula mostra os 449 m e, no
   corte vertical (§11), a coluna d'água desenha no degrau dela (a faixa azul marca a
   **superfície** da água). Mar de verdade segue `mar · 0 m`. Com o toggle
   **`valores`** ligado, cada célula mostra a mesma informação dentro do losango, em
   três linhas: **pressão na metade superior**, **altitude no centro** e **nível L na
   metade inferior** — tudo na mesma fonte e cor, com tamanho proporcional à célula e
   sempre contido nela.

### 5.2 Série multi-registro e animação (⏵)

Um arquivo com **vários registros** (IM,JM) — por exemplo, as 12 máscaras mensais de
áreas alagadas geradas pelo 🗂 (§9.2) — pode ser carregado inteiro pelo botão
**📦 Outro**:

1. A ferramenta detecta a sequência de registros (com ou sem o registro de nome
   `character*40` antes de cada campo) e carrega tudo como **uma única instância** de
   "outro" — o status informa `SÉRIE com N registros`.
2. Sobre o mapa aparece a **barra da série**: **⏵/⏸** anima em loop, o ***slider***
   alterna manualmente o registro, o seletor define a **velocidade** (0,5 a 8 quadros
   por segundo) e o rótulo mostra `nº/total · nome do registro`.
3. As **cores e a legenda são fixas para a série inteira** (min/máx/classes calculados
   sobre todos os registros) — as diferenças entre meses aparecem como mudança de cor
   real, não como reescala.
4. O registro exibido vale para tudo: popup, readout, perfil A→B, CSV e **📷 PNG** (o
   cabeçalho da imagem indica `registro nº/total "nome"` — para uma figura por mês,
   pare a animação no registro desejado e exporte).
5. **Salvar** ("outro" no card Editar/salvar) regrava a **série completa** no mesmo
   formato lido (nomes preservados); edições de célula valem para o registro exibido.
6. **Exportar a animação**: os botões da barra baixam a série inteira como vídeo, na
   velocidade do seletor e com o mesmo conteúdo do 📷 PNG (cabeçalho da grade com o
   nº/nome do registro, camada, costa, shapes e anotações — na resolução da tela):
   * **🎬 WebM** — vídeo comprimido (VP9/VP8), ideal para apresentações; a gravação é
     em **tempo real** (12 registros a 1 q/s ≈ 12 s gravando; o status acompanha).
   * **🎞 GIF** — GIF animado em **loop infinito**, roda em qualquer lugar (slides,
     e-mail, wiki); gerado internamente (sem bibliotecas), até 256 cores por quadro
     (quantização automática) — arquivos maiores que o WebM.
7. **Comparar dois registros da série** (ex.: janeiro × julho): no card
   **Comparar (B−A)**, os seletores A/B listam **cada registro** como
   `outroN#k — reg k/N "nome"` — escolha dois e **▶ comparar selecionadas** (§10).

## 6. Legenda e paletas

O card **Legenda** acompanha a camada ativa.

**Isolinhas e bandas** (topografia e "outro" contínuo): a linha *isolinhas* do card
liga os **contornos** sobre o mapa (intervalo na unidade do campo — ex.: 200 m — ou
vazio para automático com ~8 níveis "redondos"), com **rótulos** opcionais nos
próprios contornos; o checkbox **bandas** quantiza as cores do campo nos mesmos
níveis (*filled contour*). Os contornos acompanham zoom/pan e saem no 📷 PNG.

Para a camada **Outro** contínua há
controles extras: **paleta** (15 opções: Viridis, Inferno, Plasma, Magma, Cividis,
Turbo, Jet, Cinza, Azul–Branco–Vermelho, Spectral, Vermelho–Amarelo–Azul, Coolwarm,
Seismic, Terrain, Oceano — mais as escalas de Topografia/Vegetação/Solo),
**inverter**, **escala fixa** (min/max manuais), **cores por faixa** (discretização
em N faixas) e **↺ padrão** para restaurar.

### 6.1 Filtrar a visualização da camada ativa

Na Legenda, a linha **"filtrar visualização"** mostra **só as células que casam com o
filtro** — as demais ficam escuras (o resto da ferramenta não muda: perfil, CSV e
edição continuam vendo tudo; o filtro entra no PNG):

* **Vegetação / solo / outro (inteiro)**: escolha **uma classe** no seletor
  (com o nome SiB/FAO quando houver). Máscara: continente ou água.
* **Topografia / outro (contínuo)**: digite **mín** e/ou **máx** (vazio = sem limite;
  os placeholders mostram a faixa real do campo). Ex.: só o terreno entre 800 e
  1500 m.
* O contador informa quantas células passam no filtro. Trocar de camada **desliga**
  o filtro automaticamente (para não ficar um filtro "fantasma" de outra camada).

## 7. Editar / salvar malha

**☑ por malha (2026-07-18):** cada campo do editor (elev, másc, veg, solo, outro) tem
um **checkbox** que marca se aquela malha será alterada pelo **Aplicar** e pela
**pintura** (fixar valores). Desmarque o que deve ficar intacto — ex.: para trocar só
o tipo de vegetação, deixe marcado apenas **veg cl** (elevação, máscara e solo não são
tocados, mesmo com valores nos campos). O campo desmarcado fica esmaecido/desabilitado.


**⧉ duplicar malha**: duplica a malha da camada ativa como **nova instância** — a
cópia vira a ativa e a original permanece nos seletores de instância, no **Comparar**
e na **calculadora**. É o caminho para "editar e comparar com a original" sem
salvar/recarregar: ative a camada (ex.: vegetação), clique ⧉, aplique as edições
(ex.: trocar classe 1 → 6) e compare `veg1 × veg2` no card Comparar. Séries
multi-registro são duplicadas com todos os registros.


Aparece quando há malha carregada e um ponto selecionado.

* **Edição por ponto**: os campos mostram os valores de *todas* as malhas no ponto
  (elev, másc 0/1, veg, solo, outro); altere e clique **Aplicar** (ou Enter).
* **Pintura**: marque "fixar valores — pintar…" e cada clique no mapa aplica os valores
  fixados a todas as malhas.
* **🎨 destacar valor** (2026-07-13): pinta no mapa, com uma **cor à sua escolha**,
  todas as células da **camada ativa** cujo valor é igual ao digitado — o contador ao
  lado mostra quantas células casam. É a forma de **enxergar onde você pintou** um
  valor-marcador: ex., pinte células da máscara com −2, digite −2 no destaque e elas
  aparecem na cor escolhida (ao ligar com o campo vazio, o valor é herdado do campo de
  edição da camada ativa). Campos reais casam o valor exato (precisão float32);
  inteiros arredondam. O destaque é só **visual** (não altera o dado, não sai no
  arquivo salvo) — mas **sai no 📷 PNG/vídeo**, pois é parte do mapa. A cor fica salva
  nas preferências.
* **Máscara aceita valor-marcador**: a edição/pintura da máscara agora grava o valor
  **como digitado** (antes forçava 0/1). Um valor fora de 0/1 (ex.: −2) funciona como
  marcador temporário: o popup mostra `−2 (marcador ≠0/1)`, o status avisa ⚠, e o
  mapa continua colorindo pela regra >0,5 (use o 🎨 destaque para vê-los). **Antes de
  salvar para o modelo, converta os marcadores de volta** (ex.: "trocar valor em
  máscara: de −2 por 0") — o modelo espera estritamente 0/1.
* **Trocar valor**: substitui todas as ocorrências de um valor na **camada ativa**
  (campos reais aceitam tolerância ±; inteiros casam exato).
* **Salvar**: escolha o nome em "salvar como" e use 💾 topografia / vegetação / solo /
  outro. O arquivo sai **no mesmo formato Fortran lido** (a máscara é gravada junto com
  a topografia, como o modelo espera; endianness preservada).
* **↶ desfazer** (ou Ctrl+Z): desfaz a última modificação — vale para edição de ponto,
  pintura, trocar-valor e aplicação de máscara por shape (até 2000 passos).

## 8. Shape / pontos no mapa

* **Vários shapes ao mesmo tempo**: o botão **📍 Pontos / Shape acumula** — cada arquivo
  carregado vira um shape na lista, com uma **cor própria** (paleta automática) e todos
  são desenhados juntos. O seletor **"shape ativo"** no card "Máscara por shape / lista"
  define qual deles é usado nas operações de máscara e geração de malha;
  **✕ ativo** remove só o shape selecionado (✕ shape no card Carregar dados remove todos).
* **Cor do shape**: seletor de cor no topo do card — muda ao vivo as linhas,
  preenchimento, pontos e rótulos do **shape ativo**.
* **Ligar/desligar**: botão `shape`/`pontos` na barra do mapa.
* **Plotar só polígonos relevantes**: o checkbox *"plotar só polígonos com ≥ 1 célula
  inteira da grade dentro"* oculta polígonos pequenos demais para conter uma célula
  inteira na resolução atual (útil para hidrografia densa). O status informa quantos
  passaram no filtro. O filtro é recalculado automaticamente se a grade mudar.
* Arquivos muito densos (dezenas de milhares de polígonos) são desenhados com nível de
  detalhe automático — polígonos menores que ~3 px viram pontinhos ("poeira") e o
  detalhe completo aparece ao aproximar.
* **Rótulos sem sobreposição**: rótulos de pontos que ficariam uns sobre os outros são
  omitidos automaticamente (anti-colisão) — aproxime o zoom para vê-los todos.

## 9. Máscara por shape / lista (alterar malhas ou gerar malha nova)

### 9.1 Alterar as malhas carregadas

1. Confira o **shape ativo** no seletor do topo do card (com vários shapes carregados,
   é ele que define "dentro").
2. Marque as **malhas a alterar** (checkbox por malha: topo, máscara 0/1, vegetação,
   solo, outro) e informe o valor **dentro** de cada uma (e **fora**, se aplicável).
3. **manter valores externos** (ligado por padrão): altera apenas dentro do
   shape/pontos, preservando o resto da malha. Desmarcando, o valor **fora** preenche
   todo o restante do domínio.
4. **aplicar em um clone da malha**: quando marcado, a(s) malha(s) selecionada(s) são
   **duplicadas antes** da aplicação — a mudança vai para o clone (que vira a instância
   ativa, nome `<original>_clone`) e o **template original fica intacto** no seletor de
   instâncias, pronto para definir a próxima máscara.
5. *"aplicar máscara / gerar malha usando SÓ os polígonos filtrados"*: quando marcado,
   a operação ignora polígonos sem célula inteira dentro (mesmo critério do filtro de
   plotagem).
6. Clique **Aplicar às selecionadas**. O conjunto de células internas é calculado uma
   única vez e aplicado a todas as malhas marcadas. Com lista de pontos (sem polígono),
   cada ponto marca a célula mais próxima.
7. Confira o resultado no mapa; **↶ desfazer** (no próprio card ou no card Editar, ou
   Ctrl+Z) reverte a aplicação inteira de uma vez.
8. Grave com os botões 💾 do card **Editar / salvar malha** (salvam a instância ativa).

### 9.2 Gerar uma NOVA malha a partir de uma referência

Uso típico: criar uma máscara nova a partir da máscara oceano/continente + um shape de
bacia, **sem tocar** nas malhas carregadas.

1. Escolha a **referência** (ex.: oceano/cont) e o valor **dentro** do shape.
2. Dê um nome em "salvar como" (vazio = `nova_<arquivo da referência>`).
3. **🧩 gerar e salvar nova malha**: usa o **shape ativo**. Fora do shape a referência é
   mantida intacta; dentro entra o valor. O arquivo é baixado como **campo único**
   (IM,JM): referência topografia → grava só a **elevação**; referência máscara → grava
   só a **SM** alterada; veg/solo → int*4; "outro" de 2 campos → só o campo ativo.
   A malha de referência **não muda**, e além do download a malha gerada é
   **adicionada automaticamente como uma nova instância da camada "outro"** e exibida
   no mapa para verificação imediata (a referência continua disponível no seletor de
   instâncias).
4. **🗂 1 malha por shape (arquivo único)**: gera uma malha para **cada shape
   carregado** (na ordem de carregamento) e grava todas num **único arquivo Fortran
   multi-registro** — 1 registro (campo único IM×JM) por shape, mesma referência e mesmo
   valor "dentro" para todos. Com **"identificar cada registro com o nome do shape"**
   marcado (padrão), cada malha é precedida de um registro `character*40` com o nome do
   arquivo do shape — leitura em Fortran:

   ```fortran
   character*40 nome
   real*4 campo(IM,JM)
   do k = 1, N
     read(u) nome
     read(u) campo
   enddo
   ```

   Desmarcando, o arquivo sai só com os campos em sequência. Além do download, **cada
   malha gerada entra como uma instância da camada "outro"** (nomes `1_<shape>`,
   `2_<shape>`, …) — a primeira é exibida no mapa e as demais ficam no seletor de
   instâncias para verificação, sem alterar a referência. Uso típico:
   **sazonalidade de áreas alagadas** — carregue 12 shapes mensais da área inundada,
   referência = máscara oceano/continente, e o arquivo sai com 12 máscaras mensais
   identificadas. O status lista quantas células cada shape marcou. O checkbox "usar SÓ
   os polígonos filtrados" vale para todos os shapes.

**Σ estatísticas** (mesmo card): calcula, para as células **dentro do shape ativo**,
o nº de células e a **área física** (km², exata por cos da latitude rotacionada),
mín/máx/média da **topografia** (todas as células e só terra), o percentual de
**água**, a distribuição de **classes** de vegetação/solo (top 8 com %) e mín/máx/
média (ou classes) do campo "**outro**". Respeita o filtro de polígonos, se marcado.

## 10. Comparar dois arquivos (card "Comparar (B − A)")

1. **Duas malhas já carregadas/geradas** (forma mais rápida): escolha **A** e **B**
   nos seletores — as opções usam a nomenclatura da calculadora (`topo1`, `mask1`,
   `veg1`, `outro2`… com o arquivo de cada uma) e incluem instâncias geradas
   (ajustadas, LMH, resultados da calculadora…). Se uma instância de "outro" for uma
   **série**, cada registro vira uma opção própria (`outro1#3 — reg 3/12 "mar"`) —
   dá para comparar **dois registros da mesma série** (ex.: sazonalidade jan × jul)
   ou registros de séries diferentes. **▶ comparar selecionadas** exige
   tipos compatíveis (contínua×contínua ou classes×classes).
2. **Ou compare com arquivo**: escolha a **camada A** (malha carregada) — ou carregue
   um **📂 arquivo A** externo (usado no lugar da camada; **✕ A** desfaz) — e então
   carregue o **arquivo B** (mesmo formato e mesma grade).
3. A camada **diff** entra no mapa:
   * Campos **contínuos** (topo, máscara, outro-real): B−A em paleta divergente —
     azul = B menor, vermelho = B maior, cinza-escuro = igual; escala simétrica.
   * Campos **de classes e máscara** (máscara, veg, solo, outro-int): a diferença
     numérica não faz sentido, então o diff vira uma **máscara de alterações 0/1** —
     células sem alteração (0) em cinza-escuro e alteradas (1) em âmbar; o popup
     mostra o detalhe (`1 · alterado (3 → 5)`) e a célula (toggle `valores`) mostra
     0/1.
4. A legenda traz o total de células diferentes e as estatísticas (Δ min/máx/média).
5. O card lista as **30 maiores diferenças** — clique em uma linha para localizar a
   célula no mapa — e o botão **⇩ CSV das alteradas** exporta todas
   (`I,J,lat,lon,A,B,diff`). O botão **💾 máscara 0/1** salva a **máscara de
   alterações** (0 = sem alteração, 1 = alterado; int*4 Fortran) e a adiciona como
   instância de "outro" — dá para usá-la na máscara por shape, na calculadora ou
   num novo diff. Funciona para qualquer diff (contínuo ou de classes).
6. O diff usa uma **cópia** de A: editar ou remover a camada depois não invalida a
   comparação. `✕ diff` remove a camada.
7. **Paleta do diff** (na Legenda, com diff contínuo ativo): escolha a paleta única
   (o zero fica no centro, escala simétrica ±M; "Padrão" é o azul–escuro–vermelho de
   sempre) com opção de **inverter**; ou marque **paletas distintas − / +** e escolha
   uma paleta para Δ negativo e outra para Δ positivo (a intensidade cresce a partir
   do zero em cada lado). A **faixa neutra** pinta com **uma cor única** (seletor de
   cor) todas as diferenças com |Δ| até o limiar digitado — útil para destacar só o
   que passa de um valor. O seletor **mostrar** plota **só as diferenças positivas** ou
   **só as negativas** (as do outro sinal ficam cinza-escuro, como as células sem
   diferença; a legenda avisa o filtro ativo). Células **sem** diferença continuam
   cinza-escuro. Paletas e faixa ficam salvas nas preferências (§12.1); o filtro de
   sinal é da sessão.

### 10.0 Calculadora de malhas (card próprio)

Gera uma **nova malha** avaliando uma expressão em cada célula da grade (vira
instância de "outro", exibida no mapa e salvável pelo card Editar/salvar):

1. As **variáveis** são as malhas carregadas, numeradas por instância — `topo1`,
   `mask1`, `veg1`, `solo1`, `outro1`, `topo2`… (a lista aparece no card, com o
   arquivo de cada uma) — mais `i`, `j` (índices de grade) e `lat`, `lon`.
2. Operadores: `+ − * / %`; comparações `== != > < >= <=` valem **0/1**; lógicos
   `&& || !`; condicional `c ? a : b`; funções `abs sqrt round floor ceil exp log
   log10 min max pow mod sin cos tan`.
3. Exemplos: `topo2-topo1` (diferença como campo), `veg1==12?1:0` (máscara da classe
   12), `(mask1==0)*topo1` (topografia só na terra), `lat<-20&&topo1>1000?1:0`.
4. Marque **inteiro (int*4)** para arredondar o resultado (classes/máscaras); células
   não-finitas (ex.: divisão por zero) viram 0 e são contadas no status.

### 10.1 Consistência topo × máscara (card próprio)

Verifica se a topografia **ativa** e sua máscara oceano/continente estão coerentes —
útil, por exemplo, após o ajuste aos níveis eta (§5.1):

1. (Opcional) escolha outra instância de topografia em **"comparar máscara com"** —
   ex.: original × ajustada — para conferir se a máscara mudou entre elas (no ajuste
   da plataforma ela **nunca** muda; qualquer diferença veio de edição ou de outro
   arquivo).
2. Clique **🔎 verificar**. A ferramenta varre a malha e reporta:
   * **terra h ≤ 0** (âmbar) — continente ao nível do mar ou abaixo (o prep do modelo
     usa a sentinela 0,004 m para evitá-lo);
   * **água h > 0** (vermelho) — água elevada, ex.: criada pela etapa *sunken points*;
   * **água isolada** (azul) — célula de água sem nenhum vizinho H de água
     (mesma vizinhança diagonal da grade E usada pelo `interp.f`);
   * **terra isolada** (rosa) — célula de terra cercada de água;
   * **máscara difere** (branco) — células cuja máscara difere da instância escolhida.
3. As células achadas são **marcadas no mapa** (pontos coloridos; teto de 15 mil) e
   listadas por categoria — clique numa linha para localizar. **✕ marcas** limpa.
4. **Correções em um clique** (aparecem quando aplicáveis): *água elevada → terra*,
   *água isolada → terra* (sm=0; altitude ≤ 0 recebe 0,004 m) e *terra h≤0 → 0,004 m*.
   Com **"aplicar em um clone"** marcado (padrão), a correção cria uma nova instância
   e a original fica intacta; a varredura roda de novo automaticamente. Ctrl+Z desfaz;
   salve o resultado pelo card **Editar / salvar malha**.

## 11. Perfil A→B

1. Com uma camada ativa, clique em **perfil** e depois em dois pontos do mapa (A e B).
2. O modal mostra **um gráfico por malha carregada** (elevação, máscara, veg, solo,
   outro, diff) ao longo da reta A→B, com distância em km.
3. Controles: **eixo** (i,j/PE ⇄ lat/lon), zoom (roda do mouse ou botões), hover com
   leitura de todos os campos, **CSV** exporta as 220 amostras.
4. **Corte vertical com os níveis eta**: com topografia carregada **e** níveis eta
   (🏔) na memória, o primeiro gráfico do modal (mais alto que os demais) vira o
   **corte A→B**: as interfaces eta aparecem como linhas horizontais nas alturas da
   atmosfera padrão (nº da interface à esquerda, pressão em hPa à direita) e o
   **terreno em degraus** por célula amostrada (mar em azul na base). O teto do
   gráfico se ajusta ao terreno mais alto da janela (+2 camadas de folga) e acompanha
   o zoom horizontal. Com a topografia **ajustada** ativa, o hover mostra também
   o `LMH` e a pressão da superfície do ponto, e o CSV ganha as colunas `LMH`/`p_hPa` —
   é a forma direta de ver onde a cordilheira corta cada camada.

### 11.1 LMH e HTM por nível (🧱)

Com uma topografia **ajustada** ativa, o card Carregar dados mostra a linha 🧱:

* **🧱 LMH** — gera a malha LMH (nº de camadas atmosféricas por célula = LHGT−1,
  exatamente como o `const.f`; mar = LM) como instância de "outro" (int*4).
* **🧱 HTM do nível** — digite a camada L e gere a máscara HTM desse nível
  (1 = atmosfera, 0 = subterrâneo; `const.f`: HTM(l)=1 ⟺ l ≤ LMH). O status informa
  a pressão média da camada e quantas células estão no subterrâneo.
* **🧱 série HTM** — gera **um registro por nível** de uma faixa (digite `L1-L2` no
  campo, ou deixe vazio para ir da primeira camada cortada pelo terreno até LM) como
  **série animável** (barra ⏵ sobre o mapa — percorra a coluna vertical vendo a
  montanha "crescer" nível a nível). Salvar grava o arquivo Fortran multi-registro
  com os nomes (`HTM L=n ~p hPa`). Faixas muito longas são limitadas pela memória
  (o status indica o teto para a grade atual).

## 11.2 INIT · BNDY · CNST · RESTRT (binários do initbc e do etafcst)

A ferramenta lê os **três arquivos finais do pré-processamento** que o modelo consome —
`INIT.file` (condição inicial), `BNDY.file.*` (condições de contorno) e `CNST.file`
(constantes) — e também o **`RESTRT#######.t00s`** (arquivo de **reinício** gravado pelo
quilt do etafcst durante a rodada). A leitura é feita **por fatias** — arquivos de
centenas de MB ou GB abrem sem pesar na memória do navegador.

### 11.2.1 Carregar e validar

1. Carregue **antes** o ETAIN do domínio (IM/JM precisam bater com o arquivo).
2. Menu **📂 Carregar** → **🌀 INIT**, **🔄 BNDY**, **🧊 CNST** ou **💾 RESTRT** (ou pelo
   lote 📁 — os nomes `INIT.file`/`BNDY.file.*`/`CNST.file`/`RESTRT*` são reconhecidos
   automaticamente).
3. O card **INIT · BNDY · CNST · RESTRT** (grupo Análise) aparece com a linha de informações:
   * **INIT** — LM e NSOIL (deduzidos dos tamanhos de registro), data/hora, nº de registros;
   * **BNDY** — LB (= 2·IM+JM−3, conferido com a grade), LM, tempos de contorno e Δt;
   * **CNST** — LM, NSOIL, DT, PT, e a **grade gravada no arquivo** (TLM0D/TPH0D/DLMD/DPHD)
     comparada com os parâmetros da tela (⚠ se divergirem);
   * **RESTRT** — LM e NSOIL (deduzidos), data/hora inicial, NTSD, **hora de previsão**
     (IHOUR), rótulo do arquivo, nº de registros e a **grade gravada** (TPH0D/TLM0D,
     conferida com a tela). Se o arquivo estiver **truncado** (quilt interrompido), a
     linha mostra quantos registros existem, o **% do layout completo** e **em qual
     campo o arquivo parou**.

   A estrutura inteira é validada registro a registro; se IM·JM (ou LB) não bater com a
   grade, a mensagem diz exatamente o que carregar.

4. **O CNST alimenta os níveis eta automaticamente**: ao carregar o `CNST.file`, a
   distribuição DETA gravada nele (e o PT do modelo) é extraída e os botões
   **📈 níveis** (representação + edição da distribuição, §5.1) e **🏔 aplicar
   níveis** (ajuste da topografia ativa) aparecem — sem precisar de um arquivo
   `deta` avulso. Um `deta` carregado pelo usuário tem prioridade (o CNST não o
   substitui). Editar a distribuição no 📈 **não altera o CNST.file**: salve o
   `deta` editado (💾 no editor) e rode o initbc novamente para regenerar
   INIT/BNDY/CNST com a nova distribuição.

### 11.2.2 Plotar campos (🖼)

Escolha **arquivo → campo → nível L** (e, no BNDY, **tempo** e **valor/tendência**) e
clique **🖼 plotar** — o campo vira a camada **"outro"** e herda tudo: paletas, escala
fixa, isolinhas, perfil A→B, CSV e PNG. Trocar campo/nível/tempo **re-plota na hora**.

* Unidades de exibição: **PD/PDB/PDOMG/PSLP/PSHLTR em hPa** e **Q/QB/QS/QZ0/Q10/QSHLTR/
  Q100 em g/kg** (o arquivo continua em Pa e kg/kg); tooltip com 6 dígitos significativos.
* **Nível em hPa e km**: para campos 3D, o rótulo ao lado do "nível L" (e o nome da
  camada plotada e o status) mostra **η, a pressão nominal (≈ hPa) e a altitude
  (≈ km)** do nível médio L — pressão da coluna padrão de 1013,25 hPa ao nível do mar
  (p = PT + η·(1013,25 − PT)) e altitude na **atmosfera padrão do modelo**
  (econstants.h, a mesma do interp.f e do editor de níveis). Requer o **CNST**
  carregado (η e PT vêm dele) ou um arquivo de **níveis eta** + campo PT. É um valor
  **nominal de referência** — a pressão real do ponto (p = PT + η·PD) aparece no
  **📈 perfil vertical**. Camadas de solo ficam como "camadas de solo".
* **hPa/km no hover e na célula**: com um campo 3D plotado, o hover/Consulta mostra
  `valor · L<n> · <p> hPa · <z> km` e o rótulo da célula (zoom alto, "valores nas
  células") usa o layout de 3 linhas (pressão ↑ · valor · nível ↓, como na topografia
  ajustada). Quando o arquivo tem PD (INIT/RESTRT), a pressão é a **real do ponto**
  (p = PT + η·PD(i,j), PD cacheado ao plotar — 1 leitura de IM·JM·4 bytes); sem PD
  (CNST/BNDY), a nominal, marcada com **≈**.
* **BNDY** é desenhado como a **fila única da fronteira** (LB pontos). A "espessura
  visual" replica o ponto mais próximo para dentro apenas para enxergar o anel em zoom
  baixo — não existe no arquivo (o status avisa quando está ativa).
* U/V (e os campos "de vento" do CNST) vivem em **pontos V** da grade E — na plotagem
  ficam meia célula deslocados.

### 11.2.3 Checagem de valores não físicos (🔎)

**🔎 valores não físicos** varre **NaN/Inf** e faixas físicas por variável (ex.:
T 140–340 K, Q 0–40 g/kg, |U|,|V| ≤ 150 m/s, PD 20–1080 hPa, umidade do solo 0–1,
máscaras 0/1; tendências do BNDY até a faixa inteira por hora). Escopo: **campo
selecionado** (todos os níveis/tempos) ou **arquivo inteiro**. O relatório lista, por
campo: mín/máx, nº de valores, NaN/Inf e fora da faixa — com até 6 **ofensores
clicáveis** (I,J[,L][,t]) que localizam a célula no mapa. Campos sem faixa definida
(coeficientes do CNST) são checados só contra NaN/Inf.

### 11.2.4 Corte vertical (📊) e perfil vertical (📈)

Para campos com dimensão vertical (T/Q/U/V do INIT, TB/QB/… do BNDY, HTM/VTM do CNST,
T/Q/U/V/Q2/CWM/TTND/TRAIN/TCUCN/OMGALF/RSWTT/RLWTT do RESTRT e os de solo):

* **📊 corte vertical** — INIT/CNST/RESTRT: seção **distância × nível** ao longo da
  linha traçada no mapa; BNDY: a **orla desenrolada** (k = 1..LB × nível) com
  separadores sul → norte → oeste → leste. Com CNST/níveis eta carregados, o **eixo Y
  mostra, além do L, a pressão (hPa) e a altitude (km) nominais** de cada nível
  (coluna padrão de 1013,25 hPa, atmosfera padrão do modelo) — o hover repete
  η · ≈hPa · ≈km do nível sob o mouse. O **subterrâneo** (camadas abaixo do LMH/LMV do CNST,
  ou da topografia ajustada 🏔) aparece em cinza e **fica fora da escala de cores**.
* **📈 perfil vertical** — sondagem no ponto **selecionado** (clique ou Consulta);
  no BNDY salta para o ponto de fronteira mais próximo (o k é informado). Eixo direito
  com **η** (do CNST) e, quando há PD disponível, a **pressão real** p(L) = PT + η·PD —
  o PD vem do **próprio arquivo** (INIT ou RESTRT; no BNDY, do PDB), com o INIT como
  reserva. Com a janela aberta, **clicar em outro ponto do mapa atualiza o
  perfil** automaticamente.

Ambos abrem em **janela flutuante**: o mapa continua interativo por baixo; arraste a
janela pelo cabeçalho e **redimensione pelo canto** (o gráfico se adapta). **Zoom**:
roda do mouse (centrado no cursor), arraste dentro do gráfico = pan, **duplo-clique
= enquadrar tudo**. Hover mostra (I,J), lat/lon, distância ou k, nível, η/p e o valor.
**CSV** exporta a matriz da seção (amostras × níveis) ou a coluna do perfil
(L, η, p, valor); **📷 PNG** salva o gráfico.

### 11.2.5 Linha composta com vértices arrastáveis (✏️)

Para cortes que não cabem numa reta:

1. **✏️ linha multi** → clique no mapa em cada vértice (V1, V2, V3, …);
   **duplo-clique encerra** (ou clique o botão de novo).
2. **📊 corte vertical** passa a seguir o traçado inteiro (amostras proporcionais ao
   comprimento de cada segmento; os vértices aparecem como linhas tracejadas âmbar
   no gráfico).
3. **Arraste qualquer vértice no mapa**: com a janela do corte aberta, ela **atualiza
   dinamicamente durante o arrasto** (só os segmentos vizinhos são relidos) e faz o
   recálculo completo ao soltar o mouse. O zoom do gráfico é preservado.
4. **✕ linha** remove o traçado. Sem linha composta, o corte usa a reta A→B do
   botão "perfil" (§11).

### 11.2.5b Vento em vetores e streamlines (🌬)

Para arquivos com U e V 3D (INIT e RESTRT), o grupo **vento U+V** plota o vento do
**nível L** escolhido como overlay sobre o mapa — em cima de qualquer camada:

* **vetores** — setas nos pontos da grade (decimadas para ~30 px de espaçamento na
  tela; densidade denso/médio/esparso), comprimento ∝ |V| e **cor pela velocidade**
  na paleta ativa;
* **barbs (kt)** — convenção meteorológica em nós: **meia-pena = 5 kt, pena = 10 kt,
  bandeirola = 50 kt** (arredondado aos 5 kt), **círculo = calmaria** (<2,5 kt); a
  haste aponta **de onde o vento vem** e as penas são **espelhadas no hemisfério
  sul** (WMO — decididas pela latitude geográfica de cada ponto); espaçamento maior
  que o dos vetores, mesma cor por velocidade;
* **streamlines** — linhas de corrente integradas no campo (RK2 no espaço da grade,
  para frente e para trás, com setas de direção); a **direção geográfica é exata**:
  sai do mapeamento da grade rotacionada, sem aproximações de rotação de vento;
* **vetores + linhas** (padrão) e **barbs + linhas** — símbolos + streamlines.

O overlay **acompanha zoom e pan** (redesenho adaptativo — mais perto, mais setas por
km), **entra no PNG exportado**, mascara o **subterrâneo** (LMV do CNST) e ignora
NaN. O status informa |V|máx e o nível (com ≈hPa/≈km). **✕ vento** remove;
trocar o nível L e clicar 🌬 de novo replota.

O campo **"nível L" fica sempre visível** quando o arquivo tem qualquer variável 3D
— mesmo com um campo 2D selecionado (ex.: PSLP), o nível continua editável e é ele
que define **onde o 🌬 vento é plotado** (o rótulo passa a indicar "vale p/ o vento e
os campos 3D", com η/hPa/km).

**⏵ níveis** anima o vento varrendo os níveis (topo → superfície, em loop; velocidade
lento/médio/rápido): cada nível é lido do arquivo **sob demanda** e fica num cache
(~250 MB, LRU) — a segunda volta é instantânea. O campo "nível L" e o rótulo
η/hPa/km acompanham; a **escala de cor** usa o |V|máx corrente entre os níveis/tempos
já vistos (estável após a primeira volta). Clique de novo para pausar.

**⏵ tempos** (aparece com 2+ RESTRT carregados, §11.2.5c) anima o vento **no tempo**,
percorrendo os RESTRT no **nível L fixo** — mesmo cache preguiçoso, agora com chave
tempo × nível (as duas animações compartilham o que já foi lido). O seletor "tempos
(RESTRT)" mostra o tempo em exibição (sem trocar o arquivo ativo do card); tempos
truncados sem o nível são pulados. As duas animações são mutuamente exclusivas —
iniciar uma pausa a outra.

A animação do vento também **exporta em 🎬 WebM / 🎞 GIF**: escolha a dimensão no
seletor **export: níveis / tempos** e clique — o quadro é a **vista atual do mapa**
(com o cabeçalho, que agora inclui a linha do vento: nível, ≈hPa, tempo e |V|máx —
cada quadro se autodescreve), no ritmo da velocidade escolhida. Antes de gravar, uma
**pré-passada** carrega todos os quadros no cache e **fixa a escala de cor** no
|V|máx global — as cores não mudam no meio do vídeo. Ao terminar, o vento volta ao
nível/tempo original. Enquadre o mapa (zoom/pan) antes de exportar. U/V são componentes da grade
rotacionada em pontos V — o desenho usa o mapeamento contínuo da grade (viés ≤ ½
célula, invisível nessa escala).

### 11.2.5c Série temporal com vários RESTRT (🎞)

**Corte vertical animado no tempo**: com 2+ RESTRT carregados, a janela do 📊 corte
ganha o botão **⏵ tempos** (+ velocidade) — a seção é relida de cada RESTRT com a
**linha e o zoom fixos** (cache por tempo: a primeira volta lê, as demais são
instantâneas; a escala de cor é a **união dos tempos já vistos**, estável após a
primeira volta; o título mostra o +Nh em exibição, e sai no 📷 PNG). Tempos
truncados sem os níveis da seção são pulados; arrastar um vértice pausa (o corte é
reconstruído ao soltar). Hover e CSV sempre refletem o tempo em exibição.

A animação do corte também **exporta**: **🎬 WebM** (gravação em tempo real no ritmo
da velocidade escolhida) e **🎞 GIF** (loop infinito, encoder embutido) — cada quadro
sai com o título `+Nh`, no tamanho atual da janela (redimensione antes p/ mudar a
resolução).


Carregue **2 ou mais RESTRT** da mesma rodada (o botão 💾 aceita **seleção múltipla**;
o lote 📁 também; recarregar o mesmo nome substitui). No card aparecem:

* **tempos (RESTRT)** — seletor do arquivo **ativo** (ordenado por hora de previsão);
  trocar preserva o campo/nível selecionado e re-plota;
* **🎞 série temporal** — extrai o **campo/nível selecionado de todos os tempos** e
  monta uma **série** na camada "outro": a **barra ⏵ sobre o mapa** (a mesma das
  séries de arquivo) anima/alterna os tempos, com slider, velocidade e exportação
  **🎬 WebM / 🎞 GIF**. A escala de cor é **global** (fixa entre os tempos, como nas
  séries); tempos truncados sem o campo/nível são pulados com aviso. Vale para
  **qualquer variável do catálogo** (2D, nível de 3D ou camada de solo). Na série, o
  hover/célula mostram o hPa/km **nominal** (≈) — o PD varia entre os tempos.

### 11.2.5d Controle de animação comum (🔗 sincronizar)

Com 2+ RESTRT carregados, o card traz **🔗 sincronizar** (ligado por padrão): as
animações temporais dos campos em exibição andam **juntas**, venha o comando de onde
vier —

* a **barra ⏵ da série** no mapa (play, slider ou clique) arrasta o **vento** e o
  **corte vertical** para o mesmo tempo;
* o **⏵ tempos do vento** arrasta o **campo composto** (série 🎞 no mapa) e o corte;
* o **⏵ tempos do corte** arrasta a série e o vento;
* trocar o **seletor "tempos (RESTRT)"** sincroniza os três.

A origem nunca é re-disparada (sem loops); componentes sem o tempo pedido (série sem
aquele registro, tempo truncado) simplesmente não mudam. Os **exports em WebM/GIF
esperam a sincronização** antes de capturar cada quadro — o vídeo da série sai com o
vento acompanhando, e o vídeo do vento (dimensão tempos) sai com o campo composto
acompanhando. Desmarque 🔗 para animar cada um por conta própria.

### 11.2.6 RESTRT — o que tem dentro e truncamento

O `RESTRT#######.t00s` é o estado completo da rodada no instante da gravação (layout do
`QUILT.f90`; o utilitário `util/scan_restrt.f90` documenta e varre o mesmo formato pelo
terminal). O catálogo do card traz **~95 campos**, organizados por grupos:

* **Dinâmica/termodinâmica 3D** (1..LM): T, Q, U, V, Q2 (2·ECT), CWM, TTND, TRAIN,
  TCUCN, OMGALF, RSWTT, RLWTT;
* **Superfície e pressão**: PD, RES, FIS, PSLP, PDOMG/RESOMG;
* **Precipitação**: PREC, ACPREC, ACCLIQ, CUPREC, CUPPT, SR;
* **Diagnósticos de nível baixo**: TSHLTR/QSHLTR/PSHLTR (2 m), TH10/Q10/U10/V10,
  TH100/Q100/U100/V100, TLMIN/TLMAX, MAXWU/MAXWV;
* **Trocas superfície–atmosfera**: THS, QS, TWBS, QWBS, AKMS/AKHS, USTAR, Z0,
  THZ0/QZ0/UZ0/VZ0, XMOMFLUX/YMOMFLUX, e os acumulados SFCSHX/SFCLHX/SUBSHX/SNOPCX/
  SFCUVX/SFCEVP/POTEVP/POTFLX;
* **Solo e neve**: SMC/STC/SH2O (camadas de solo), CMC, SMSTAV/SMSTOT, SOILTB, SFCEXC,
  GRNFLX, TG, SNO, SI, ACSNOW/ACSNOM, PCTSNO, SSROFF/BGROFF, ALBEDO;
* **Radiação**: RSWIN/RSWOUT/RLWIN/RADOT, RSWTOA/RLWTOA, ASWIN/…/ALWTOA (acumulados),
  CZEN/CZMEAN, SIGT4;
* **Nuvens/convecção**: CFRACL/M/H, ACFRCV/NCFRCV/ACFRST/NCFRST, CLDEFI, HBOT/HTOP,
  CNVBOT/CNVTOP, U00, LC.

Notas:

* **LM e NSOIL são deduzidos do próprio arquivo** (posição do 2º cabeçalho e tamanho do
  registro SMC); IM·JM precisa bater com o ETAIN carregado. Endianness auto-detectada.
* **Arquivo truncado é aceito**: se o quilt morreu no meio da gravação, o card carrega
  os registros íntegros, avisa o % do layout e **onde o arquivo parou** (ex.:
  “TCUCN L40”), e o catálogo lista só o que dá para plotar — campos 3D cortados
  aparecem com “⚠ truncado (1–N de LM)”.
* Os acumulados (ACPREC, SFCSHX, ASWIN, TRAIN/TCUCN …) são **somas desde o início da
  rodada** (zeradas conforme os períodos NPREC/NSRFC/NRDSW/NHEAT do modelo) — úteis
  para comparar dois RESTRT de horários vizinhos: plote o mesmo campo dos dois arquivos
  (cada plot pode ser salvo como “outro”) e use o card **Comparar (B − A)**.

## 12. Exportar PNG

Botão **📷 PNG**: baixa a vista atual do mapa em resolução 2×, com um **cabeçalho**
contendo: grade (IM×JM), resolução, DLMD/DPHD, decomposição (INPES×JNPES = PEs), centro,
extensão do domínio em km, DT/NPHS/NCNVC/regime, camada ativa (e arquivo), zoom e
data/hora. O campo **"título do PNG…"** ao lado do botão adiciona um **título em
destaque** como primeira linha do cabeçalho (opcional — vazio = só as linhas técnicas).
Tudo que estiver visível entra na imagem: camada, grades, costa, shapes, marcador,
valores das células e as **anotações** feitas com o ✏️ (lápis, retângulos, círculos e
textos). Se a camada ativa for uma **série** (§5.2), o cabeçalho indica o registro
exibido (`registro nº/total "nome"`).

### 12.1 Preferências que ficam salvas

O navegador guarda automaticamente (por instalação/navegador, via `localStorage`):
os toggles **costa/gratic/valores/popup**, a **cor e a espessura da linha de costa**, a **paleta** do campo "Outro" (com
inversão/faixas), **cor, espessura e fonte das anotações** e o **PT (Pa)**. Ao reabrir
a ferramenta, esses controles voltam como estavam. Na versão publicada (Artifact) o
armazenamento pode estar indisponível — nesse caso a ferramenta simplesmente abre com
os padrões.

## 13. Solução de problemas

| Sintoma | Causa provável / solução |
|---|---|
| `marcador=… ≠ esperado …` ao carregar malha | IM/JM não batem com o arquivo — carregue o ETAIN correto antes |
| Shape carrega mas avisa "coords fora de lat/lon" | Shapefile projetado (.prj em metros) — converta para graus geográficos (EPSG:4326) |
| Mudanças recentes não aparecem (arquivo local) | Cache do navegador — recarregue com **Ctrl+F5** |
| Pontos sem rótulo | Selecione `.shp` e `.dbf` **juntos** no mesmo diálogo |
| "há edições não salvas" ao limpar tudo | Proteção proposital — clique de novo para descartar, ou salve antes |
| Máscara aplicada não aparece no arquivo salvo | A máscara (SM) é gravada **junto com a topografia** — salve com 💾 topografia |
| Barra de animação ⏵ não aparece | Ela só existe quando a instância **ativa** de "outro" é uma **série** (vários registros) e a camada "outro" está visível — confira o seletor de instâncias |
| 🎬 WebM falha ("MediaRecorder/WebM não suportado") | Navegador sem suporte a gravação de vídeo — use Chrome/Edge/Firefox atuais, ou exporte em 🎞 GIF (funciona em qualquer navegador) |
| 🎞 GIF muito grande | O GIF não comprime entre quadros como vídeo — reduza a janela do navegador (a exportação usa a resolução da tela) ou use o 🎬 WebM |
| Linha 🧱 (LMH/HTM) não aparece | Exige uma topografia **ajustada aos níveis eta** ativa — gere com 🏔 primeiro (ou troque a instância no seletor) |
| Corte vertical não aparece no perfil | Precisa de topografia carregada **e** níveis eta (🏔) na memória; o L/pressão no hover exige a topografia **ajustada** ativa |
| Acentos/ícones viraram símbolos estranhos ("ResoluÃ§Ã£o", "ðŸ") | Versão antiga da página sem a tag de codificação — recarregue com **Ctrl+F5**; a 1ª linha do arquivo deve ser `<meta charset="utf-8">` |
| Preferências não são lembradas | Na versão publicada (Artifact) o `localStorage` pode estar bloqueado — no arquivo local funciona normalmente |
| `IM·JM do arquivo … ≠ …` ao carregar INIT/BNDY/CNST/RESTRT | O arquivo é de outro domínio, ou o ETAIN certo não foi carregado antes |
| RESTRT “TRUNCADO … parou em …” | O quilt foi interrompido durante a gravação (disco cheio, kill, queda do nó). Os campos íntegros continuam plotáveis; para diagnóstico fino pelo terminal use `util/scan_restrt.f90` |
| No Artifact, arquivo salvo terminou em `.txt` (ex.: `etatopo.dat.txt`) | O viewer só aceita certas extensões; o conteúdo é idêntico — **renomeie** tirando o `.txt` |
| No Artifact, “arquivo acima de 16 MiB” ao salvar | Limite do viewer por download — salve pela cópia local (`file://`) |
| BNDY plota "vários pontos" na borda | É a **espessura visual** > 1 (réplica p/ visibilidade) — o arquivo tem UMA fila de LB pontos; volte a espessura p/ 1 |
| Corte do INIT diz "trace a linha antes" | Use **✏️ linha multi** (vários segmentos) ou o botão **perfil** do mapa (A e B) |
| Corte/perfil com faixa de cor "esmagada" | Valores subterrâneos entram na escala quando não há CNST nem topografia ajustada — carregue o CNST (LMH/LMV) p/ mascarar o subterrâneo |
| ISLOPE (ou outra classe do CNST) com números gigantes | Builds antigos do initbc gravam classes como REAL — a ferramenta detecta o tipo por registro automaticamente; se aparecer, recarregue o arquivo (versão antiga da página) |

## 14. Atalhos

| Atalho | Ação |
|---|---|
| **Ctrl+Z** | Desfazer última edição/máscara (com o editor de níveis aberto: desfaz no editor) |
| **Ctrl+Y** ou **Ctrl+Shift+Z** | Refazer (no editor de níveis 📈) |
| **Enter** (nos campos) | Executa a consulta/edição do card |
| **Esc** | Fecha os modais (perfil e níveis) |
| Duplo clique no mapa | Zoom no ponto |
