1+ import os
2+ from pownet .core import Simulator , DataProcessor , OutputProcessor
3+
4+ ##### User inputs #####
5+ scen_path = ".\\ model_library"
6+ results_path = ".\\ results"
7+ to_process_inputs = True
8+ sim_horizon = 24 * 7
9+ model_name = "cumberland"
10+ steps_to_run = 3 # Default is None
11+ do_plot = True
12+
13+
14+ if to_process_inputs :
15+ data_processor = DataProcessor (
16+ input_folder = scen_path , model_name = model_name , year = 2016 , frequency = 50
17+ )
18+ data_processor .execute_data_pipeline ()
19+
20+ simulator = Simulator (
21+ input_folder = scen_path ,
22+ model_name = model_name ,
23+ model_year = 2016 ,
24+ spin_reserve_factor = 0 ,
25+ load_shortfall_penalty_factor = 1000 ,
26+ load_curtail_penalty_factor = 1 ,
27+ spin_shortfall_penalty_factor = 1000 ,
28+ line_capacity_factor = 1 ,
29+ line_loss_factor = 0
30+ )
31+
32+ simulator .run (
33+ sim_horizon = sim_horizon ,
34+ steps_to_run = steps_to_run ,
35+ # solver='gurobi',
36+ )
37+
38+ # Write the simulation results
39+ output_folder = results_path + '\\ ' + model_name
40+ if not os .path .exists (output_folder ):
41+ os .makedirs (output_folder )
42+ simulator .write_results (output_folder )
43+
44+ simulator .plot_fuelmix ("area" , output_folder )
45+
46+ output_processor = OutputProcessor ()
47+ hourly_demand = output_processor .get_hourly_demand (simulator .inputs .demand )
48+
49+ ## old code
50+ # #%%
51+ # import os
52+ # from datetime import datetime
53+ # from pownet.core import (
54+ # DataProcessor,
55+ # SystemInput,
56+ # ModelBuilder,
57+ # SystemRecord,
58+ # OutputProcessor,
59+ # Visualizer,
60+ # )
61+ # from pownet.data_utils import create_init_condition
62+ #
63+ # scen_path = ".\\model_library"
64+ # ##### User inputs #####
65+ # to_process_inputs = True
66+ # sim_horizon = 24*7
67+ # model_name = "cumberland"
68+ # steps_to_run = 3 # Default is None
69+ # do_plot = True
70+ # #######################
71+ #
72+ # if to_process_inputs:
73+ # data_processor = DataProcessor(
74+ # input_folder=scen_path, model_name=model_name, year=2016, frequency=50
75+ # )
76+ # data_processor.execute_data_pipeline()
77+ #
78+ # inputs = SystemInput(
79+ # input_folder=scen_path,
80+ # model_name=model_name,
81+ # year=2016,
82+ # sim_horizon=sim_horizon,
83+ # spin_reserve_factor=0,
84+ # load_shortfall_penalty_factor=1000,
85+ # load_curtail_penalty_factor=1,
86+ # spin_shortfall_penalty_factor=1000,
87+ # line_capacity_factor=1,
88+ # line_loss_factor=0
89+ # )
90+ # inputs.load_and_check_data()
91+ #
92+ #
93+ # model_builder = ModelBuilder(inputs)
94+ # record = SystemRecord(inputs)
95+ #
96+ # build_times = []
97+ # opt_times = []
98+ # objvals = []
99+ # init_conditions = create_init_condition(inputs.thermal_units) # init conditions should be empty dict if we dont have any thermal generators
100+ #
101+ # if steps_to_run is None:
102+ # steps_to_run = 10 # 365 - (sim_horizon // 24 - 1)
103+ #
104+ # start_day = 1
105+ # for step_k in range(start_day, steps_to_run):
106+ # start_time = datetime.now()
107+ # if step_k == start_day:
108+ # power_system_model = model_builder.build(
109+ # step_k=step_k,
110+ # init_conds=init_conditions,
111+ # )
112+ # else:
113+ # power_system_model = model_builder.update(
114+ # step_k=step_k,
115+ # init_conds=init_conditions,
116+ # )
117+ # build_times.append((datetime.now() - start_time).total_seconds())
118+ #
119+ # power_system_model.model.write(str(step_k) + '.lp')
120+ # power_system_model.optimize(mipgap=0.001)
121+ #
122+ # # Raise an error if the model is not feasible
123+ # if not power_system_model.check_feasible():
124+ # raise ValueError("Model is not feasible.")
125+ #
126+ # objvals.append(power_system_model.get_objval())
127+ # opt_times.append(power_system_model.get_runtime())
128+ #
129+ # record.keep(
130+ # runtime=power_system_model.get_runtime(),
131+ # objval=power_system_model.get_objval(),
132+ # solution=power_system_model.get_solution(),
133+ # lmp=power_system_model.solve_for_lmp(),
134+ # step_k=step_k,
135+ # )
136+ # init_conditions = record.get_init_conds()
137+ #
138+ # import os
139+ # output_folder = ".//outputs"
140+ # if not os.path.exists(output_folder):
141+ # os.makedirs(output_folder)
142+ # record.write_simulation_results(output_folder)
143+ #
144+ #
145+ #
146+ # # output_folder = ".//outputs"
147+ # # if not os.path.exists(output_folder):
148+ # # os.makedirs(output_folder)
149+ # # results.write_results(output_folder)
150+ #
151+ # import pandas as pd
152+ # # Process the results
153+ # output_processor = OutputProcessor()
154+ # output_processor.load(inputs=inputs)
155+ # # output_processor = OutputProcessor(inputs)
156+ # node_var_df = record.get_node_variables()
157+ # output_processor.get_hourly_generation(node_var_df)
158+ # # output_processor.load_from_dataframe(node_var_df)
159+ #
160+ # output_processor.get_thermal_unit_hourly_dispatch(node_var_df)
161+ # a = output_processor.get_unit_hourly_generation(node_var_df)
162+ # # Visualize the results
163+ # if do_plot:
164+ # visualizer = Visualizer(inputs.model_id)
165+ # if steps_to_run <= 7:
166+ # visualizer.plot_fuelmix_bar(
167+ # dispatch=output_processor.get_hourly_generation(node_var_df),
168+ # demand=output_processor.get_hourly_demand(inputs.demand),
169+ # )
170+ # visualizer.plot_lmp(record.lmp_df)
171+ # else:
172+ # visualizer = Visualizer(inputs.model_id)
173+ # visualizer.plot_fuelmix_area(
174+ # dispatch=output_processor.get_daily_dispatch(),
175+ # demand=output_processor.get_daily_demand(),
176+ # )
177+ #
178+ #
179+ # # Save other modeling statistics
180+ # import os
181+ # from pownet.folder_utils import get_output_dir
182+ # import pandas as pd
183+ #
184+ # folder_dir = get_output_dir()
185+ # prefix_name = "warmstart"
186+ # df = pd.DataFrame(
187+ # {
188+ # "build_time": build_times,
189+ # "opt_time": opt_times,
190+ # "objval": objvals,
191+ # }
192+ # )
193+ # df.to_csv(
194+ # os.path.join(
195+ # folder_dir,
196+ # f"branch{prefix_name}_{inputs.model_name}_{sim_horizon}_modelstats.csv",
197+ # ),
198+ # index=False,
199+ # )
0 commit comments