forked from pielube/MESSpy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
run_test.py
226 lines (171 loc) · 9.01 KB
/
run_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
"""
MESSpy - Run_test
don't work on this script:
you should create your own run_dev.py, input_dev/, postprocess_dev.py and preprocess_dev.py
"""
#%% ###########################################################################
"""
PRE PROCESSING
==============
"""
# Import modules
from rec import REC
from economics import NPV, LCOH
import postprocess_test as pp
import preprocess_test as pre
#import postprocess_dev as pp
#import preprocess_dev as pre
import os
import json
import pickle
# Selecting simulation names
name_studycase = 'Rec' # str name for energy_balances_results file.pkl
name_refcase = 'Rec0' # str name for energy_balances_results file.pkl
name_economic = 'From Rec0 to Rec' # str name for economic_assesment_results file.pkl
# Selecting input files:
path = r'./input_test' # change the path with r'./input_dev' if you are working on your own run_dev
#path = r'./input_dev'
# file_studycase = 'studycase'
# file_refcase = 'refcase'
file_studycase = 'studycase_hydrogen'
file_refcase = 'refcase_hydrogen'
file_general = 'general'
file_tech_cost = 'tech_cost'
file_energy_market = 'energy_market'
file_emissions = 'emissions'
# Opening input files:
with open(os.path.join(path,f"{file_studycase}.json"),'r') as f: studycase = json.load(f)
with open(os.path.join(path,f"{file_refcase}.json"),'r') as f: refcase = json.load(f)
with open(os.path.join(path,f"{file_emissions}.json"),'r') as f: emissions = json.load(f)
with open(os.path.join(path,f"{file_general}.json"),'r') as f: general = json.load(f)
with open(os.path.join(path,f"{file_tech_cost}.json"),'r') as f: tech_cost = json.load(f)
with open(os.path.join(path,f"{file_energy_market}.json"),'r') as f: energy_market = json.load(f)
#%% ###########################################################################
"""
SOLVER - studycase simulation
======
"""
rec = REC(studycase,general,file_studycase,file_general,path) # create REC object
rec.REC_energy_simulation() # simulate REC enegy balances
rec.tech_cost(tech_cost) # calculate the cost of all technologies
rec.save(name_studycase) # save results in 'name_studycase.pkl'
#%% ###########################################################################
"""
SOLVER - refcase simulation
================================
"""
# Reference case simulation (run only if changed)
rec0 = REC(refcase,general,file_refcase,file_general,path) # create REC object
rec0.REC_energy_simulation() # simulate REC
rec0.tech_cost(tech_cost) # calculate the cost of all technologies
rec0.save(name_refcase) # save results in 'name_refcase.pkl'
#%% ###########################################################################
"""
POST PROCESS - Investment assessment
================================
"""
# Net present value calculation to asses the investment comparing refcase and studycase
NPV(file_studycase,file_refcase,name_studycase,name_refcase,energy_market,general['simulation years'],path,name_economic)
#%% ###########################################################################
"""
POST PROCESS - PLOTTING
================================
some post-process are alredy avaiable as examples in postprocess_test
you should create your own postprocess_dev.py
"""
if file_studycase == 'studycase' and file_refcase == 'refcase':
# =============================================================================
# studycase postprocess useful functions
# =============================================================================
pp.total_balances(name_studycase,'prosumer_1','electricity')
pp.total_balances(name_studycase,'prosumer_2','electricity')
pp.total_balances(name_studycase,'prosumer_2','hydrogen')
pp.total_balances(name_studycase,'consumer_1','electricity')
pp.total_balances(name_refcase,'consumer_2','electricity')
pp.total_balances(name_refcase,'consumer_2','heating water')
pp.total_balances(name_refcase,'consumer_2','gas')
pp.total_balances(name_studycase,'consumer_2','electricity')
pp.total_balances(name_studycase,'consumer_2','heating water')
pp.REC_electricity_balance(name_studycase)
pp.hourly_balances_electricity(name_studycase,'prosumer_1', 20, 21)
pp.hourly_balances_electricity(name_studycase,'prosumer_2', 2, 3)
pp.hourly_balances_electricity(name_studycase,'consumer_1', 2, 3)
pp.hourly_balances_electricity(name_studycase,'consumer_2', 2, 3)
pp.csc_allocation_sum(name_studycase)
pp.storage_control(name_studycase)
pp.ele_param(name_studycase, 2, 3)
pp.fc_param(name_studycase, 2, 3)
# Optional for each location involving hydrogen: Useful to calculate RES autoconsumption, RES surplus, electricity consumed for hydrogen chain and Green Index
balances_pp = pp.energy_balance_results(studycase,name_studycase,general['simulation years'],'prosumer_2', print_ = True, plot = True)
pp.plot_post_process(balances_pp,studycase,'prosumer_2',235,237)
pp.plot_post_process(balances_pp,studycase,'prosumer_2',120,125)
pp.plot_post_process(balances_pp,studycase,'prosumer_2',220,240)
pp.ghg_emissions(name_studycase,'prosumer_2',emissions, '2025')
LCOH('prosumer_2',balances_pp,studycase,name_studycase,energy_market,general['simulation years'],path,name_economic, revenues = False, refund = True)
pp.LOC_plot(name_studycase)
pp.NPV_plot(name_economic)
elif file_studycase == 'studycase_hydrogen' and file_refcase == 'refcase_hydrogen':
# =============================================================================
# studycase_hydrogen postprocess useful functions
# =============================================================================
balances_pp = pp.energy_balance_results(studycase,name_studycase,general['simulation years'],'prosumer_1', print_ = True, plot = True)
# pp.plot_post_process(balances_pp,studycase,'prosumer_1',235,237)
# pp.plot_post_process(balances_pp,studycase,'prosumer_1',120,125)
# pp.plot_post_process(balances_pp,studycase,'prosumer_1',220,240)
pp.ghg_emissions(name_studycase,'prosumer_1',emissions, '2025', print_ = True)
LCOH('prosumer_1',balances_pp,studycase,name_studycase,energy_market,general['simulation years'],path,name_economic, revenues = False, refund = True)
# pp.ele_param(name_studycase, 2, 3)
# pp.fc_param(name_studycase, 2, 3)
# pp.LOC_plot(name_studycase)
pp.NPV_plot(name_economic)
pp.hydrogen_production(name_studycase,'prosumer_1')
#%% ##########################################################################
# =============================================================================
# Here you can read the main results (balances and economic):
# =============================================================================
with open('results/economic_assessment_'+name_economic+'.pkl', 'rb') as f: economic = pickle.load(f)
with open('results/balances_'+name_studycase+'.pkl', 'rb') as f: balances = pickle.load(f)
with open('results/balances_pp_'+name_studycase+'.pkl', 'rb') as f: balances_pp = pickle.load(f)
#%% ##########################################################################
"Sensitivity analysis - practical example"
# click on the following code and press Ctrl+5 to discomment all together
# =============================================================================
# import numpy as np
# import matplotlib.pyplot as plt
#
# pv_size = np.arange(1,11)
# npv = []
# sc = [] # self-consumption
# ss = [] # self-sufficiency
#
# for pv in pv_size:
# print(pv)
# name_studycase = f"PV size = {pv}"
# new_studycase = pre.change_peakP(studycase, 'prosumer_1', pv) # change PV size
# rec = REC(new_studycase,general,file_studycase,file_general,path) # create REC object
# rec.REC_energy_simulation() # simulate REC enegy balances
# rec.tech_cost(tech_cost) # calculate the cost of all technologies
# rec.save(name_studycase) # save results in 'name_studycase.pkl'
#
# with open('results/balances_'+name_studycase+'.pkl', 'rb') as f: balances = pickle.load(f)
# demand = -balances['prosumer_1']['electricity']['demand'].sum() # read from saved results .pkl
# production = balances['prosumer_1']['electricity']['PV'].sum()
# into_grid = balances['prosumer_1']['electricity']['grid'].sum(where=balances['prosumer_1']['electricity']['grid']<0)
# from_grid = balances['prosumer_1']['electricity']['grid'].sum(where=balances['prosumer_1']['electricity']['grid']>0)
#
# # you can also read values from the python object rec. (in this case you do not need rec.save)
# # demand = -rec.locations['prosumer_1'].energy_balance['electricity']['demand'].sum() # read from python
#
# sc.append((production+into_grid)/production*100)
# ss.append((demand-from_grid)/demand*100)
#
# plt.figure(dpi=1000)
# plt.plot(pv_size,sc,label='Self-consumption')
# plt.plot(pv_size,ss,label='Self-sufficiency')
# plt.xlabel("PV peak power [kWp]")
# plt.ylabel("[%]")
# plt.grid()
# plt.legend()
# plt.title('prosumer_1')
# plt.show()
# =============================================================================