diff --git a/sddp/sddp-dashlib.lua b/sddp/sddp-dashlib.lua index 24f011c..d9a6453 100644 --- a/sddp/sddp-dashlib.lua +++ b/sddp/sddp-dashlib.lua @@ -119,7 +119,7 @@ end -- Temporary solution to SDDP remap executions (including typical days) function Expression.aggregate_blocks_by_duracipu(self,i) local generic = Generic(i or 1); - local duracipu = generic:load("duracipu"); + local duracipu = generic:load_sddp("duracipu"); return (self * duracipu):aggregate_blocks(BY_SUM()); end @@ -973,7 +973,7 @@ end function create_hourly_sol_status_graph(tab, col_struct, i) local output_name = "hrstat"; local report_title = dictionary.solution_status[LANGUAGE]; - local status = col_struct.generic[i]:load(output_name); + local status = col_struct.generic[i]:load_sddp(output_name); if not status:loaded() then info(output_name .. " output could not be loaded. ".. "'" .. report_title .. "'" .. "report will not be displayed"); @@ -1493,7 +1493,7 @@ function create_times_report(col_struct) for istudy = 1, studies do -- Execution times - local exe_times = col_struct.generic[istudy]:load("sddptimes"); + local exe_times = col_struct.generic[istudy]:force_load("sddptimes"); chart_exe_sim:add_column(exe_times:select_agent(1):rename_agent(col_struct.case_dir_list[istudy])); end @@ -1505,7 +1505,7 @@ function create_times_report(col_struct) local chart_exe_sim = Chart(dictionary.exe_sim_times[LANGUAGE]); -- Simulation execution times - local exe_times = col_struct.generic[1]:load("sddptimes"); + local exe_times = col_struct.generic[1]:force_load("sddptimes"); chart_exe_sim:add_column(exe_times:select_agent(1), {showInLegend = false}); if #chart_exe_sim > 0 then @@ -1590,7 +1590,7 @@ function create_marg_costs(col_struct) end for i = 1, studies do - cmg[i] = sys[i]:load("cmgdem"); + cmg[i] = sys[i]:load_sddp("cmgdem"); end -- Marginal cost aggregated by average @@ -1775,13 +1775,13 @@ function create_gen_report(col_struct) -- Loading generations files for i = 1, studies do - gerter[i] = col_struct.thermal[i]:load("gerter"):select_stages_of_outputs(); - gerhid[i] = col_struct.hydro[i]:load("gerhid"):select_stages_of_outputs(); - gergnd[i] = col_struct.renewable[i]:load("gergnd"):select_stages_of_outputs(); - gercsp[i] = col_struct.csp[i]:load("cspgen"):convert("GWh"):select_stages_of_outputs(); - gerbat[i] = col_struct.battery[i]:load("gerbat"):convert("GWh"):select_stages_of_outputs(); -- Explicitly converting to GWh - potinj[i] = col_struct.power_injection[i]:load("powinj"):select_stages_of_outputs(); - defcit[i] = col_struct.system[i]:load("defcit"):select_stages_of_outputs(); + gerter[i] = col_struct.thermal[i]:load_sddp("gerter"):select_stages_of_outputs(); + gerhid[i] = col_struct.hydro[i]:load_sddp("gerhid"):select_stages_of_outputs(); + gergnd[i] = col_struct.renewable[i]:load_sddp("gergnd"):select_stages_of_outputs(); + gercsp[i] = col_struct.csp[i]:load_sddp("cspgen"):convert("GWh"):select_stages_of_outputs(); + gerbat[i] = col_struct.battery[i]:load_sddp("gerbat"):convert("GWh"):select_stages_of_outputs(); -- Explicitly converting to GWh + potinj[i] = col_struct.power_injection[i]:load_sddp("powinj"):select_stages_of_outputs(); + defcit[i] = col_struct.system[i]:load_sddp("defcit"):select_stages_of_outputs(); end if studies > 1 then @@ -2157,13 +2157,13 @@ function create_risk_report(col_struct) if studies > 1 then for i = 1, studies do - local risk_file = col_struct.system[i]:load("sddprisk"):aggregate_agents(BY_AVERAGE(), Collection.SYSTEM):aggregate_stages(BY_AVERAGE()); + local risk_file = col_struct.system[i]:load_sddp("sddprisk"):aggregate_agents(BY_AVERAGE(), Collection.SYSTEM):aggregate_stages(BY_AVERAGE()); -- Add marginal costs outputs chart:add_column_categories(risk_file, col_struct.case_dir_list[i]); -- Annual Marg. cost end else - local risk_file = col_struct.system[1]:load("sddprisk"); + local risk_file = col_struct.system[1]:load_sddp("sddprisk"); chart:add_column(risk_file); end diff --git a/sddp/sddp-languages.lua b/sddp/sddp-languages.lua index 724ac4b..b00fa4e 100644 --- a/sddp/sddp-languages.lua +++ b/sddp/sddp-languages.lua @@ -396,6 +396,7 @@ dictionary = { en = "Hydro: minimum percentual spillage", es = "Hidro: vertimiento porcentual mínimo", pt = "Hidro: vertimento percentual mínimo" + }, vreseg = { en = "Reserve: joint requirement", es = "Reserva: requisito conjunto", diff --git a/sddp/sddp-outputs.lua b/sddp/sddp-outputs.lua index ca09879..7f6d848 100644 --- a/sddp/sddp-outputs.lua +++ b/sddp/sddp-outputs.lua @@ -1,185 +1,208 @@ -- Verifying format option -is_csv = Study():get_parameter("BINF",0) == 0; - --- ENEMBP - Percentual of stored energy by reservatory -local enembp = require("sddp/enembp")(); -if enembp:is_hourly() then - enembp:save("enembp", {variable_by_block=2, csv=is_csv}); -else - enembp:save("enembp", {csv=is_csv}); +local is_csv = Study():get_parameter("BINF",0) == 0; + +-- Verifying the suffixes +local suffixes = { { suffix = "" } }; +if Study():get_parameter("GENE", -1) == 1 then + suffixes = { + { suffix = "_week" }, + { suffix = "_day" }, + { suffix = "_hour" }, + { suffix = "_trueup" } + }; end --- USERNW - Renewable dispatch factor -local usernw = require("sddp/usernw")(); -usernw:save("usernw", {variable_by_block=2, csv=is_csv}); - --- VERE15 - Expected value of the percentage of rationing with respect to the load -local vere15 = require("sddp/vere15")(); -vere15:save("vere15",{csv=is_csv}); - --- POTCSP - CSP capacity scenario -csp = ConcentratedSolarPower(); -cspscen = csp:load("cspscen"); -capacity = csp:load_vector("PotInst", "MW"); -potcsp = cspscen * capacity; -if potcsp:is_hourly() then - potcsp:save("potcsp", {variable_by_block=2, csv=is_csv}); -else - potcsp:save("potcsp", {csv=is_csv}); -end - --- OEMGND - Renewable O&M unitary cost -renewable = Renewable(); -oemgnd = renewable.om_cost; -oemgnd:save("oemgnd",{csv=is_csv}); - --- PBATSTG - Percentual of battery storage -battery = Battery(); -batstg = battery:load("batstg"):convert("MW"); -if batstg:loaded() then - max_storage = battery.max_storage; - pbatstg = safe_divide(batstg,max_storage):convert("%"); - if pbatstg:is_hourly() then - pbatstg:save("pbatstg", {variable_by_block=2, csv=is_csv}); +for _, item in pairs(suffixes) do + -- ENEMBP - Percentual of stored energy by reservatory + local enembp = require("sddp/enembp")(item.suffix); + if enembp:is_hourly() then + enembp:save("enembp" .. item.suffix, {variable_by_block=2, csv=is_csv}); else - pbatstg:save("pbatstg", {csv=is_csv}); + enembp:save("enembp" .. item.suffix, {csv=is_csv}); end -end --- COSSHUT - Shutdown cost of commitment thermal plants -thermal = Thermal(); -trshdw = thermal:load("trshdw"); -if trshdw:loaded() then - cosshut = thermal.shutdown_cost * trshdw; - if cosshut:is_hourly() then - cosshut:save("cosshut", {variable_by_block=2, csv=is_csv}); + -- USERNW - Renewable dispatch factor + local usernw = require("sddp/usernw")(item.suffix); + usernw:save("usernw" .. item.suffix, {variable_by_block=2, csv=is_csv}); + + -- VERE15 - Expected value of the percentage of rationing with respect to the load + local vere15 = require("sddp/vere15")(item.suffix); + vere15:save("vere15" .. item.suffix,{csv=is_csv}); + + -- POTCSP - CSP capacity scenario + csp = ConcentratedSolarPower(); + cspscen = csp:load("cspscen" .. item.suffix); + capacity = csp:load_vector("PotInst", "MW"); + potcsp = cspscen * capacity; + if potcsp:is_hourly() then + potcsp:save("potcsp" .. item.suffix, {variable_by_block=2, csv=is_csv}); else - cosshut:save("cosshut", {csv=is_csv}); + potcsp:save("potcsp" .. item.suffix, {csv=is_csv}); end -end --- GASEMI - total gas emission -emission = GasEmission(); -generic = Generic(); -local emiValues = generic:load("teremi"); -if emiValues:loaded() then - local emiNames = emission:labels(); - local emiAux = {} - for _, iName in ipairs(emiNames) do - table.insert(emiAux, emiValues:select_agents_by_regex(iName .. "(.*)"):aggregate_agents(BY_SUM(), iName)) + -- OEMGND - Renewable O&M unitary cost + -- TODO: Check if this is right + renewable = Renewable(); + oemgnd = renewable.om_cost; + oemgnd:save("oemgnd" .. item.suffix,{csv=is_csv}); + + -- PBATSTG - Percentual of battery storage + battery = Battery(); + batstg = battery:load("batstg" .. item.suffix):convert("MW"); + if batstg:loaded() then + max_storage = battery.max_storage; + pbatstg = safe_divide(batstg,max_storage):convert("%"); + if pbatstg:is_hourly() then + pbatstg:save("pbatstg" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + pbatstg:save("pbatstg" .. item.suffix, {csv=is_csv}); + end end - gasemi = concatenate(emiAux):select_agents(Collection.GAS_EMISSION); - if gasemi:is_hourly() then - gasemi:save("gasemi", {variable_by_block=2, csv=is_csv}); - else - gasemi:save("gasemi", {csv=is_csv}); + + -- COSSHUT - Shutdown cost of commitment thermal plants + thermal = Thermal(); + trshdw = thermal:load("trshdw" .. item.suffix); + if trshdw:loaded() then + cosshut = thermal.shutdown_cost * trshdw; + if cosshut:is_hourly() then + cosshut:save("cosshut" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + cosshut:save("cosshut" .. item.suffix, {csv=is_csv}); + end end -end --- OEMBATUN - battery o&m cost -battery = Battery(); -local oembatun = battery.om_cost; -oembatun:save("oembatun", {csv=is_csv}); - --- gerterMW - thermal MW generation -thermal = Thermal(); -gerter = thermal:load("gerter"); -if gerter:loaded() then - if gerter:is_hourly() then - gerter:convert("MW"):save("gerterMW", {variable_by_block=2, csv=is_csv}); - else - gerter:convert("MW"):save("gerterMW", {csv=is_csv}); + -- GASEMI - total gas emission + emission = GasEmission(); + generic = Generic(); + local emiValues = generic:load("teremi" .. item.suffix); + if emiValues:loaded() then + local emiNames = emission:labels(); + local emiAux = {} + for _, iName in ipairs(emiNames) do + table.insert(emiAux, emiValues:select_agents_by_regex(iName .. "(.*)"):aggregate_agents(BY_SUM(), iName)) + end + gasemi = concatenate(emiAux):select_agents(Collection.GAS_EMISSION); + if gasemi:is_hourly() then + gasemi:save("gasemi" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + gasemi:save("gasemi" .. item.suffix, {csv=is_csv}); + end end -end --- RENMXRSER - Renewable max reserve -renewable = Renewable(); -local renewable_reserv = renewable.max_reserve; -if renewable_reserv:is_hourly() then - renewable_reserv:save("renmxreser", {variable_by_block=2, csv=is_csv}); -else - renewable_reserv:save("renmxreser", {csv=is_csv}); -end + -- OEMBATUN - battery o&m cost + -- TODO: Check if this is right + battery = Battery(); + local oembatun = battery.om_cost; + oembatun:save("oembatun" .. item.suffix, {csv=is_csv}); + + -- gerterMW - thermal MW generation + thermal = Thermal(); + gerter = thermal:load("gerter" .. item.suffix); + if gerter:loaded() then + if gerter:is_hourly() then + gerter:convert("MW"):save("gerterMW" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + gerter:convert("MW"):save("gerterMW" .. item.suffix, {csv=is_csv}); + end + end --- RENBDPRC - Renewable bid price -renewable = Renewable(); -local renewable_bid = renewable.bid_price; -if renewable_bid:is_hourly() then - renewable_bid:save("renbdprc", {variable_by_block=2, csv=is_csv}); -else - renewable_bid:save("renbdprc", {csv=is_csv}); -end + -- RENMXRSER - Renewable max reserve + -- TODO: Check if this is right + renewable = Renewable(); + local renewable_reserv = renewable.max_reserve; + if renewable_reserv:is_hourly() then + renewable_reserv:save("renmxreser" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + renewable_reserv:save("renmxreser" .. item.suffix, {csv=is_csv}); + end --- BATMXRSER - Battery max reserve -battery = Battery(); -local battery_reserv = battery.max_reserve; -if battery_reserv:is_hourly() then - battery_reserv:save("batmxreser", {variable_by_block=2, csv=is_csv}); -else - battery_reserv:save("batmxreser", {csv=is_csv}); -end + -- RENBDPRC - Renewable bid price + -- TODO: Check if this is right + renewable = Renewable(); + local renewable_bid = renewable.bid_price; + if renewable_bid:is_hourly() then + renewable_bid:save("renbdprc" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + renewable_bid:save("renbdprc" .. item.suffix, {csv=is_csv}); + end --- BATBDPRC - Battery bid price -battery = Battery(); -local battery_bid = battery.bid_price; -if battery_bid:is_hourly() then - battery_bid:save("batbdprc", {variable_by_block=2, csv=is_csv}); -else - battery_bid:save("batbdprc", {csv=is_csv}); -end + -- BATMXRSER - Battery max reserve + -- TODO: Check if this is right + battery = Battery(); + local battery_reserv = battery.max_reserve; + if battery_reserv:is_hourly() then + battery_reserv:save("batmxreser" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + battery_reserv:save("batmxreser" .. item.suffix, {csv=is_csv}); + end --- HIDMXRSER - Hydro max reserve -hydro = Hydro(); -local hydro_reserv = hydro.max_reserve; -if hydro_reserv:loaded() then - local reserve_unit = hydro:load_parameter("MaxSecondaryReserveUnit",""); - local nominal_capacity_hydro_agents = reserve_unit:eq(2); - local mw_capacity_hydro_agents = reserve_unit:eq(3); - local avalailable_capacity_hydro_agents = reserve_unit:eq(14); - - local nominal_capacity_hydro_reserv = hydro_reserv:force_unit("%") * nominal_capacity_hydro_agents * hydro.max_generation; - local avalailable_capacity_hydro_reserv = hydro_reserv:force_unit("%") * avalailable_capacity_hydro_agents * hydro.max_generation_available; - local avalailable_capacity_mw_reserv = (hydro_reserv * mw_capacity_hydro_agents):force_unit("MW"); - if hydro_reserv:is_hourly() then - (avalailable_capacity_mw_reserv + nominal_capacity_hydro_reserv + avalailable_capacity_hydro_reserv):save("hidmxreser", {variable_by_block=2, csv=true}); + -- BATBDPRC - Battery bid price + -- TODO: Check if this is right + battery = Battery(); + local battery_bid = battery.bid_price; + if battery_bid:is_hourly() then + battery_bid:save("batbdprc" .. item.suffix, {variable_by_block=2, csv=is_csv}); else - (avalailable_capacity_mw_reserv + nominal_capacity_hydro_reserv + avalailable_capacity_hydro_reserv):save("hidmxreser", {csv=true}); + battery_bid:save("batbdprc" .. item.suffix, {csv=is_csv}); end -end --- HIDBDPRC - Hydro bid price -hydro = Hydro(); -local hydro_bid = hydro.bid_price; -if hydro_bid:is_hourly() then - hydro_bid:save("hidbdprc", {variable_by_block=2, csv=is_csv}); -else - hydro_bid:save("hidbdprc", {csv=is_csv}); -end + -- HIDMXRSER - Hydro max reserve + -- TODO: Check if this is right + hydro = Hydro(); + local hydro_reserv = hydro.max_reserve; + if hydro_reserv:loaded() then + local reserve_unit = hydro:load_parameter("MaxSecondaryReserveUnit",""); + local nominal_capacity_hydro_agents = reserve_unit:eq(2); + local mw_capacity_hydro_agents = reserve_unit:eq(3); + local avalailable_capacity_hydro_agents = reserve_unit:eq(14); + + local nominal_capacity_hydro_reserv = hydro_reserv:force_unit("%") * nominal_capacity_hydro_agents * hydro.max_generation; + local avalailable_capacity_hydro_reserv = hydro_reserv:force_unit("%") * avalailable_capacity_hydro_agents * hydro.max_generation_available; + local avalailable_capacity_mw_reserv = (hydro_reserv * mw_capacity_hydro_agents):force_unit("MW"); + if hydro_reserv:is_hourly() then + (avalailable_capacity_mw_reserv + nominal_capacity_hydro_reserv + avalailable_capacity_hydro_reserv):save("hidmxreser" .. item.suffix, {variable_by_block=2, csv=true}); + else + (avalailable_capacity_mw_reserv + nominal_capacity_hydro_reserv + avalailable_capacity_hydro_reserv):save("hidmxreser" .. item.suffix, {csv=true}); + end + end --- TERMXRSER - Thermal max reserve -thermal = Thermal(); -local thermal_reserv = thermal.max_reserve; -if thermal_reserv:loaded() then - local reserve_unit = thermal:load_parameter("MaxSecondaryReserveUnit",""); - local nominal_capacity_thermal_agents = reserve_unit:eq(2); - local mw_capacity_thermal_agents = reserve_unit:eq(3); - local avalailable_capacity_thermal_agents = reserve_unit:eq(14); - - local nominal_capacity_thermal_reserv = thermal_reserv:force_unit("%") * nominal_capacity_thermal_agents * thermal.max_generation; - local avalailable_capacity_thermal_reserv = thermal_reserv:force_unit("%") * avalailable_capacity_thermal_agents * thermal.max_generation_available; - local avalailable_capacity_mw_reserv = (thermal_reserv * mw_capacity_thermal_agents):force_unit("MW"); - if thermal_reserv:is_hourly() then - (avalailable_capacity_mw_reserv + nominal_capacity_thermal_reserv + avalailable_capacity_thermal_reserv):save("termxreser", {variable_by_block=2, csv=true}); + -- HIDBDPRC - Hydro bid price + -- TODO: Check if this is right + hydro = Hydro(); + local hydro_bid = hydro.bid_price; + if hydro_bid:is_hourly() then + hydro_bid:save("hidbdprc" .. item.suffix, {variable_by_block=2, csv=is_csv}); else - (avalailable_capacity_mw_reserv + nominal_capacity_thermal_reserv + avalailable_capacity_thermal_reserv):save("termxreser", {csv=true}); + hydro_bid:save("hidbdprc" .. item.suffix, {csv=is_csv}); end -end --- TERBDPRC - Thermal bid price -thermal = Thermal(); -local thermal_bid = thermal.bid_price; -if thermal_bid:is_hourly() then - thermal_bid:save("terbdprc", {variable_by_block=2, csv=is_csv}); -else - thermal_bid:save("terbdprc", {csv=is_csv}); + -- TERMXRSER - Thermal max reserve + -- TODO: Check if this is right + thermal = Thermal(); + local thermal_reserv = thermal.max_reserve; + if thermal_reserv:loaded() then + local reserve_unit = thermal:load_parameter("MaxSecondaryReserveUnit",""); + local nominal_capacity_thermal_agents = reserve_unit:eq(2); + local mw_capacity_thermal_agents = reserve_unit:eq(3); + local avalailable_capacity_thermal_agents = reserve_unit:eq(14); + + local nominal_capacity_thermal_reserv = thermal_reserv:force_unit("%") * nominal_capacity_thermal_agents * thermal.max_generation; + local avalailable_capacity_thermal_reserv = thermal_reserv:force_unit("%") * avalailable_capacity_thermal_agents * thermal.max_generation_available; + local avalailable_capacity_mw_reserv = (thermal_reserv * mw_capacity_thermal_agents):force_unit("MW"); + if thermal_reserv:is_hourly() then + (avalailable_capacity_mw_reserv + nominal_capacity_thermal_reserv + avalailable_capacity_thermal_reserv):save("termxreser" .. item.suffix, {variable_by_block=2, csv=true}); + else + (avalailable_capacity_mw_reserv + nominal_capacity_thermal_reserv + avalailable_capacity_thermal_reserv):save("termxreser" .. item.suffix, {csv=true}); + end + end + + -- TERBDPRC - Thermal bid price + -- TODO: Check if this is right + thermal = Thermal(); + local thermal_bid = thermal.bid_price; + if thermal_bid:is_hourly() then + thermal_bid:save("terbdprc" .. item.suffix, {variable_by_block=2, csv=is_csv}); + else + thermal_bid:save("terbdprc" .. item.suffix, {csv=is_csv}); + end end \ No newline at end of file diff --git a/sddp/sddp-reports.lua b/sddp/sddp-reports.lua index 86776d7..edde948 100644 --- a/sddp/sddp-reports.lua +++ b/sddp/sddp-reports.lua @@ -35,7 +35,7 @@ local function violation_output(log_viol, out_list, viol_structs, tol) for _, viol_struct in ipairs(viol_structs) do if out_list[viol_struct.name] then local file_name = viol_struct.name; - local violation = generic:load(file_name); + local violation = generic:load_sddp(file_name); if violation:loaded() then violation = violation:remove_zeros(); if violation:loaded() then @@ -105,7 +105,7 @@ end -- INPUT DATA ----------------------------------------------------------------------------------------------- -- Inflow energy -local enaflu = Generic():load("enaflu"); +local enaflu = Generic():load_sddp("enaflu"); dispersion(enaflu,"sddp_dashboard_input_enaflu") @@ -166,8 +166,21 @@ end ----------------------------------------------------------------------------------------------- -- DEFICIT RISK ----------------------------------------------------------------------------------------------- -local defrisk = require("sddp-reports/sddprisk")(); -defrisk:save("sddprisk"); +-- Verifying the suffixes +local suffixes = { { suffix = "" } }; +if Study():get_parameter("GENE", -1) == 1 then + suffixes = { + { suffix = "_week" }, + { suffix = "_day" }, + { suffix = "_hour" }, + { suffix = "_trueup" } + }; +end + +for _, item in pairs(suffixes) do + local defrisk = require("sddp-reports/sddprisk")(item.suffix); + defrisk:save("sddprisk" .. item.suffix); +end ----------------------------------------------------------------------------------------------- -- VIOLATIONS @@ -252,15 +265,15 @@ log_viol.file:close(); -- local rnw = Renewable(); -- -- Get renewable generation spillage --- local rnw_spill = rnw:load("vergnd"); +-- local rnw_spill = rnw:load_sddp("vergnd"); -- rnw_spill:aggregate_agents(BY_SUM(), Collection.SYSTEM):aggregate_scenarios(BY_AVERAGE()):remove_zeros():save("sddp_dashboard_result_avg_vergnd"); ----------------------------------------------------------------------------------------------- -- LGC ----------------------------------------------------------------------------------------------- -local lgcgen = Hydro():load("lgcgen"); -local lgcrev = Hydro():load("lgcrev"); +local lgcgen = Hydro():load_sddp("lgcgen"); +local lgcrev = Hydro():load_sddp("lgcrev"); -- sddp_dashboard_lgc_gen if lgcgen:loaded() then