From 1c821dde145e2802f3551fee78eead28f02f0631 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Tue, 9 Sep 2025 11:39:20 -0500 Subject: [PATCH] web: changeTimeHorizon, changeTimeStep: Adjust profiled units --- web/src/core/Operations/parameterOps.ts | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/web/src/core/Operations/parameterOps.ts b/web/src/core/Operations/parameterOps.ts index 21a8214..175b626 100644 --- a/web/src/core/Operations/parameterOps.ts +++ b/web/src/core/Operations/parameterOps.ts @@ -29,11 +29,23 @@ export const changeTimeHorizon = ( Object.values(newScenario.Buses).forEach((bus) => { bus["Load (MW)"] = bus["Load (MW)"].slice(0, newT); }); + Object.values(newScenario.Generators).forEach((generator) => { + if (generator.Type === "Profiled") { + generator["Minimum power (MW)"] = generator["Minimum power (MW)"].slice(0, newT); + generator["Maximum power (MW)"] = generator["Maximum power (MW)"].slice(0, newT); + } + }); } else { const padding = Array(newT - oldT).fill(0); Object.values(newScenario.Buses).forEach((bus) => { bus["Load (MW)"] = bus["Load (MW)"].concat(padding); }); + Object.values(newScenario.Generators).forEach((generator) => { + if (generator.Type === "Profiled") { + generator["Minimum power (MW)"] = generator["Minimum power (MW)"].concat(padding); + generator["Maximum power (MW)"] = generator["Maximum power (MW)"].concat(padding); + } + }); } return [newScenario, null]; }; @@ -110,6 +122,40 @@ export const changeTimeStep = ( }; } + const newGenerators: { [name: string]: any } = {}; + for (const generatorName in scenario.Generators) { + const generator = scenario.Generators[generatorName]!; + if (generator.Type === "Profiled") { + // Build data_y for minimum power + const minPower = generator["Minimum power (MW)"]; + const minData_y = Array(oldT + 1).fill(0); + for (let i = 0; i < oldT; i++) minData_y[i] = minPower[i]; + minData_y[oldT] = minData_y[0]; + + // Build data_y for maximum power + const maxPower = generator["Maximum power (MW)"]; + const maxData_y = Array(oldT + 1).fill(0); + for (let i = 0; i < oldT; i++) maxData_y[i] = maxPower[i]; + maxData_y[oldT] = maxData_y[0]; + + // Run interpolation for both + const newMinPower = Array(newT).fill(0); + const newMaxPower = Array(newT).fill(0); + for (let i = 0; i < newT; i++) { + newMinPower[i] = evaluatePwlFunction(data_x, minData_y, newTimeStep * i); + newMaxPower[i] = evaluatePwlFunction(data_x, maxData_y, newTimeStep * i); + } + + newGenerators[generatorName] = { + ...generator, + "Minimum power (MW)": newMinPower, + "Maximum power (MW)": newMaxPower, + }; + } else { + newGenerators[generatorName] = generator; + } + } + return [ { ...scenario, @@ -118,6 +164,7 @@ export const changeTimeStep = ( "Time step (min)": newTimeStep, }, Buses: newBuses, + Generators: newGenerators, }, null, ];