recalculateTree static method
- ElectricalNode root
Calcula todo el árbol de forma bidireccional Retorna el árbol actualizado con resultados
Implementation
static ElectricalNode recalculateTree(ElectricalNode root) {
// PASADA 1: Bottom-Up (Suma de cargas)
final bottomUpResults = _calculateBottomUp(root);
// Actualizar root con resultado de pasada 1
var updatedRoot = _updateNodeWithBottomUp(root, bottomUpResults);
// PASADA 2: Top-Down (Caída de tensión, Icc)
final sourceVoltage = root.map(
source: (n) => n.nominalVoltage,
panel: (n) => n.nominalVoltage,
protection: (_) => 230.0,
load: (_) => 230.0,
);
// Z_source = V / Icc_external (evita explosión de Icc aguas abajo)
double initialR =
0.015; // Valor por defecto seguro (~15mΩ) para evitar Icc infinita
double initialX = 0.0;
root.map(
source: (n) {
// Detectar si viene en Amperios o kA
// El default en freezed es 10000 (probablemente Amperios).
// Si el valor es > 200, asumimos Amperios. Si es <= 200, asumimos kA.
double val = n.shortCircuitCapacity;
// 4500A * 1.1 (factor seguridad) = 4950A < 6000A (PDC estándar).
// Así el primer automático de 6kA sale VERDE.
if (val <= 0 || val == 10000) val = 4500;
// Normalizar a Amperios
final double iccAmps = (val > 200) ? val : val * 1000;
// Z_source debe calcularse siempre con tensión simple (Fase-Neutro)
const vPhase = 230.0;
initialR = vPhase / iccAmps;
initialX = 0.0;
},
panel: (_) {},
protection: (_) {},
load: (_) {},
);
updatedRoot = _calculateTopDown(
updatedRoot,
sourceVoltage,
0.0, // Accumulated drop = 0 at source
initialR, // Impedancia inicial correcta
initialX,
);
// PASADA 3: Validación (Auditoría de cumplimiento)
updatedRoot = ValidationEngine.validateTree(updatedRoot);
return updatedRoot;
}