Guia voltado ao usuario. Para contribuidores, veja LEIAME.md + docs/mapa-de-codigo.md + docs/guia-de-vetorizacao.md.
English version:
docs/how-to-use.md
- MATLAB R2019b ou mais novo (testado com R2024a no Windows via WSL)
- Gmsh (install pelo sistema:
apt install gmshno Linux,choco install gmshno Windows) — usado so pra editar arquivos de malha, nao e requerido pra RODAR o simulador
-
Clone o repo (o release fica no
master):git clone https://github.com/Feraul/FlowSim.git cd FlowSim # master = release atual v2.0.1-vectorized # pro backup pre-vetorizacao, use: git checkout v1.0.0-pre-vectorization
-
Edite o
Start.dat— o arquivo de configuracao de runtime. Toda linha marcada com>>> EDITE AQUI <<<e um parametro do usuario. Os mais importantes:- Pasta de saida (linha 33) — onde os resultados vao. Use barras pra frente no Linux/WSL, barras invertidas no Windows.
- Pasta da malha (linha 218) — pasta contendo os arquivos
.msh. Todas as malhas agora vivem sobmeshes/{hermeline,kozdon,other}/— aponte o Start.dat pra subpasta certa. - Nome do arquivo de malha (linha 224) — ex.:
M8.msh. numcase— qual caso de benchmark (vejafactories/createBenchmark.mpra lista completa).pmethod— um de:tpfa/mpfad/mpfah/nlfvpp/mpfaql.phasekey— familia de fisica:1= monofasico pressao/saturacao4= carga hidraulica de groundwater5= contaminante + carga hidraulica6= Richards (parcialmente saturado)
-
Confirme os dados de permeabilidade SPE10 (opcional — so pra casos SPE10). Por padrao eles foram relocados pra fora do repo (
spe10.mat,spe_perm.dat, ~90 MB no total). Se um benchmark precisar deles:- Faca um symlink a partir da localizacao que
fs.data.paths('spe10')reportar, OU - Defina a variavel de ambiente
FS_DATA_DIRonde voce guarda os arquivos.
- Faca um symlink a partir da localizacao que
cd /caminho/para/FlowSim
flowsim_init % configura todos os paths (so precisa uma vez por sessao)
main % le o Start.dat, roda o caso configuradocd /caminho/para/FlowSim
# Rodada unica do main.m:
tools/mrun -c $(pwd) main.m
# Ou um script especifico:
tools/mrun -c $(pwd) /caminho/pro/meuscript.m
# One-liner:
tools/mrun -e "disp('oi'); disp(version)"
# Com timeout (padrao 30 min):
tools/mrun -t 3600 -c $(pwd) main.m
# Com auto-log em /tmp/mrun-logs/:
tools/mrun -L -c $(pwd) main.mO mrun embrulha matlab.exe -batch e:
- Filtra os warnings inocuos de change-notification UNC
- Auto-cd na pasta do script (ou um override
-c) - Propaga o exit code (0 = ok, non-0 = erro do MATLAB, 124 = timeout)
# Passada smoke completa (rapido, ~30 s):
tools/mrun -c $(pwd) tests/smoke/smoke_env.m
# Todos os smoke + unit (~5 min):
tools/mrun -c $(pwd) tests/run_all.m
# Um teste especifico (com progresso verbose):
tools/mrun -c $(pwd) tests/unit/unit_baseline_reproduces.mTodos os testes usam tests/helpers/fs_test_env.m que isola o
Start.dat num diretorio temporario — seu Start.dat real nunca e
mutado pelos testes.
-
Crie
benchmarks/CasoNNN.m— herde deSimulacaoBase, implemente os metodos abstratos (vejabase/SimulacaoBase.mpro contrato). Modele a partir dobenchmarks/Caso439.mexistente — e o unico totalmente implementado. -
Registre em
factories/createBenchmark.m:case NNN, bench = CasoNNN();
-
Atualize o
Start.dat: setarnumcase = NNN. -
Opcionalmente adicione um smoke test em
tests/smoke/que verifica que a classe carrega (meta.class.fromName('CasoNNN')).
-
Crie
solvers/MetodoXXX.m— herde deMetodoBase, implemente:preprocessar(env, parms)— precompute quantidades mesh-invariantatualizarPremethod(env, parms)— refresh em novo kmap (Richards)montarSistema(env, parms, dt)— retorna[M, I]resolver(M, I, parms, env, tempo, dt, source_wells)— resolve (linear ou Picard)calcularFlowrate(p, env, parms)— postprocess
-
Registre em
factories/createMetodo.m:case 'xxx', metodo = MetodoXXX();
-
Atualize o
Start.dat:pmethod = xxx. -
Se quiser a estrutura de package vetorizada: crie
+fs/+assembly/+xxx/build.m(delegate pro legado a principio; incrementalmente porte pra forma de triplas).
- "Undefined function or variable" em alguma
Caso...ouMetodo...— o factory espera um arquivo de classe que nao existe. SoCaso439+ as 5 classesMetodoXXXestao wired neste branch. - "mkdir Access is denied" durante o preprocessormod — o caminho de saida do Start.dat e Windows-style mas o MATLAB nao consegue criar (path nao existe ou sem permissao de escrita). Corrija o caminho de saida.
- "Cannot open file: ...\some_mesh.msh" — a pasta de malhas e o
nome de arquivo de malha do Start.dat nao batem com um arquivo real.
As malhas agora vivem sob
meshes/{hermeline,kozdon,other}/— atualize o caminho de malha do Start.dat. - Teste baseline falhando — provavelmente uma mudanca numerica se
infiltrou. Compare
norm(M_new - M_leg, 'fro') / norm(M_leg, 'fro'). Se < 1e-12, ajuste a tolerancia; se > 1e-12, tem um bug de verdade.
| Sintoma | Olhe em |
|---|---|
| MATLAB nao acha uma funcao | flowsim_init.m — a arvore legacy esta no path? |
| Pressoes / flowrates errados | Teste de baseline dourado + tests/golden/*.mat |
| Classe nao instancia | tests/smoke/smoke_class_hierarchy.m |
| Problemas de setup de path | Rode flowsim_init('verbose', true) pra ver a ordem addpath |
| Problemas de path WSL | Adicione -v ao mrun pra ver o MATLAB_CMD real |
- Arquivos scratch de teste vivem em
/tmp/flowsim_test_env/(recriados por teste). - Auto-logs do
mrun -Lvivem em/tmp/mrun-logs/. - Autosaves
.asvdo MATLAB — gitignored, seguro deletar.
manual/manual.pdf— referencia cientifica original (teoria dos metodos numericos)CHANGELOG.md— o que mudou e quandodocs/guia-de-vetorizacao.md— receita pra estender a arvore+fs/docs/mapa-de-codigo.md— onde cada funcao vive + quem chama quemtests/LEIAME.md— detalhes do harness de teste