Move .prds/ (PRDs, roadmap, module and phase docs) to docs/planning/prds/, preserving modules/ and phases/ subdirectory structure. Delete .prds/. Update AGENTS.md documentation table to include docs/planning/prds/ entry. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3.6 KiB
3.6 KiB
Contexto: Orquestração
Coordena a execução da simulação e a comunicação entre módulos.
Simulation
Controla o avanço do tempo e garante que todos os módulos sejam executados na ordem correta.
Responsabilidades
- Iniciar, encerrar, pausar e retomar uma simulação
- Controlar velocidade (real-time 1×, acelerado N×)
- Executar ciclos de atualização (ticks) em ordem determinística
- Em real-time: sincronizar loop com tempo de relógio
- Em fast-time: loop roda sem sincronização (o mais rápido possível)
Ciclo de tick
A cada tick, a Simulation executa na ordem:
1. [Environment] atualiza condições ambientais (vento, corrente, maré)
2. [Terrain] aplica modificações de terreno pendentes
3. [Vessel] updateControl(time, dt) — atualiza demands de leme/RPM se modo manobra
4. [Vessel] updateStates(time, dt) — transforma corrente/vento p/ frame do navio,
atualiza atuadores (1ª ordem / rate limiter),
calcula SOG/COG/speedToWater, EMA de posição
5. [Hydrodynamics] calcula forças hidrodinâmicas (damping, current, squat, thrust, rudder, tug)
6. [WaveForces] calcula forças de onda (excitação + drift + RAO)
7. [InertialForces] acoplamento Coriolis/giroscópico
8. [RestoringForces] restauração hidrostática
9. [Mooring] forças de cabos de amarração
10. [Anchoring] forças de fundeio
11. [Physics/CVODE] soma todas as forças → integra movimento → atualiza World
12. [Events] publica eventos do tick para assinantes internos e externos
Integrador — CVODE
dtpassado à Simulation é o intervalo de output (ex: 0.05–0.1 s)- CVODE usa sub-passos adaptativos internamente — pode usar passos menores que
dtpara manter tolerância - Múltiplos corpos: cada um tem sua própria instância CVODE (estado e solver independentes)
Múltiplas simulações
- Cada simulação é um par
Simulation + Worldindependente - No
apps/server: isolamento por thread (1–2 simulações real-time) - No
apps/fast-time: isolamento por processo (N simulações batch em paralelo)
Events
Sistema de pub/sub para comunicação entre módulos internos e clientes externos.
Responsabilidades
- Receber eventos publicados por qualquer módulo durante um tick
- Entregar a assinantes internos (outros módulos, sem latência)
- Propagar para clientes externos via Server (Manager, Viewer) — apenas em real-time
Eventos publicados
| Evento | Publicado por | Descrição |
|---|---|---|
collision |
Physics | Dois corpos em contato |
entity_created |
World | Nova entidade adicionada |
entity_removed |
World | Entidade removida |
mooring_ruptured |
Mooring | Cabo de amarração rompeu |
anchor_holding |
Anchoring | Âncora unhada no fundo |
anchor_dragging |
Anchoring | Âncora garreando |
environment_changed |
Environment | Condição ambiental alterada |
terrain_changed |
Terrain | Batimetria ou estrutura modificada |
simulation_started |
Simulation | Simulação iniciada |
simulation_paused |
Simulation | Simulação pausada |
simulation_ended |
Simulation | Simulação encerrada |
vessel_state_changed |
VesselState | Luzes/shapes/estado operacional mudaram |
Notas
- Fast-time: eventos propagados apenas internamente, não para clientes externos
- Histórico de eventos persistido por Persistence (junto com o histórico de steps)
- Viewer e Manager subscrevem todos os eventos da simulação em real-time