Skip to content

Commit

Permalink
Merge branch 'devel'
Browse files Browse the repository at this point in the history
# Conflicts:
#	.idea/workspace.xml
#	src/GridCal/__version__.py
  • Loading branch information
SanPen committed Oct 14, 2021
2 parents b2cbbd5 + 278bfe3 commit fd3c24a
Show file tree
Hide file tree
Showing 43 changed files with 3,522 additions and 2,537 deletions.
3 changes: 1 addition & 2 deletions .idea/GridCal.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Binary file removed Grids_and_profiles/grids/fubm_caseHVDC_vt.gridcal
Binary file not shown.
19 changes: 19 additions & 0 deletions doc/change_log.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,25 @@ this is because the stupid policy of pypi to not allow to correct packages.
Hence if something goes wrong, you need to re-upload with a new Version number.


Version 4.2.5
^^^^^^^^^^^^^^^

- Fixed simple OPF dispatch


Version 4.2.4
^^^^^^^^^^^^^^^

- Added HVDC and phase shifter optimization to the DC OPF and time series OPF
- Added contingency report to all the OPF modes
- Added transformer angle and tap module profiles
- Added dispatchable HVDC devices to the optimization

- Linked the HVDC and phase shifting from th OPF to the PF

- Removed AC linear OPF for the time being


Version 4.2.3
^^^^^^^^^^^^^^^

Expand Down
27 changes: 27 additions & 0 deletions src/GridCal/Engine/Core/DataStructures/branch_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,33 @@ def get_island(self, bus_idx):
"""
return tp.get_elements_of_the_island(self.C_branch_bus_f + self.C_branch_bus_t, bus_idx)

def get_ac_indices(self):
return np.where(self.branch_dc == 0)[0]

def get_dc_indices(self):
return np.where(self.branch_dc == 1)[0]

def get_linear_series_admittance(self, t=0):
"""
Get the linear version of the series admittance for ACDC systems
:param t: time step index
:return: Array of the length of the number of branches with 1/X or 1/R depending whether if it is AC or DC
"""
dc = self.get_dc_indices()
ac = self.get_ac_indices()
m_abs = np.abs(self.m[:, t])
if len(dc):
# compose the vector for AC-DC grids where the R is needed for this matrix
# even if conceptually we only want the susceptance
b = np.zeros(self.nbr)
active = self.branch_active[:, t]
b[ac] = 1.0 / (m_abs[ac] * self.X[ac] * active[ac] + 1e-20) # for ac branches
b[dc] = 1.0 / (m_abs[dc] * self.R[dc] * active[dc] + 1e-20) # for dc branches
else:
b = 1.0 / (m_abs * self.X * self.branch_active[:, t] + 1e-20) # for ac branches

return b

def get_contingency_enabled_indices(self):

return np.where(self.contingency_enabled == 1)[0]
Expand Down
60 changes: 52 additions & 8 deletions src/GridCal/Engine/Core/DataStructures/circuit_to_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,8 @@ def get_dc_line_data(circuit: MultiCircuit, bus_dict,

def get_branch_data(circuit: MultiCircuit, bus_dict, Vbus, apply_temperature,
branch_tolerance_mode: BranchImpedanceMode,
time_series=False, opf=False, ntime=1):
time_series=False, opf=False, ntime=1,
opf_results: "OptimalPowerFlowResults" = None):
"""
:param circuit:
Expand Down Expand Up @@ -628,12 +629,27 @@ def get_branch_data(circuit: MultiCircuit, bus_dict, Vbus, apply_temperature,
data.X[ii] = elm.X
data.G[ii] = elm.G
data.B[ii] = elm.B
data.m[ii] = elm.tap_module
data.m_max[ii] = elm.tap_module_max

if time_series:
if opf_results is not None:
data.m[ii] = elm.tap_module
data.theta[ii, :] = opf_results.phase_shift[:, ii]
else:
data.m[ii] = elm.tap_module_prof
data.theta[ii, :] = elm.angle_prof
else:
if opf_results is not None:
data.m[ii] = elm.tap_module
data.theta[ii] = opf_results.phase_shift[ii]
else:
data.m[ii] = elm.tap_module
data.theta[ii] = elm.angle

data.m_min[ii] = elm.tap_module_min
data.theta[ii] = elm.angle
data.m_max[ii] = elm.tap_module_max
data.theta_min[ii] = elm.angle_min
data.theta_max[ii] = elm.angle_max

data.Pfset[ii] = elm.Pset

data.control_mode[ii] = elm.control_mode
Expand Down Expand Up @@ -689,7 +705,18 @@ def get_branch_data(circuit: MultiCircuit, bus_dict, Vbus, apply_temperature,
data.alpha2[ii] = elm.alpha2
data.alpha3[ii] = elm.alpha3
data.k[ii] = elm.k # 0.8660254037844386 # sqrt(3)/2 (do not confuse with k droop)
data.theta[ii] = elm.theta

if time_series:
if opf_results is not None:
data.theta[ii, :] = opf_results.phase_shift[:, ii]
else:
data.theta[ii, :] = elm.theta
else:
if opf_results is not None:
data.theta[ii] = opf_results.phase_shift[ii]
else:
data.theta[ii] = elm.theta

data.theta_min[ii] = elm.theta_min
data.theta_max[ii] = elm.theta_max
data.Pfset[ii] = elm.Pdc_set
Expand Down Expand Up @@ -817,12 +844,16 @@ def get_branch_data(circuit: MultiCircuit, bus_dict, Vbus, apply_temperature,
return data


def get_hvdc_data(circuit: MultiCircuit, bus_dict, bus_types, time_series=False, ntime=1):
def get_hvdc_data(circuit: MultiCircuit, bus_dict, bus_types, time_series=False, ntime=1,
opf_results: "OptimalPowerFlowResults" = None):
"""
:param circuit:
:param bus_dict:
:param bus_types:
:param time_series:
:param ntime:
:param opf_results:
:return:
"""
data = HvdcData(nhvdc=len(circuit.hvdc_lines), nbus=len(circuit.buses), ntime=ntime)
Expand All @@ -836,17 +867,30 @@ def get_hvdc_data(circuit: MultiCircuit, bus_dict, bus_types, time_series=False,

# hvdc values
data.names[i] = elm.name
data.dispatchable[i] = int(elm.dispatchable)

if time_series:
data.active[i, :] = elm.active_prof
data.rate[i, :] = elm.rate_prof
data.Pf[i, :], data.Pt[i, :] = elm.get_from_and_to_power()

if opf_results is not None:
data.Pf[i, :] = -opf_results.hvdc_Pf[:, i]
data.Pt[i, :] = opf_results.hvdc_Pf[:, i]
else:
data.Pf[i, :], data.Pt[i, :] = elm.get_from_and_to_power()

data.Vset_f[i, :] = elm.Vset_f_prof
data.Vset_t[i, :] = elm.Vset_t_prof
else:
data.active[i] = elm.active
data.rate[i] = elm.rate
data.Pf[i], data.Pt[i] = elm.get_from_and_to_power()

if opf_results is not None:
data.Pf[i] = -opf_results.hvdc_Pf[i]
data.Pt[i] = opf_results.hvdc_Pf[i]
else:
data.Pf[i], data.Pt[i] = elm.get_from_and_to_power()

data.Vset_f[i] = elm.Vset_f
data.Vset_t[i] = elm.Vset_t

Expand Down
3 changes: 3 additions & 0 deletions src/GridCal/Engine/Core/DataStructures/hvdc_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def __init__(self, nhvdc, nbus, ntime=1):

self.control_mode = np.zeros(nhvdc, dtype=object)

self.dispatchable = np.zeros(nhvdc, dtype=int)

self.active = np.zeros((nhvdc, ntime), dtype=bool)
self.rate = np.zeros((nhvdc, ntime))

Expand Down Expand Up @@ -69,6 +71,7 @@ def slice(self, elm_idx, bus_idx, time_idx=None):

data.names = self.names[elm_idx]
data.active = self.active[elm_idx]
data.dispatchable = self.dispatchable[elm_idx]

data.rate = self.rate[tidx]
data.Pf = self.Pf[tidx]
Expand Down
70 changes: 55 additions & 15 deletions src/GridCal/Engine/Core/snapshot_opf_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,21 +212,61 @@ def compile_snapshot_opf_circuit(circuit: MultiCircuit, apply_temperature=False,

bus_dict = {bus: i for i, bus in enumerate(circuit.buses)}

nc.bus_data = ds.circuit_to_data.get_bus_data(circuit)
nc.load_data = ds.circuit_to_data.get_load_data(circuit, bus_dict, opf_results, opf=True)
nc.static_generator_data = ds.circuit_to_data.get_static_generator_data(circuit, bus_dict)
nc.generator_data = ds.circuit_to_data.get_generator_data(circuit, bus_dict, nc.bus_data.Vbus, logger, opf_results, opf=True)
nc.battery_data = ds.circuit_to_data.get_battery_data(circuit, bus_dict, nc.bus_data.Vbus, logger, opf_results, opf=True)
nc.shunt_data = ds.circuit_to_data.get_shunt_data(circuit, bus_dict, nc.bus_data.Vbus, logger)
nc.line_data = ds.circuit_to_data.get_line_data(circuit, bus_dict, apply_temperature, branch_tolerance_mode)
nc.transformer_data = ds.circuit_to_data.get_transformer_data(circuit, bus_dict)
nc.vsc_data = ds.circuit_to_data.get_vsc_data(circuit, bus_dict)
nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit, bus_dict)

nc.dc_line_data = ds.circuit_to_data.get_dc_line_data(circuit, bus_dict, apply_temperature, branch_tolerance_mode)
nc.branch_data = ds.circuit_to_data.get_branch_data(circuit, bus_dict, nc.bus_data.Vbus,
apply_temperature, branch_tolerance_mode, opf=True)
nc.hvdc_data = ds.circuit_to_data.get_hvdc_data(circuit, bus_dict, nc.bus_data.bus_types)
nc.bus_data = ds.circuit_to_data.get_bus_data(circuit=circuit)

nc.load_data = ds.circuit_to_data.get_load_data(circuit=circuit,
bus_dict=bus_dict,
opf=True)

nc.static_generator_data = ds.circuit_to_data.get_static_generator_data(circuit=circuit,
bus_dict=bus_dict)

nc.generator_data = ds.circuit_to_data.get_generator_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger,
opf=True)

nc.battery_data = ds.circuit_to_data.get_battery_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger,
opf=True)

nc.shunt_data = ds.circuit_to_data.get_shunt_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger)

nc.line_data = ds.circuit_to_data.get_line_data(circuit=circuit,
bus_dict=bus_dict,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode,)

nc.transformer_data = ds.circuit_to_data.get_transformer_data(circuit=circuit,
bus_dict=bus_dict)

nc.vsc_data = ds.circuit_to_data.get_vsc_data(circuit=circuit,
bus_dict=bus_dict)

nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit=circuit,
bus_dict=bus_dict)

nc.dc_line_data = ds.circuit_to_data.get_dc_line_data(circuit=circuit,
bus_dict=bus_dict,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode)

nc.branch_data = ds.circuit_to_data.get_branch_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode,
opf=True)

nc.hvdc_data = ds.circuit_to_data.get_hvdc_data(circuit=circuit,
bus_dict=bus_dict,
bus_types=nc.bus_data.bus_types)

nc.consolidate_information()

Expand Down
76 changes: 59 additions & 17 deletions src/GridCal/Engine/Core/snapshot_pf_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -1361,23 +1361,65 @@ def compile_snapshot_circuit(circuit: MultiCircuit, apply_temperature=False,

bus_dict = {bus: i for i, bus in enumerate(circuit.buses)}

nc.bus_data = ds.circuit_to_data.get_bus_data(circuit)
nc.load_data = ds.circuit_to_data.get_load_data(circuit, bus_dict, opf_results)
nc.static_generator_data = ds.circuit_to_data.get_static_generator_data(circuit, bus_dict)
nc.generator_data = ds.circuit_to_data.get_generator_data(circuit, bus_dict, nc.bus_data.Vbus, logger, opf_results)
nc.battery_data = ds.circuit_to_data.get_battery_data(circuit, bus_dict, nc.bus_data.Vbus, logger, opf_results)
nc.shunt_data = ds.circuit_to_data.get_shunt_data(circuit, bus_dict, nc.bus_data.Vbus, logger)
nc.line_data = ds.circuit_to_data.get_line_data(circuit, bus_dict, apply_temperature, branch_tolerance_mode)
nc.transformer_data = ds.circuit_to_data.get_transformer_data(circuit, bus_dict)
nc.vsc_data = ds.circuit_to_data.get_vsc_data(circuit, bus_dict)
nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit, bus_dict)
nc.dc_line_data = ds.circuit_to_data.get_dc_line_data(circuit, bus_dict, apply_temperature, branch_tolerance_mode)
nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit, bus_dict)

nc.branch_data = ds.circuit_to_data.get_branch_data(circuit, bus_dict, nc.bus_data.Vbus,
apply_temperature, branch_tolerance_mode)

nc.hvdc_data = ds.circuit_to_data.get_hvdc_data(circuit, bus_dict, nc.bus_data.bus_types)
nc.bus_data = ds.circuit_to_data.get_bus_data(circuit=circuit)

nc.load_data = ds.circuit_to_data.get_load_data(circuit=circuit,
bus_dict=bus_dict,
opf_results=opf_results)

nc.static_generator_data = ds.circuit_to_data.get_static_generator_data(circuit=circuit,
bus_dict=bus_dict)

nc.generator_data = ds.circuit_to_data.get_generator_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger,
opf_results=opf_results)

nc.battery_data = ds.circuit_to_data.get_battery_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger,
opf_results=opf_results)

nc.shunt_data = ds.circuit_to_data.get_shunt_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
logger=logger)

nc.line_data = ds.circuit_to_data.get_line_data(circuit=circuit,
bus_dict=bus_dict,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode)

nc.transformer_data = ds.circuit_to_data.get_transformer_data(circuit=circuit,
bus_dict=bus_dict)

nc.vsc_data = ds.circuit_to_data.get_vsc_data(circuit=circuit,
bus_dict=bus_dict)

nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit=circuit,
bus_dict=bus_dict)

nc.dc_line_data = ds.circuit_to_data.get_dc_line_data(circuit=circuit,
bus_dict=bus_dict,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode)

nc.upfc_data = ds.circuit_to_data.get_upfc_data(circuit=circuit,
bus_dict=bus_dict)

nc.branch_data = ds.circuit_to_data.get_branch_data(circuit=circuit,
bus_dict=bus_dict,
Vbus=nc.bus_data.Vbus,
apply_temperature=apply_temperature,
branch_tolerance_mode=branch_tolerance_mode,
opf_results=opf_results)

nc.hvdc_data = ds.circuit_to_data.get_hvdc_data(circuit=circuit,
bus_dict=bus_dict,
bus_types=nc.bus_data.bus_types,
opf_results=opf_results)

nc.consolidate_information()

Expand Down

0 comments on commit fd3c24a

Please sign in to comment.