Skip to content

Commit 7f51d81

Browse files
author
AFM Kamal Chowdhury
authored
Add files via upload
1 parent d05ee50 commit 7f51d81

9 files changed

+239599
-0
lines changed

Model/PowNetDataSetup.py

Lines changed: 399 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,399 @@
1+
2+
import csv
3+
import pandas as pd
4+
import numpy as np
5+
6+
7+
######=================================================########
8+
###### Segment A.1 ########
9+
######=================================================########
10+
11+
SimDays = 365
12+
SimHours = SimDays * 24
13+
HorizonHours = 24 ##planning horizon (e.g., 24, 48, 72 hours etc.)
14+
TransLoss = 0.075 ##transmission loss as a percent of generation
15+
n1criterion = 0.75 ##maximum line-usage as a percent of line-capacity
16+
res_margin = 0.15 ##minimum reserve as a percent of system demand
17+
spin_margin = 0.50 ##minimum spinning reserve as a percent of total reserve
18+
19+
data_name = 'pownet_data_camb_2016'
20+
21+
22+
######=================================================########
23+
###### Segment A.2 ########
24+
######=================================================########
25+
26+
#read parameters for dispatchable resources (coal/gas/oil/biomass generators, imports)
27+
df_gen = pd.read_csv('data_camb_genparams.csv',header=0)
28+
29+
##hourly ts of dispatchable hydropower at each domestic dam
30+
df_hydro = pd.read_csv('data_camb_hydro_2016.csv',header=0)
31+
32+
##hourly ts of dispatchable hydropower at each import dam
33+
df_hydro_import = pd.read_csv('data_camb_hydro_import_2016.csv',header=0)
34+
35+
####hourly ts of dispatchable solar-power at each plant
36+
##df_solar = pd.read_csv('data_solar.csv',header=0)
37+
##
38+
####hourly ts of dispatchable wind-power at each plant
39+
##df_wind = pd.read_csv('data_wind.csv',header=0)
40+
41+
##hourly ts of load at substation-level
42+
df_load = pd.read_csv('data_camb_load_2016.csv',header=0)
43+
44+
#capacity and susceptence of each transmission line (one direction)
45+
df_trans1 = pd.read_csv('data_camb_transparam.csv',header=0)
46+
47+
#hourly minimum reserve as a function of load (e.g., 15% of current load)
48+
df_reserves = pd.DataFrame((df_load.iloc[:,4:].sum(axis=1)*res_margin).values,columns=['Reserve'])
49+
50+
#capacity and susceptence of each transmission line (both directions)
51+
df_trans2 = pd.DataFrame([df_trans1['sink'],df_trans1['source'],df_trans1['linemva'],df_trans1['linesus']]).transpose()
52+
df_trans2.columns = ['source','sink','linemva','linesus']
53+
df_paths = pd.concat([df_trans1,df_trans2], axis=0)
54+
df_paths.index = np.arange(len(df_paths))
55+
56+
57+
######=================================================########
58+
###### Segment A.3 ########
59+
######=================================================########
60+
61+
####======== Lists of Nodes of the Power System ========########
62+
h_nodes = ['TTYh','LRCh','ATYh','KIR1h','KIR3h','KMCh']
63+
h_imports = ['Salabam']
64+
##s_nodes = ['solar1','solar2']
65+
##w_nodes =['wind1','wind2']
66+
67+
gd_nodes = ['GS1','GS2','GS3','GS5','GS7','KPCM','KPT','SHV','SRP'] ##Thermoplant nodes with demand
68+
gn_nodes = ['STH','Thai','Viet'] ##Thermoplants nodes without demand
69+
70+
g_nodes = gd_nodes + gn_nodes
71+
print ('Gen_Nodes:',len(g_nodes))
72+
73+
td_nodes = ['GS4','GS6','BTB','BMC','STR','TKO','KPS'] ##Transformers with demand
74+
tn_nodes = ['IE','KPCG','OSM','PRST'] ##Transformers without demand
75+
76+
d_nodes = gd_nodes + td_nodes
77+
print ('Demand_Nodes:',len(d_nodes))
78+
79+
all_nodes = h_nodes + h_imports + gn_nodes + gd_nodes + tn_nodes + td_nodes ## + s_nodes + w_nodes
80+
print ('Total_Nodes:',len(all_nodes))
81+
82+
83+
##list of types of dispatchable units
84+
types = ['coal_st','oil_ic','oil_st','imp_viet','imp_thai','slack'] ##,'biomass_st','gas_cc','gas_st'
85+
86+
87+
######=================================================########
88+
###### Segment A.4 ########
89+
######=================================================########
90+
91+
######====== write data.dat file ======########
92+
with open(''+str(data_name)+'.dat', 'w') as f:
93+
94+
###### generator sets by generator nodes
95+
for z in gd_nodes:
96+
# node string
97+
z_int = gd_nodes.index(z)
98+
f.write('set GD%dGens :=\n' % (z_int+1))
99+
# pull relevant generators
100+
for gen in range(0,len(df_gen)):
101+
if df_gen.loc[gen,'node'] == z:
102+
unit_name = df_gen.loc[gen,'name']
103+
unit_name = unit_name.replace(' ','_')
104+
f.write(unit_name + ' ')
105+
f.write(';\n\n')
106+
107+
for z in gn_nodes:
108+
# node string
109+
z_int = gn_nodes.index(z)
110+
f.write('set GN%dGens :=\n' % (z_int+1))
111+
# pull relevant generators
112+
for gen in range(0,len(df_gen)):
113+
if df_gen.loc[gen,'node'] == z:
114+
unit_name = df_gen.loc[gen,'name']
115+
unit_name = unit_name.replace(' ','_')
116+
f.write(unit_name + ' ')
117+
f.write(';\n\n')
118+
119+
120+
####### generator sets by type
121+
# Coal
122+
f.write('set Coal_st :=\n')
123+
# pull relevant generators
124+
for gen in range(0,len(df_gen)):
125+
if df_gen.loc[gen,'typ'] == 'coal_st':
126+
unit_name = df_gen.loc[gen,'name']
127+
unit_name = unit_name.replace(' ','_')
128+
f.write(unit_name + ' ')
129+
f.write(';\n\n')
130+
131+
# Oil_ic
132+
f.write('set Oil_ic :=\n')
133+
# pull relevant generators
134+
for gen in range(0,len(df_gen)):
135+
if df_gen.loc[gen,'typ'] == 'oil_ic':
136+
unit_name = df_gen.loc[gen,'name']
137+
unit_name = unit_name.replace(' ','_')
138+
f.write(unit_name + ' ')
139+
f.write(';\n\n')
140+
141+
# Oil_st
142+
f.write('set Oil_st :=\n')
143+
# pull relevant generators
144+
for gen in range(0,len(df_gen)):
145+
if df_gen.loc[gen,'typ'] == 'oil_st':
146+
unit_name = df_gen.loc[gen,'name']
147+
unit_name = unit_name.replace(' ','_')
148+
f.write(unit_name + ' ')
149+
f.write(';\n\n')
150+
151+
# Import from Vietnam
152+
f.write('set Imp_Viet :=\n')
153+
# pull relevant generators
154+
for gen in range(0,len(df_gen)):
155+
if df_gen.loc[gen,'typ'] == 'imp_viet':
156+
unit_name = df_gen.loc[gen,'name']
157+
unit_name = unit_name.replace(' ','_')
158+
f.write(unit_name + ' ')
159+
f.write(';\n\n')
160+
161+
# Import from Thailand
162+
f.write('set Imp_Thai :=\n')
163+
# pull relevant generators
164+
for gen in range(0,len(df_gen)):
165+
if df_gen.loc[gen,'typ'] == 'imp_thai':
166+
unit_name = df_gen.loc[gen,'name']
167+
unit_name = unit_name.replace(' ','_')
168+
f.write(unit_name + ' ')
169+
f.write(';\n\n')
170+
171+
## # Biomass
172+
## f.write('set Biomass_st :=\n')
173+
## # pull relevant generators
174+
## for gen in range(0,len(df_gen)):
175+
## if df_gen.loc[gen,'typ'] == 'biomass_st':
176+
## unit_name = df_gen.loc[gen,'name']
177+
## unit_name = unit_name.replace(' ','_')
178+
## f.write(unit_name + ' ')
179+
## f.write(';\n\n')
180+
##
181+
## # Gas_cc
182+
## f.write('set Gas_cc :=\n')
183+
## # pull relevant generators
184+
## for gen in range(0,len(df_gen)):
185+
## if df_gen.loc[gen,'typ'] == 'gas_cc':
186+
## unit_name = df_gen.loc[gen,'name']
187+
## unit_name = unit_name.replace(' ','_')
188+
## f.write(unit_name + ' ')
189+
## f.write(';\n\n')
190+
##
191+
## # Gas_st
192+
## f.write('set Gas_st :=\n')
193+
## # pull relevant generators
194+
## for gen in range(0,len(df_gen)):
195+
## if df_gen.loc[gen,'typ'] == 'gas_st':
196+
## unit_name = df_gen.loc[gen,'name']
197+
## unit_name = unit_name.replace(' ','_')
198+
## f.write(unit_name + ' ')
199+
## f.write(';\n\n')
200+
201+
# Slack
202+
f.write('set Slack :=\n')
203+
# pull relevant generators
204+
for gen in range(0,len(df_gen)):
205+
if df_gen.loc[gen,'typ'] == 'slack':
206+
unit_name = df_gen.loc[gen,'name']
207+
unit_name = unit_name.replace(' ','_')
208+
f.write(unit_name + ' ')
209+
f.write(';\n\n')
210+
211+
212+
######=================================================########
213+
###### Segment A.5 ########
214+
######=================================================########
215+
216+
######Set nodes, sources and sinks
217+
# nodes
218+
f.write('set nodes :=\n')
219+
for z in all_nodes:
220+
f.write(z + ' ')
221+
f.write(';\n\n')
222+
223+
# sources
224+
f.write('set sources :=\n')
225+
for z in all_nodes:
226+
f.write(z + ' ')
227+
f.write(';\n\n')
228+
229+
# sinks
230+
f.write('set sinks :=\n')
231+
for z in all_nodes:
232+
f.write(z + ' ')
233+
f.write(';\n\n')
234+
235+
# hydro_nodes
236+
f.write('set h_nodes :=\n')
237+
for z in h_nodes:
238+
f.write(z + ' ')
239+
f.write(';\n\n')
240+
241+
# hydro_nodes for import
242+
f.write('set h_imports :=\n')
243+
for z in h_imports:
244+
f.write(z + ' ')
245+
f.write(';\n\n')
246+
247+
## # solar_nodes
248+
## f.write('set s_nodes :=\n')
249+
## for z in s_nodes:
250+
## f.write(z + ' ')
251+
## f.write(';\n\n')
252+
##
253+
## # wind_nodes
254+
## f.write('set w_nodes :=\n')
255+
## for z in w_nodes:
256+
## f.write(z + ' ')
257+
## f.write(';\n\n')
258+
259+
# all demand nodes
260+
f.write('set d_nodes :=\n')
261+
for z in d_nodes:
262+
f.write(z + ' ')
263+
f.write(';\n\n')
264+
265+
# generator with demand nodes
266+
f.write('set gd_nodes :=\n')
267+
for z in gd_nodes:
268+
f.write(z + ' ')
269+
f.write(';\n\n')
270+
271+
# generator without demand nodes
272+
f.write('set gn_nodes :=\n')
273+
for z in gn_nodes:
274+
f.write(z + ' ')
275+
f.write(';\n\n')
276+
277+
# transformer with demand nodes
278+
f.write('set td_nodes :=\n')
279+
for z in td_nodes:
280+
f.write(z + ' ')
281+
f.write(';\n\n')
282+
283+
# transformer without demand nodes
284+
f.write('set tn_nodes :=\n')
285+
for z in tn_nodes:
286+
f.write(z + ' ')
287+
f.write(';\n\n')
288+
289+
290+
######=================================================########
291+
###### Segment A.6 ########
292+
######=================================================########
293+
294+
####### simulation period and horizon
295+
f.write('param SimHours := %d;' % SimHours)
296+
f.write('\n')
297+
f.write('param SimDays:= %d;' % SimDays)
298+
f.write('\n\n')
299+
f.write('param HorizonHours := %d;' % HorizonHours)
300+
f.write('\n\n')
301+
f.write('param TransLoss := %0.3f;' % TransLoss)
302+
f.write('\n\n')
303+
f.write('param n1criterion := %0.3f;' % n1criterion)
304+
f.write('\n\n')
305+
f.write('param spin_margin := %0.3f;' % spin_margin)
306+
f.write('\n\n')
307+
308+
309+
######=================================================########
310+
###### Segment A.7 ########
311+
######=================================================########
312+
313+
####### create parameter matrix for generators
314+
f.write('param:' + '\t')
315+
for c in df_gen.columns:
316+
if c != 'name':
317+
f.write(c + '\t')
318+
f.write(':=\n\n')
319+
for i in range(0,len(df_gen)):
320+
for c in df_gen.columns:
321+
if c == 'name':
322+
unit_name = df_gen.loc[i,'name']
323+
unit_name = unit_name.replace(' ','_')
324+
f.write(unit_name + '\t')
325+
else:
326+
f.write(str((df_gen.loc[i,c])) + '\t')
327+
f.write('\n')
328+
f.write(';\n\n')
329+
330+
######=================================================########
331+
###### Segment A.8 ########
332+
######=================================================########
333+
334+
####### create parameter matrix for transmission paths (source and sink connections)
335+
f.write('param:' + '\t' + 'linemva' + '\t' +'linesus :=' + '\n')
336+
for z in all_nodes:
337+
for x in all_nodes:
338+
f.write(z + '\t' + x + '\t')
339+
match = 0
340+
for p in range(0,len(df_paths)):
341+
source = df_paths.loc[p,'source']
342+
sink = df_paths.loc[p,'sink']
343+
if source == z and sink == x:
344+
match = 1
345+
p_match = p
346+
if match > 0:
347+
f.write(str(df_paths.loc[p_match,'linemva']) + '\t' + str(df_paths.loc[p_match,'linesus']) + '\n')
348+
else:
349+
f.write('0' + '\t' + '0' + '\n')
350+
f.write(';\n\n')
351+
352+
######=================================================########
353+
###### Segment A.9 ########
354+
######=================================================########
355+
356+
####### Hourly timeseries (load, hydro, solar, wind, reserve)
357+
# load (hourly)
358+
f.write('param:' + '\t' + 'SimDemand:=' + '\n')
359+
for z in d_nodes:
360+
for h in range(0,len(df_load)):
361+
f.write(z + '\t' + str(h+1) + '\t' + str(df_load.loc[h,z]) + '\n')
362+
f.write(';\n\n')
363+
364+
# hydro (hourly)
365+
f.write('param:' + '\t' + 'SimHydro:=' + '\n')
366+
for z in h_nodes:
367+
for h in range(0,len(df_hydro)):
368+
f.write(z + '\t' + str(h+1) + '\t' + str(df_hydro.loc[h,z]) + '\n')
369+
f.write(';\n\n')
370+
371+
# hydro_import (hourly)
372+
f.write('param:' + '\t' + 'SimHydroImport:=' + '\n')
373+
for z in h_imports:
374+
for h in range(0,len(df_hydro_import)):
375+
f.write(z + '\t' + str(h+1) + '\t' + str(df_hydro_import.loc[h,z]) + '\n')
376+
f.write(';\n\n')
377+
378+
## # solar (hourly)
379+
## f.write('param:' + '\t' + 'SimSolar:=' + '\n')
380+
## for z in s_nodes:
381+
## for h in range(0,len(df_solar)):
382+
## f.write(z + '\t' + str(h+1) + '\t' + str(df_solar.loc[h,z]) + '\n')
383+
## f.write(';\n\n')
384+
##
385+
## # wind (hourly)
386+
## f.write('param:' + '\t' + 'SimWind:=' + '\n')
387+
## for z in w_nodes:
388+
## for h in range(0,len(df_wind)):
389+
## f.write(z + '\t' + str(h+1) + '\t' + str(df_wind.loc[h,z]) + '\n')
390+
## f.write(';\n\n')
391+
392+
###### System-wide hourly reserve
393+
f.write('param' + '\t' + 'SimReserves:=' + '\n')
394+
for h in range(0,len(df_load)):
395+
f.write(str(h+1) + '\t' + str(df_reserves.loc[h,'Reserve']) + '\n')
396+
f.write(';\n\n')
397+
398+
399+
print ('Complete:',data_name)

0 commit comments

Comments
 (0)