Utils Module
This module provides utility functions for power system analysis, including data conversion, network topology analysis, and various helper functions for working with power system models.
Data Conversion Functions
External to Internal Indexing
ext2int(bus::Matrix{Float64}, gen::Matrix{Float64}, branch::Matrix{Float64})
Converts external bus numbers to consecutive internal bus numbers.
- Arguments:
bus
: Bus data matrixgen
: Generator data matrixbranch
: Branch data matrix
- Returns: Converted matrices and mapping between external and internal indices
Internal to External Indexing
int2ext(i2e::Vector{Int}, bus::Matrix{Float64}, gen::Matrix{Float64}, branch::Matrix{Float64})
Converts internal consecutive bus numbers back to original external bus numbers.
- Arguments:
i2e
: Mapping from internal to external bus numbersbus
: Bus data matrix with internal indexinggen
: Generator data matrix with internal indexingbranch
: Branch data matrix with internal indexing
- Returns: Matrices with external indexing restored
Network Topology Analysis
Island Detection
find_islands(jpc::JPC)
Identifies electrically isolated islands in an AC power system.
- Arguments:
jpc
: Power system case data structure
- Returns:
islands
: List of islands, each containing connected bus indicesisolated_buses
: List of isolated buses
extract_islands(jpc::JPC)
Extracts electrically isolated islands from a power system case.
- Arguments:
jpc
: Power system case data structure
- Returns:
Vector{JPC}
: List of JPC objects, each representing a separate island
Node Mapping
create_node_mapping(case::JuliaPowerCase)
Creates numbering mapping for nodes and detects duplicate nodes.
- Arguments:
case
: JuliaPowerCase object
- Returns: A dictionary mapping node names to IDs
resolve_node_mapping(node_id, node_merge_map)
Resolves the final mapping of a node by traversing through a node merge map.
- Arguments:
node_id
: The initial node ID to resolvenode_merge_map
: A dictionary mapping source nodes to destination nodes
- Returns: The final resolved node ID after following all mappings
Virtual Node Handling
merge_virtual_nodes(case::JuliaPowerCase)
Merges virtual nodes in a power system case and updates all connected elements.
- Arguments:
case
: JuliaPowerCase object
- Returns: Updated case with virtual nodes merged
Data Extraction
extract_data(sheet_name::String, xf)
Extracts data from an Excel worksheet into a matrix.
- Arguments:
sheet_name
: Name of the worksheetxf
: Excel file object
- Returns: Matrix containing the extracted data
Data Format Conversion
MATLAB to Julia Conversion
parse_matlab_case_file(filepath)
Parses a MATPOWER case file in MATLAB format and converts it to Julia data structures.
- Arguments:
filepath
: Path to the MATLAB case file
- Returns: Parsed power system data in Julia format
JuliaPowerCase to JPC Conversion
JuliaPowerCase2Jpc(case::JuliaPowerCase)
Converts a JuliaPowerCase object to a JPC (Julia Power Case) object.
- Arguments:
case
: JuliaPowerCase object
- Returns: JPC object
JuliaPowerCase2Jpc_3ph(case::JuliaPowerCase)
Converts a JuliaPowerCase object to a three-phase JPC_3ph object.
- Arguments:
case
: JuliaPowerCase object
- Returns:
jpc_3ph
: The converted three-phase power system model- Additional parameters for three-phase analysis
ETAP Data Import
load_julia_power_data(file_path::String)
Loads power system data from an Excel file and converts it to a JuliaPowerCase structure.
- Arguments:
file_path
: Path to the Excel file
- Returns: JuliaPowerCase structure containing all power system components
Indexing Constants
The idx.jl
file provides constants for indexing into power system data matrices:
function idx_bus()
# define bus types
PQ = 1;
PV = 2;
REF = 3;
NONE = 4;
# define the indices
BUS_I = 1; # bus number (1 to 29997)
BUS_TYPE = 2; # bus type (1-PQ, 2-PV, 3-ref, 4-isolated)
PD = 3; # Pd, real power demand (MW)
QD = 4; # Qd, reactive power demand (MVAr)
GS = 5; # Gs, shunt conductance (MW at V = 1.0 p.u.)
BS = 6; # Bs, shunt susceptance (MVAr at V = 1.0 p.u.)
BUS_AREA = 7; # area number, 1-100
VM = 8; # Vm, voltage magnitude (p.u.)
VA = 9; # Va, voltage angle (degrees)
BASE_KV = 10; # baseKV, base voltage (kV)
ZONE = 11; # zone, loss zone (1-999)
VMAX = 12; # maxVm, maximum voltage magnitude (p.u.)
VMIN = 13; # minVm, minimum voltage magnitude (p.u.)
return PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, VA, BASE_KV, ZONE, VMAX, VMIN
end
Similar indexing functions are provided for generators, branches, and other power system components.
Types
The Types.jl
file defines data structures for power system analysis, including:
mutable struct MicrogridPlanningProblem
# Constants
bigM::Float64
# Planning parameters
nPV::Int
nBESS::Int
DeltaPV::Float64
DeltaBESS::Float64
# Technical parameters
soc0::Float64
soc_max::Float64
soc_min::Float64
eta_ug::Float64
eff_ch::Float64
eff_dc::Float64
# Economic parameters
pv_unit_cost::Float64
ess_unit_cost_e::Float64
ess_unit_cost_p::Float64
ug_unit_cost::Float64
carbon_permit_price::Float64
carbon_emission_coeff::Float64
npv::Float64
# Reliability parameters
ug_prob::Float64
mg_prob::Float64
power_requirements::Float64
energy_requirements::Float64
pv_power_factor::Float64
pv_energy_factor::Float64
# Carbon emission limit
carbon_limit::Float64
# Uncertainty parameters
ns::Int
ws::Vector{Float64}
T::Int
ppv_un::Int
pl::Int
fl::Int
ug_status::Int
ele_price::Int
carbon_price::Int
carbon_emission_ug::Int
nu::Int
NU::Int
# Indices
IPV::Int
IESS::Int
IPESS::Int
PUG::Int
CARBON_PERMIT::Int
CARBON::Int
NX::Int
# First stage constraints
lx::Vector{Float64}
ux::Vector{Float64}
vtypex::Vector{Char}
Aeq::SparseMatrixCSC{Float64, Int}
beq::Vector{Float64}
A::SparseMatrixCSC{Float64, Int}
b::Vector{Float64}
# Objective function
c::Vector{Float64}
# Second stage indices
pug::Int
pug_sold::Int
ppv::Int
pess_ch::Int
pess_dc::Int
eess::Int
iess_ch::Int
iess_dc::Int
wpv::Int
wpess_dc::Int
wpess_ch::Int
plc::Int
pf::Int
ny::Int
NY::Int
end
mutable struct JuliaPowerCase
version::String
baseMVA::Float32
basef::Float32
# AC Network Components
busesAC::Vector{Bus} # Matches busAC in JPC
branchesAC::Vector{Line} # Matches branchAC in JPC
loadsAC::Vector{Load} # Matches loadAC in JPC
loadsAC_flex::Vector{FlexLoad} # Matches loadAC_flex in JPC
loadsAC_asymm::Vector{AsymmetricLoad} # Matches loadAC_asymm in JPC
# branches3ph::Vector{ThreePhaseBranch} # Matches branch3ph in JPC
gensAC::Vector{Generator} # Matches genAC in JPC
# DC Network Components
busesDC::Vector{BusDC} # Matches busDC in JPC
branchesDC::Vector{LineDC} # Matches branchDC in JPC
loadsDC::Vector{LoadDC} # Matches loadDC in JPC
# Distributed Energy Resources
sgensAC::Vector{StaticGenerator} # Matches sgenAC in JPC
storages::Vector{Storage} # Matches storage in JPC
storageetap::Vector{Storageetap} # Matches storageetap in JPC
sgensDC::Vector{StaticGeneratorDC} # Matches sgenDC in JPC
pvarray::Vector{PVArray} # Matches pv_array in JPC
ACPVSystems::Vector{ACPVSystem} # Matches AC PV systems in JPC
# Special Components
converters::Vector{Converter} # Matches converter in JPC
ext_grids::Vector{ExternalGrid} # Matches ext_grid in JPC
hvcbs::Vector{HighVoltageCircuitBreaker} # Matches hvcb in JPC
microgrids::Vector{Microgrid} # Matches microgrid in JPC
# Original components without direct JPC equivalents (preserved)
transformers_2w::Vector{Transformer2W}
transformers_3w::Vector{Transformer3W}
transformers_2w_etap::Vector{Transformer2Wetap}
charging_stations::Vector{ChargingStation}
chargers::Vector{Charger}
ev_aggregators::Vector{EVAggregator}
virtual_power_plants::Vector{VirtualPowerPlant}
carbon_time_series::Vector{CarbonTimeSeries}
equipment_carbon::Vector{EquipmentCarbon}
# Lookup dictionaries
bus_name_to_id::Dict{String, Int}
busdc_name_to_id::Dict{String, Int}
zone_to_id::Dict{String, Int}
area_to_id::Dict{String, Int}
end
mutable struct JPC
version::String
baseMVA::Float64
success::Bool
iterationsAC::Int
iterationsDC::Int
# AC Network Components
busAC::Array{Float64,2} # Bus data
genAC::Array{Float64,2} # Generator data
branchAC::Array{Float64,2} # Branch data
loadAC::Array{Float64,2} # Load data
loadAC_flex::Array{Float64,2} # Flexible load data
loadAC_asymm::Array{Float64,2} # Asymmetric load data
branch3ph::Array{Float64,2} # Three-phase branch data
# DC Network Components
busDC::Array{Float64,2} # DC bus data
branchDC::Array{Float64,2} # DC branch data
genDC::Array{Float64,2} # DC generator data
loadDC::Array{Float64,2} # DC load data
# Distributed Energy Resources
sgenAC::Array{Float64,2} # Solar/PV generation data
storageetap::Array{Float64,2} # Energy storage system data
storage::Array{Float64,2} # Energy storage system data
sgenDC::Array{Float64,2} # DC-connected PV data
pv::Array{Float64,2} # PV array data
pv_acsystem::Array{Float64,2} # AC PV systems data
# Special Components
converter::Array{Float64,2} # AC/DC converter data
ext_grid::Array{Float64,2} # External grid data
hvcb::Array{Float64,2} # High voltage circuit breaker data
microgrid::Array{Float64,2} # Microgrid data
end
mutable struct JPC_3ph
version::String
baseMVA::Float32
basef::Float32
mode::String
success::Bool # Flag indicating if three-phase power flow converged
iterations::Int # Number of iterations for three-phase power flow
# AC Network Components - Matrix representations of JuliaPowerCase components
busAC_0::Array{Float64,2} # Phase A bus data
busAC_1::Array{Float64,2} # Phase B bus data
busAC_2::Array{Float64,2} # Phase C bus data
branchAC_0::Array{Float64,2} # Phase A branch data
branchAC_1::Array{Float64,2} # Phase B branch data
branchAC_2::Array{Float64,2} # Phase C branch data
loadAC_0::Array{Float64,2} # Phase A load data
loadAC_1::Array{Float64,2} # Phase B load data
loadAC_2::Array{Float64,2} # Phase C load data
genAC_0::Array{Float64,2} # Phase A generator data
genAC_1::Array{Float64,2} # Phase B generator data
genAC_2::Array{Float64,2} # Phase C generator data
storageAC::Array{Float64,2} # Storage data
# DC Network Components
busDC::Array{Float64,2} # DC bus data
branchDC::Array{Float64,2} # DC branch data
loadDC::Array{Float64,2} # DC load data
genDC::Array{Float64,2} # DC generator data
storageDC::Array{Float64,2} # DC storage data
# Special Components
ext_grid::Array{Float64,2} # External grid data
switche::Array{Float64,2} # Switch data
# Three-phase power flow results
res_bus_3ph::Array{Float64,2} # Bus results from three-phase power flow
res_loadsAC_3ph::Array{Float64,2} # Load results from three-phase power flow
res_ext_grid_3ph::Array{Float64,2} # External grid results from three-phase power flow
# Lookup dictionaries
bus_name_to_id::Dict{String, Int}
zone_to_id::Dict{String, Int}
area_to_id::Dict{String, Int}
end
This structure contains all parameters and variables for microgrid planning optimization.