diff --git a/CaseStudy.py b/CaseStudy.py index 25407c6..3d57f26 100644 --- a/CaseStudy.py +++ b/CaseStudy.py @@ -152,6 +152,7 @@ def __init__(self, self.power_scaling_factor = self.dGlobal_Parameters["pPowerScalingFactor"] self.cost_scaling_factor = self.dGlobal_Parameters["pCostScalingFactor"] + self.reactive_power_scaling_factor = 1e-3 # MVar to kVar conversion factor self.angle_to_rad_scaling_factor = np.pi / 180 if not do_not_scale_units: @@ -239,10 +240,16 @@ def scale_dPower_ThermalGen(self): self.dPower_ThermalGen['MinUpTime'] = self.dPower_ThermalGen['MinUpTime'].astype('int64') self.dPower_ThermalGen['MinDownTime'] = self.dPower_ThermalGen['MinDownTime'].astype('int64') + self.dPower_ThermalGen['Qmin'] = self.dPower_ThermalGen['Qmin'].fillna(0) * self.reactive_power_scaling_factor + self.dPower_ThermalGen['Qmax'] = self.dPower_ThermalGen['Qmax'].fillna(0) * self.reactive_power_scaling_factor + def scale_dPower_RoR(self): self.dPower_RoR['InvestCostEUR'] = self.dPower_RoR['MaxProd'] * self.power_scaling_factor * (self.dPower_RoR['InvestCostPerMW'] + self.dPower_RoR['InvestCostPerMWh'] * self.dPower_RoR['Ene2PowRatio']) * (self.cost_scaling_factor / self.power_scaling_factor) self.dPower_RoR['MaxProd'] *= self.power_scaling_factor + self.dPower_RoR['Qmin'] = self.dPower_RoR['Qmin'].fillna(0) * self.reactive_power_scaling_factor + self.dPower_RoR['Qmax'] = self.dPower_RoR['Qmax'].fillna(0) * self.reactive_power_scaling_factor + def scale_dPower_Inflows(self): self.dPower_Inflows["Inflow"] *= self.power_scaling_factor @@ -254,6 +261,9 @@ def scale_dPower_VRES(self): self.dPower_VRES['MaxProd'] *= self.power_scaling_factor self.dPower_VRES['OMVarCost'] *= (self.cost_scaling_factor / self.power_scaling_factor) + self.dPower_VRES['Qmin'] = self.dPower_VRES['Qmin'].fillna(0) * self.reactive_power_scaling_factor + self.dPower_VRES['Qmax'] = self.dPower_VRES['Qmax'].fillna(0) * self.reactive_power_scaling_factor + def scale_dPower_Storage(self): self.dPower_Storage['IniReserve'] = self.dPower_Storage['IniReserve'].fillna(0) self.dPower_Storage['MinReserve'] = self.dPower_Storage['MinReserve'].fillna(0) @@ -263,6 +273,9 @@ def scale_dPower_Storage(self): self.dPower_Storage['MaxProd'] *= self.power_scaling_factor self.dPower_Storage['MaxCons'] *= self.power_scaling_factor + self.dPower_Storage['Qmin'] = self.dPower_Storage['Qmin'].fillna(0) * self.reactive_power_scaling_factor + self.dPower_Storage['Qmax'] = self.dPower_Storage['Qmax'].fillna(0) * self.reactive_power_scaling_factor + def scale_dPower_ImpExpHubs(self): self.dPower_ImpExpHubs["Pmax Import"] *= self.power_scaling_factor self.dPower_ImpExpHubs["Pmax Export"] *= self.power_scaling_factor @@ -289,7 +302,7 @@ def get_dPower_Parameters(self): dPower_Parameters = dPower_Parameters.dropna(how="all") dPower_Parameters = dPower_Parameters.set_index('General') - self.yesNo_to_bool(dPower_Parameters, ['pEnableChDisPower', 'pFixStInterResToIniReserve', 'pEnableSoftLineLoadLimits', 'pEnableThermalGen', 'pEnableRoR', 'pEnableVRES', 'pEnableStorage', 'pEnablePowerImportExport']) + self.yesNo_to_bool(dPower_Parameters, ['pEnableChDisPower', 'pFixStInterResToIniReserve', 'pEnableSoftLineLoadLimits', 'pEnableThermalGen', 'pEnableRoR', 'pEnableVRES', 'pEnableStorage', 'pEnablePowerImportExport', 'pEnableSOCP']) # Transform to make it easier to access values dPower_Parameters = dPower_Parameters.drop(dPower_Parameters.columns[1:], axis=1) # Drop all columns but "Value" (rest is just for information in the Excel) diff --git a/ExcelWriter.py b/ExcelWriter.py index 50d95c5..319fbe0 100644 --- a/ExcelWriter.py +++ b/ExcelWriter.py @@ -339,7 +339,7 @@ def model_to_excel(model: pyomo.core.Model, target_path: str) -> None: from rich_argparse import RichHelpFormatter parser = argparse.ArgumentParser(description="Re-write all files in given folder and compare against source", formatter_class=RichHelpFormatter) - parser.add_argument("caseStudyFolder", type=str, default="examples/", help="Path to folder containing data for LEGO model.", nargs="?") + parser.add_argument("caseStudyFolder", type=str, default="data/example/", help="Path to folder containing data for LEGO model.", nargs="?") parser.add_argument("excelDefinitionsPath", type=str, help="Path to the Excel definitions XML file. Uses default if none is supplied.", nargs="?") parser.add_argument("--dontCheckFormatting", action="store_true", help="Do not check formatting of the Excel files. Only check if they are equal.") args = parser.parse_args() diff --git a/environment.yml b/environment.yml index 73f27c9..c6961a9 100644 --- a/environment.yml +++ b/environment.yml @@ -5,6 +5,7 @@ channels: dependencies: - openpyxl=3.1.5 - pandas=2.2.3 + - pandas-stubs=2.3.0.250703 - pip=24.0 - pyomo=6.9.2 - pytest=8.4.0