unit uGTer;

{$MODE Delphi}

interface

uses
  Classes, uActores, uFichasLPD, xMatDefs, uFechas, uNodos,
  uGeneradores, uCosa, SysUtils, uFuentesAleatorias;

resourcestring
  rsGeneradorTermico = 'Generador térmico';
  rs_Nombre = 'Nombre';
  rs_PMin_MW = 'PMín[MW]';
  rs_PMax_MW = 'PMáx[MW]';
  rs_CV_PMin_USD_MWh = 'CV_PMín[USD/MWh]';
  rs_CV_Medio_USD_MWh = 'CV_Medio[USD/MWh]';
  rs_CV_Incremental_USD_MWh = 'CV_Incremental[USD/MWh]';
  rs_FDisp_pu = 'FDisp[p.u.]';
  rs_Costo_Arranqe_USD = 'Costo Arranque[USD]';
  rs_Costo_Parada_USD = 'Costo Parada[USD]';
  rs_NUnidades = 'N Unidades';
  rs_minNPasosOn = 'Mín. NPasosOn';
  rs_minNPasosOff = 'Mín. NPasosOff';
  rs_desicionPasosOnPorCiclo = 'Desición PasosOn/Ciclo';
  rs_desicionPasosOffPorCiclo = 'Desición PasosOff/Ciclo';
  rs_costoporCicloON  = 'Costo/CicloON';
  rs_costoPorCicloOff = 'Costo/CicloOff';

const
  GTER_PRECISIONPOTENCIANMAQS = 0.001;

type

  { TGTer }

  TGTer = class(TGenerador)
  public
    constructor Create(capa: integer; nombre: string; nacimiento, muerte: TFecha;
      lpdUnidades, lpd: TFichasLPD; nodo: TNodo;
      flg_CalcularGradienteDeInversion: boolean; TonCO2xMWh: NReal; LowCostMustRun,
      CleanDevelopmentMechanism: boolean; xFuenteIdxP: TFuenteAleatoria;
      xBorneIdxP: string);

    function Rec: TCosa_RecLnk; override;
    procedure BeforeRead(version, id_hilo: integer); override;
    procedure AfterRead(f:TArchiTexto); override;

    procedure sim_PrintResultados_Encab_PotFirme(var fsal: textfile;
      kencab: integer); virtual;
    procedure sim_PrintResultados_PotFirme(var fsal: textfile); virtual;
    destructor destroy; override;
    class function DescClase: string; override;

    class procedure generarLineaEncabezadosResumen(var archi: TextFile);

    procedure generarLineaResumenPrimerFicha(var archi: TextFile);
  end;

  TClaseDeGTer = class of TGTer;

implementation

constructor TGTer.Create(capa: integer; nombre: string; nacimiento, muerte: TFecha;
  lpdUnidades, lpd: TFichasLPD; nodo: TNodo; flg_CalcularGradienteDeInversion: boolean;
  TonCO2xMWh: NReal; LowCostMustRun, CleanDevelopmentMechanism: boolean;
  xFuenteIdxP: TFuenteAleatoria; xBorneIdxP: string );
begin
  inherited Create(capa, nombre, nacimiento, muerte, lpdUnidades,
    nodo, TonCO2xMWh, LowCostMustRun, CleanDevelopmentMechanism,
    flg_CalcularGradienteDeInversion, xFuenteIdxP, xBorneIdxP );
  self.lpd := lpd;
end;

function TGTer.Rec: TCosa_RecLnk;
begin
  Result:=inherited Rec;
  Result.addCampoDef('lpd', TCosa(lpd));
end;

procedure TGTer.BeforeRead(version, id_hilo: integer);
begin
  inherited BeforeRead(version, id_hilo);
end;

procedure TGTer.AfterRead(f:TArchiTexto);
begin
  inherited AfterRead(f);
  lpd.Propietario := self;
end;


procedure TGTer.sim_PrintResultados_Encab_PotFirme(var fsal: textfile; kencab: integer);

begin
  if kencab = 0 then
  begin
    Write(fsal, #9, Nombre); //Potencia firme
  end
  else if kencab = 1 then
  begin
    Write(fsal, #9, '[MW]'); //Potencia firme
  end
  else
  begin
    Write(fsal, #9, 'PFirme'); //Potencia firme
  end;
end;

procedure TGTer.sim_PrintResultados_PotFirme(var fsal: textfile);
begin
  Write(fsal, #9, PotenciaFirme);
end;

destructor TGTer.destroy;
begin
  if lpd <> nil then
    self.lpd.Free;
  inherited destroy;
end;

class function TGTer.DescClase: string;
begin
  Result := rsGeneradorTermico;
end;

class procedure TGTer.generarLineaEncabezadosResumen(var archi: TextFile);
begin
  writeln(
   archi, rs_NOmbre +#9
    + rs_PMin_MW+#9
    + rs_PMax_MW+#9
    + rs_CV_PMin_USD_MWh+#9
    + rs_CV_Medio_USD_MWh+#9
    + rs_CV_Incremental_USD_MWh+#9
    + rs_FDisp_pu +#9
    + rs_Costo_Arranqe_USD+#9
    + rs_Costo_Parada_USD+#9
    + rs_NUnidades +#9
    + rs_minNPasosOn+#9
    + rs_minNPasosOff+#9
    + rs_desicionPasosOnPorCiclo+#9
    + rs_desicionPasosOffPorCiclo+#9
    + rs_costoporCicloON+#9
    + rs_costoPorCicloOff);
end;

procedure TGTer.generarLineaResumenPrimerFicha(var archi: TextFile);
var
  i: integer;
begin
  Write(archi, nombre, #9);
  if lpd.Count > 0 then
    TFichaLPD(lpd[0]).generarLineaResumen(archi)
  else
    for i := 1 to 8 do
      Write(archi, '', #9);
  if lpdUnidades.Count > 0 then
    TFichaLPD(lpdUnidades[0]).generarLineaResumen(archi)
  else
    Write(archi, '', #9);
  writeln(archi);
end;

end.
