recalculateTree static method

ElectricalNode recalculateTree(
  1. 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;
}