unit uprincipal_raw;

{$MODE Delphi}

interface

uses
  Classes,
  SysUtils,
  Algebrac,
  cronomet,
  Matcpx,
  uactoresflucar,
  ucpxresolvecuacs,
  //salida,
  //checklim,
  flujoraw,
  xmatdefs;
//IntList,

// umatrizadmitancias;
var
  Cronometro: TCrono;
  NombreArch, NombreArchent, NombreArchsal, extensionent, extensionsal: string;
  f: Text;
  NIT: Integer;
  convergencia: boolean;
  Xv, Xn: TVectComplex;
  epsx, epsf: NReal;

function Principal_Raw(archi: string; tapsvar: Boolean):TSalaFlucar;

implementation


function Principal_Raw(archi: string; tapsvar: boolean):TSalaFlucar;
var
  k: integer;
  sala: TSalaFlucar;
  err: NReal;
begin
  //  Leer el nombre del archivo de flujo de cargas
  k := pos('.', archi);
  NOmbreArch := copy(archi, 1, k - 1);
  extensionent := '.raw';
  extensionsal := '.res';
  //  Archivo de entrada .raw y archivo de salida .res
  NombreArchent := NombreArch + extensionent;
  NombreArchsal := NombreArch + extensionsal;

  //  Se crea una sala de corrida de flujo de carga vacia
  sala := TSalaFlucar.Create;
  sala.TapsVariables := tapsvar;

  //  Se lee el archivo .raw y se lo carga a la sala flucar
  sala.LeerRaw(NombreArchent);

  writeln;
  writeln('LA INFORMACION ESTA SIENDO PROCESADA.....');
  writeln;

  sala.cargue;

  if sala.TapsVariables then
    cargar_taps(sala);

  if not sala.TapsVariables then  //si no hay taps
    {$IFDEF TM_FIJO}
    sala.ProblemaCPX := TproblemaCPX.Create(sala.nNodos, sala.nNodos * 3)
    {$ELSE}
    sala.ProblemaCPX := TproblemaCPX.Create(sala.nNodos, sala.nNodos * 2)
    {$ENDIF}
  else
    sala.ProblemaCPX := TproblemaCPX.Create(sala.nNodos, sala.nNodos * 3);

  Cronometro.Borre;
  Cronometro.Cuente;

  Preparar_sistema(sala);
  writeln('');
  writeln('ESTO ES EL FIN DE LA PREPARACION DEL SISTEMA');
  writeln('');

  writeln('Chequeo de Integridad de la red de la sala');
  if RevisarSala(sala) then
     writeln('Sala OK')
  else
     writeln('Sala con errores');


  EscribirRaw(sala, NombreArchent);

  Cargar_problema(sala);

  err:=0.0;
  NIT:=0;

  convergencia:= sala.ProblemaCPX.BuscarSolucion_NewtonRapson(1e-16, 100, err, NIT);

  Cargar_datos_luego_de_resuelto(sala, convergencia, NIT);
  {Escritura de resultados}
  {$IFDEF WRITE_RESULT}
  Assign(f, NombreArchsal);
  Rewrite(f);
  writeln(f, '              P  R  O  Y  E  C  T  O    F  L  U  C  A  R');
  writeln(f);
  writeln(f);
  writeln(f);
  writeln(f, 'DATOS: ', NombreArchent);
  writeln(f);
  writeln(f, 'RESULTADOS: ', NombreArchsal);
  writeln(f);
  writeln(f);
  writeln(f, ' RESULTADOS: ');
  writeln(f);
  //reordenarbarras(BarrasOrdenadas,Barras);
  //writeBarras(f,Barras);
  //writeFlujosDePotencia(f);
  writeln(f);
  writeln(f, 'VERIFICACION DE LIMITES:');
  writeln(f);
  {$ENDIF}

  Cronometro.Pare;
  writeln('NITs: ', NIT, ' converge: ', convergencia, ' Tiempo: ',
                 Cronometro.Cuenta: 8: 4, 's');

  {$IFDEF WRITE_RESULT}
  writeln(f, 'NITs: ', NIT, ' converge: ', convergencia, ' Tiempo: ',
             Cronometro.Cuenta: 8: 4, 's');
  Close(f);
  {$ENDIF}
  writeln('FIN DEL FLUJO DE CARGAS');

  Result:= sala;

end;

end.
