diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/buses.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/buses.csv new file mode 100644 index 0000000..3817d3d --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/buses.csv @@ -0,0 +1,3 @@ +name,base_power_MVA,base_voltage_kV,base_frequency_Hz,minimum_voltage_pu,maximum_voltage_pu +lima,1.00E+02,2.30E+02,60,0.95,1.05 +santiago,1.00E+02,2.30E+02,60,0.95,1.05 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/gfmi_e.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/gfmi_e.csv new file mode 100644 index 0000000..8ae66d8 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/gfmi_e.csv @@ -0,0 +1,2 @@ +name,bus,minimum_active_power_MW,maximum_active_power_MW,minimum_reactive_power_MVAR,maximum_reactive_power_MVAR,base_power_MVA,base_voltage_kV,base_frequency_Hz,cost_variable_USDperMWh,rf1_pu,xf1_pu,rsh_pu,csh_pu,txr_power_MVA,txr_voltage1_kV,txr_voltage2_kV,txr_r1_pu,txr_x1_pu,txr_r2_pu,txr_x2_pu,h_s,kd_pu,droop_q_pu,tau_pc_s,kp_vc_pu,ki_vc_puHz,kp_v_dc,ki_v_dc,kp_i_L,ki_i_L,l_dc,c_dc,v_dc_ref,v_s,Ti_L,Tv_dc,Ti_dc,Kff_idc,Kff_iload,Ti_load,Tload,i_load_ref +solar,santiago,-10,-10,0,0,1.00E+02,4.80E-01,60,0,0.01,0.1,10000,0.1,1.00E+02,4.80E-01,2.30E+02,0.01,0.1,0.02,0.1,0.5,70,0.01,0.001,1,10,1.2,20,1,10,1,20,1.0,0.5,0.01,0.01,0.01,1,1,0.01,0.001,0.1 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/infinite_sources.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/infinite_sources.csv new file mode 100644 index 0000000..9d95931 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/infinite_sources.csv @@ -0,0 +1,2 @@ +name,bus,minimum_active_power_MW,maximum_active_power_MW,minimum_reactive_power_MVAR,maximum_reactive_power_MVAR,base_power_MVA,base_voltage_kV,base_frequency_Hz,cost_variable_USDperMWh,r_pu,x_pu +gen1,lima,-200,200,-500,500,1.00E+02,2.30E+02,60,0,0.01,0.5 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/lines.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/lines.csv new file mode 100644 index 0000000..74a86b2 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/lines.csv @@ -0,0 +1,2 @@ +name,from_bus,to_bus,base_power_MVA,base_voltage_kV,base_frequency_Hz,r_pu,x_pu,g_pu,b_pu +tx_1,lima,santiago,1.00E+02,2.30E+02,60,0.01,0.5,0.05,0.066666667 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/loads.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/loads.csv new file mode 100644 index 0000000..79d806e --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/loads.csv @@ -0,0 +1,3 @@ +bus,timepoint,load_MW,load_MVAR +lima,t_1,0,0 +chile,t_1,0,0 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/timepoints.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/timepoints.csv new file mode 100644 index 0000000..ad319a5 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/inputs/timepoints.csv @@ -0,0 +1,2 @@ +name +timepoint_1 \ No newline at end of file diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/active_power_balance_by_bus.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/active_power_balance_by_bus.csv new file mode 100644 index 0000000..c0a07a8 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/active_power_balance_by_bus.csv @@ -0,0 +1,3 @@ +bus,timepoint,generator_dispatch_MW,load_shedding_MW,load_MW,net_line_leaving_flow_MW +lima,timepoint_1,20.024029596964457,-9.99090909090909e-9,0.0,20.024029586973448 +santiago,timepoint_1,-10.0,-9.990909090909092e-9,0.0,-10.000000009990726 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/bus_voltage.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/bus_voltage.csv new file mode 100644 index 0000000..753a447 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/bus_voltage.csv @@ -0,0 +1,3 @@ +id,bus,timepoint,voltage_magnitude_pu,voltage_angle_deg +0,lima,timepoint_1,0.9850307325446462,0.0 +1,santiago,timepoint_1,1.0144691438583457,-4.385666517431731 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/costs_summary.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/costs_summary.csv new file mode 100644 index 0000000..6122372 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/costs_summary.csv @@ -0,0 +1,2 @@ +component,cost +total_cost_USD,-0.00003996363636363637 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/generator_dispatch.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/generator_dispatch.csv new file mode 100644 index 0000000..c8329f2 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/generator_dispatch.csv @@ -0,0 +1,3 @@ +id,type,generator,timepoint,active_power_MW,reactive_power_MVAR +0,infinite_sources,gen1,timepoint_1,20.024029596964457,-11.986372758049026 +0,gfmi_e,solar,timepoint_1,-10.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/line_flows.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/line_flows.csv new file mode 100644 index 0000000..efe99e5 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/line_flows.csv @@ -0,0 +1,2 @@ +line,from_bus,to_bus,existing_capacity_MW,active_power_from_bus_MW,reactive_power_from_bus_MVAR,active_power_to_bus_MW,reactive_power_to_bus_MVAR,active_power_loss_MW,reactive_power_loss_MVAR +tx_1,lima,santiago,inf,20.02402958697347,-11.986372768040068,-10.000000009990744,-9.99095410228382e-9,10.024029576982725,-11.986372778031022 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/load_shedding.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/load_shedding.csv new file mode 100644 index 0000000..8c5a706 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/load_shedding.csv @@ -0,0 +1,3 @@ +bus,timepoint,active_load_shedding_MW,reactive_load_shedding_MVAR +lima,timepoint_1,-9.99090909090909e-9,-9.99090909090909e-9 +santiago,timepoint_1,-9.990909090909092e-9,-9.990909090909097e-9 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/reactive_power_balance_by_bus.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/reactive_power_balance_by_bus.csv new file mode 100644 index 0000000..726b458 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/reactive_power_balance_by_bus.csv @@ -0,0 +1,3 @@ +bus,timepoint,generator_dispatch_MVAR,load_shedding_MVAR,load_MVAR,net_line_leaving_flow_MVAR +lima,timepoint_1,-11.986372758049026,-9.99090909090909e-9,0.0,-11.986372768040068 +santiago,timepoint_1,0.0,-9.990909090909097e-9,0.0,-9.990909050803768e-9 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/solver_status.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/solver_status.csv new file mode 100644 index 0000000..6b473ea --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/ac_power_flow/solver_status.csv @@ -0,0 +1,5 @@ +attribute,value +solver_name,ipopt +solver_status,ok +termination_condition,optimal +time_spent_seconds,0.9590749740600586 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/F.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/F.csv new file mode 100644 index 0000000..e41178d --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/F.csv @@ -0,0 +1,21 @@ +Index,"('infinite_sources_0', 'i_bus_D')","('infinite_sources_0', 'i_bus_Q')","('gfmi_e_0', 'i_bus_D')","('gfmi_e_0', 'i_bus_Q')","('pa_rc_0', 'v_bus_D')","('pa_rc_0', 'v_bus_Q')","('pa_rc_1', 'v_bus_D')","('pa_rc_1', 'v_bus_Q')","('se_rl_0', 'i_br_D')","('se_rl_0', 'i_br_Q')" +"('infinite_sources_0', 'v_ref_d')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_ref_q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_bus_D')",0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'p_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'q_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_dc_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_s')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_load_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 +"('pa_rc_0', 'i_bus_D')",1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-1.0,0.0 +"('pa_rc_0', 'i_bus_Q')",0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-1.0 +"('pa_rc_1', 'i_bus_D')",0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +"('pa_rc_1', 'i_bus_Q')",0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0 +"('se_rl_0', 'v_from_bus_D')",0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_from_bus_Q')",0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_to_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 +"('se_rl_0', 'v_to_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/G.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/G.csv new file mode 100644 index 0000000..72d52df --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/G.csv @@ -0,0 +1,21 @@ +Index,"('infinite_sources_0', 'v_ref_d')","('infinite_sources_0', 'v_ref_q')","('gfmi_e_0', 'p_ref')","('gfmi_e_0', 'q_ref')","('gfmi_e_0', 'v_ref')","('gfmi_e_0', 'v_dc_ref')","('gfmi_e_0', 'v_s')","('gfmi_e_0', 'i_load_ref')" +"('infinite_sources_0', 'v_ref_d')",1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_ref_q')",0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'p_ref')",0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'q_ref')",0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_ref')",0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_dc_ref')",0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 +"('gfmi_e_0', 'v_s')",0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +"('gfmi_e_0', 'i_load_ref')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 +"('gfmi_e_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_from_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_from_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_to_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'v_to_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/H.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/H.csv new file mode 100644 index 0000000..ba4ffa4 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/H.csv @@ -0,0 +1,11 @@ +Index,"('infinite_sources_0', 'i_bus_D')","('infinite_sources_0', 'i_bus_Q')","('gfmi_e_0', 'i_bus_D')","('gfmi_e_0', 'i_bus_Q')","('pa_rc_0', 'v_bus_D')","('pa_rc_0', 'v_bus_Q')","('pa_rc_1', 'v_bus_D')","('pa_rc_1', 'v_bus_Q')","('se_rl_0', 'i_br_D')","('se_rl_0', 'i_br_Q')" +"('infinite_sources_0', 'i_bus_D')",1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_Q')",0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_D')",0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_Q')",0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_D')",0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/L.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/L.csv new file mode 100644 index 0000000..aa2b8d8 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/component_connection_matrices/L.csv @@ -0,0 +1,11 @@ +Index,"('infinite_sources_0', 'v_ref_d')","('infinite_sources_0', 'v_ref_q')","('gfmi_e_0', 'p_ref')","('gfmi_e_0', 'q_ref')","('gfmi_e_0', 'v_ref')","('gfmi_e_0', 'v_dc_ref')","('gfmi_e_0', 'v_s')","('gfmi_e_0', 'i_load_ref')" +"('infinite_sources_0', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/A.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/A.csv new file mode 100644 index 0000000..dd0ac99 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/A.csv @@ -0,0 +1,29 @@ +Index,"('infinite_sources_0', 'i_bus_d')","('infinite_sources_0', 'i_bus_q')","('gfmi_e_0', 'angle_pc')","('gfmi_e_0', 'w_pc')","('gfmi_e_0', 'p_pc')","('gfmi_e_0', 'q_pc')","('gfmi_e_0', 'pi_vc')","('gfmi_e_0', 'i_vsc_d')","('gfmi_e_0', 'i_vsc_q')","('gfmi_e_0', 'i_bus_d')","('gfmi_e_0', 'i_bus_q')","('gfmi_e_0', 'v_lcl_sh_d')","('gfmi_e_0', 'v_lcl_sh_q')","('gfmi_e_0', 'i_l_f')","('gfmi_e_0', 'v_dc_f')","('gfmi_e_0', 'i_dc_f')","('gfmi_e_0', 'i_load_f')","('gfmi_e_0', 'x_1')","('gfmi_e_0', 'x_2')","('gfmi_e_0', 'i_L')","('gfmi_e_0', 'v_dc')","('gfmi_e_0', 'i_load')","('pa_rc_0', 'v_bus_D')","('pa_rc_0', 'v_bus_Q')","('pa_rc_1', 'v_bus_D')","('pa_rc_1', 'v_bus_Q')","('se_rl_0', 'i_br_D')","('se_rl_0', 'i_br_Q')" +"('infinite_sources_0', 'i_bus_d')",-7.5398223686155035,376.99111843077515,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-749.3755584175443,-83.21950461965382,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_q')",-376.99111843077515,-7.5398223686155035,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,83.21950461965382,-749.3755584175443,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'angle_pc')",0.0,0.0,0.0,376.99111843077515,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'w_pc')",0.0,0.0,0.0,-70.0,-1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'p_pc')",0.0,0.0,0.0,0.0,-1000.0,0.0,0.0,0.0,0.0,1011.6644575859594,8.949041881888602,-98.5341583153472,-2.792568273869858,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'q_pc')",0.0,0.0,0.0,0.0,0.0,-1000.0,0.0,0.0,0.0,8.949041881888602,-1011.6644575859594,2.792568273869858,-98.5341583153472,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'pi_vc')",0.0,0.0,0.0,0.0,0.0,-0.1,0.0,0.0,0.0,0.0,0.0,-9.999608776788051,-0.08845513655734374,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_vsc_d')",0.0,0.0,0.0,37.086415468269735,0.0,-37.69911184307752,3769.9111843077517,-37.69911184307751,376.99111843077515,0.0,0.0,-7539.674880939275,-33.34680086169996,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_vsc_q')",0.0,0.0,0.0,37.44573462619731,0.0,0.0,0.0,-376.99111843077515,-37.69911184307751,0.0,0.0,0.0,-3769.9111843077517,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_d')",0.0,0.0,-54.17296510215203,-1.052773436860497,0.0,0.0,0.0,0.0,0.0,-56.54866776461627,376.99111843077515,1884.9555921538758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-1874.5984341253277,197.32788745394876,0.0,0.0 +"('gfmi_e_0', 'i_bus_q')",0.0,0.0,1911.4617786551519,37.1465025469378,0.0,0.0,0.0,0.0,0.0,-376.99111843077515,-56.54866776461627,0.0,1884.9555921538758,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-197.32788745394876,-1874.5984341253277,0.0,0.0 +"('gfmi_e_0', 'v_lcl_sh_d')",0.0,0.0,0.0,3.3737093079370326,0.0,0.0,0.0,3769.9111843077517,0.0,-3769.9111843077517,0.0,-0.37699111843077515,376.99111843077515,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_lcl_sh_q')",0.0,0.0,0.0,-381.3885153419943,0.0,0.0,0.0,0.0,3769.9111843077517,0.0,-3769.9111843077517,-376.99111843077515,-0.37699111843077515,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_l_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-100.0,0.0,0.0,0.0,0.0,0.0,100.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_dc_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-100.0,0.0,0.0,0.0,0.0,0.0,100.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_dc_f')",0.0,0.0,0.0,0.0,0.0,0.09932789605777746,-9.932789605777746,100.08337013864903,1.7018489238183393e-16,0.0,0.0,9.932401011992427,0.0878606260974435,0.0,0.0,-100.0,0.0,0.0,0.0,0.0,9.9410705862438,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_load_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-100.0,0.0,0.0,0.0,0.0,100.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'x_1')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-20.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'x_2')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-10.0,-12.0,10.0,10.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_L')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-376.99111843077515,-452.38934211693015,376.99111843077515,376.99111843077515,376.99111843077515,376.99111843077515,0.0,-188.49555921538757,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_dc')",0.0,0.0,0.0,0.0,0.0,-0.018722867313098655,1.8722867313098654,-18.86527082244527,-3.207909645952434e-17,0.0,0.0,-1.8722134831069943,-0.01656133784925169,0.022215865600420028,0.02665903872050403,-0.022215865600420028,-0.022215865600420028,-0.022215865600420028,-0.022215865600420028,9.42477796076938,-1.873847659353666,-18.84955592153876,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_load')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-1000.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_D')",5620.316660029999,-624.1462815266722,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-282.7433374093647,376.99111843077515,0.0,0.0,-5654.8667481872935,0.0 +"('pa_rc_0', 'v_bus_Q')",624.1462815266722,5620.316660029999,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-376.99111843077515,-282.7433374093647,0.0,0.0,0.0,-5654.8667481872935 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,-42.625779353978785,0.0,0.0,0.0,0.0,0.0,0.0,5623.795274257007,591.983659401928,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-282.7433374093647,376.99111843077515,5654.8667481872935,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,-555.7890886726366,0.0,0.0,0.0,0.0,0.0,0.0,-591.983659401928,5623.795274257007,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-376.99111843077515,-282.7433374093647,0.0,5654.8667481872935 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,753.9822368615503,0.0,-753.9822368615503,0.0,-7.5398223686155035,376.99111843077515 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,753.9822368615503,0.0,-753.9822368615503,-376.99111843077515,-7.5398223686155035 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/B.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/B.csv new file mode 100644 index 0000000..88c69cc --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/B.csv @@ -0,0 +1,29 @@ +Index,"('infinite_sources_0', 'v_ref_d')","('infinite_sources_0', 'v_ref_q')","('gfmi_e_0', 'p_ref')","('gfmi_e_0', 'q_ref')","('gfmi_e_0', 'v_ref')","('gfmi_e_0', 'v_dc_ref')","('gfmi_e_0', 'v_s')","('gfmi_e_0', 'i_load_ref')" +"('infinite_sources_0', 'i_bus_d')",753.9822368615503,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_q')",0.0,753.9822368615503,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'angle_pc')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'w_pc')",0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'p_pc')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'q_pc')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'pi_vc')",0.0,0.0,0.0,0.1,10.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_vsc_d')",0.0,0.0,0.0,37.69911184307752,3769.9111843077517,0.0,0.0,0.0 +"('gfmi_e_0', 'i_vsc_q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_d')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_lcl_sh_d')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_lcl_sh_q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_l_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'v_dc_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_dc_f')",0.0,0.0,0.0,-0.09932789605777746,-9.932789605777746,0.0,0.0,0.0 +"('gfmi_e_0', 'i_load_f')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'x_1')",0.0,0.0,0.0,0.0,0.0,20.0,0.0,0.0 +"('gfmi_e_0', 'x_2')",0.0,0.0,0.0,0.0,0.0,12.0,0.0,0.0 +"('gfmi_e_0', 'i_L')",0.0,0.0,0.0,0.0,0.0,452.38934211693015,376.99111843077515,0.0 +"('gfmi_e_0', 'v_dc')",0.0,0.0,0.0,0.018722867313098655,1.8722867313098654,-0.02665903872050403,0.0,0.0 +"('gfmi_e_0', 'i_load')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,1000.0 +"('pa_rc_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/C.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/C.csv new file mode 100644 index 0000000..b1e47fb --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/C.csv @@ -0,0 +1,11 @@ +Index,"('infinite_sources_0', 'i_bus_d')","('infinite_sources_0', 'i_bus_q')","('gfmi_e_0', 'angle_pc')","('gfmi_e_0', 'w_pc')","('gfmi_e_0', 'p_pc')","('gfmi_e_0', 'q_pc')","('gfmi_e_0', 'pi_vc')","('gfmi_e_0', 'i_vsc_d')","('gfmi_e_0', 'i_vsc_q')","('gfmi_e_0', 'i_bus_d')","('gfmi_e_0', 'i_bus_q')","('gfmi_e_0', 'v_lcl_sh_d')","('gfmi_e_0', 'v_lcl_sh_q')","('gfmi_e_0', 'i_l_f')","('gfmi_e_0', 'v_dc_f')","('gfmi_e_0', 'i_dc_f')","('gfmi_e_0', 'i_load_f')","('gfmi_e_0', 'x_1')","('gfmi_e_0', 'x_2')","('gfmi_e_0', 'i_L')","('gfmi_e_0', 'v_dc')","('gfmi_e_0', 'i_load')","('pa_rc_0', 'v_bus_D')","('pa_rc_0', 'v_bus_Q')","('pa_rc_1', 'v_bus_D')","('pa_rc_1', 'v_bus_Q')","('se_rl_0', 'i_br_D')","('se_rl_0', 'i_br_Q')" +"('infinite_sources_0', 'i_bus_D')",0.9938902029533464,-0.11037329601563937,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_Q')",0.11037329601563937,0.9938902029533464,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_D')",0.0,0.0,-0.007537892801389666,0.0,0.0,0.0,0.0,0.0,0.0,0.9945053570112422,0.10468569566059048,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_Q')",0.0,0.0,-0.09828509024563639,0.0,0.0,0.0,0.0,0.0,0.0,-0.10468569566059048,0.9945053570112422,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/D.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/D.csv new file mode 100644 index 0000000..aa2b8d8 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/D.csv @@ -0,0 +1,11 @@ +Index,"('infinite_sources_0', 'v_ref_d')","('infinite_sources_0', 'v_ref_q')","('gfmi_e_0', 'p_ref')","('gfmi_e_0', 'q_ref')","('gfmi_e_0', 'v_ref')","('gfmi_e_0', 'v_dc_ref')","('gfmi_e_0', 'v_s')","('gfmi_e_0', 'i_load_ref')" +"('infinite_sources_0', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('infinite_sources_0', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('gfmi_e_0', 'i_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_0', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('pa_rc_1', 'v_bus_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_D')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +"('se_rl_0', 'i_br_Q')",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/u.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/u.csv new file mode 100644 index 0000000..a8d0368 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/u.csv @@ -0,0 +1,9 @@ +name,component,type,init +v_ref_d,infinite_sources_0,device,0.9319147420205057 +v_ref_q,infinite_sources_0,device,2.4364261741631428e-17 +p_ref,gfmi_e_0,device,-0.09970849663622566 +q_ref,gfmi_e_0,device,0.0019433557584956256 +v_ref,gfmi_e_0,device,1.0117040377962803 +v_dc_ref,gfmi_e_0,device,1.0 +v_s,gfmi_e_0,device,0.5 +i_load_ref,gfmi_e_0,device,0.1 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/x.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/x.csv new file mode 100644 index 0000000..8fe7525 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/x.csv @@ -0,0 +1,29 @@ +name,component,type,init +i_bus_d,infinite_sources_0,"",0.21547208231583534 +i_bus_q,infinite_sources_0,"",0.09850474697346907 +angle_pc,gfmi_e_0,"",0.0 +w_pc,gfmi_e_0,"",1.0 +p_pc,gfmi_e_0,"",-0.09970849663622566 +q_pc,gfmi_e_0,"",0.0019433557584956256 +pi_vc,gfmi_e_0,"",1.0008337013864903 +i_vsc_d,gfmi_e_0,"",-0.09932789605777746 +i_vsc_q,gfmi_e_0,"",0.09837477238891429 +i_bus_d,gfmi_e_0,"",-0.0985341583153472 +i_bus_q,gfmi_e_0,"",-0.0027925682738698583 +v_lcl_sh_d,gfmi_e_0,"",1.0116644575859595 +v_lcl_sh_q,gfmi_e_0,"",0.008949041881888602 +i_l_f,gfmi_e_0,"",0.001178588275124015 +v_dc_f,gfmi_e_0,"",1.0 +i_dc_f,gfmi_e_0,"",-0.099410705862438 +i_load_f,gfmi_e_0,"",0.1 +x_1,gfmi_e_0,"",0.0005892941375620075 +x_2,gfmi_e_0,"",0.5 +i_L,gfmi_e_0,"",0.001178588275124015 +v_dc,gfmi_e_0,"",1.0 +i_load,gfmi_e_0,"",0.1 +v_bus_D,pa_rc_0,"",0.9850307325446462 +v_bus_Q,pa_rc_0,"",0.0 +v_bus_D,pa_rc_1,"",1.0114986905096575 +v_bus_Q,pa_rc_1,"",-0.07757604616073832 +i_br_D,se_rl_0,"",0.15403176129835686 +i_br_Q,se_rl_0,"",0.05601655115598958 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/y.csv b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/y.csv new file mode 100644 index 0000000..30a92aa --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/outputs/small_signal_model/y.csv @@ -0,0 +1,11 @@ +name,component,type,init +i_bus_D,infinite_sources_0,"",0.2032832980270174 +i_bus_Q,infinite_sources_0,"",0.12168526688588112 +i_bus_D,gfmi_e_0,"",-0.09828509024563638 +i_bus_Q,gfmi_e_0,"",0.007537892801389665 +v_bus_D,pa_rc_0,"",0.9850307325446462 +v_bus_Q,pa_rc_0,"",0.0 +v_bus_D,pa_rc_1,"",1.0114986905096575 +v_bus_Q,pa_rc_1,"",-0.07757604616073832 +i_br_D,se_rl_0,"",0.15403176129835686 +i_br_Q,se_rl_0,"",0.05601655115598958 diff --git a/examples/small_signal_and_emt/2-bus-src-gfmi_e/run.py b/examples/small_signal_and_emt/2-bus-src-gfmi_e/run.py new file mode 100644 index 0000000..d862599 --- /dev/null +++ b/examples/small_signal_and_emt/2-bus-src-gfmi_e/run.py @@ -0,0 +1,70 @@ +# In progress - March 5, 2026 - Ruth + +# Import Python standard and third-party packages +from pathlib import Path + +# Import sting package +from sting.system.core import System +from sting.system.operations import SystemModifier +from sting.modules.power_flow.core import ACPowerFlow +from sting.modules.simulation_emt.core import SimulationEMT +from sting.modules.small_signal_modeling.core import SmallSignalModel + +# Specify path of the case study directory +case_dir = Path(__file__).resolve().parent + +# Construct system and small-signal model +def step1(t): + return 0.1 if t >= 0.5 else 0.0 + +def step2(t): + return 0.0 + +def step3(t): + return 0.1 if t > 1.0 else 0.0 + +# Specify inputs to excite - any constant input does not need to be specified +# NB: input is a perturbation from the nominal value +inputs = {'infinite_sources_0': {'v_ref_d': step1}, + 'gfmi_e_0': {'p_ref': step2, + 'q_ref': step2, + 'v_ref': step2, + 'v_dc_ref': step2, + 'v_s': step2, + 'i_load_ref': step2}} + +t_max = 4.0 + +# Load system from CSV files +sys = System.from_csv(case_directory=case_dir) + +# Match power reference with load +P_load = 10 # MW +sys.gfmi_e[0].minimum_active_power_MW = -P_load +sys.gfmi_e[0].maximum_active_power_MW = -P_load +sys.gfmi_e[0].minimum_reactive_power_MVAR = 0 +sys.gfmi_e[0].maximum_reactive_power_MVAR = 0 + +# i_load_ref*v_dc_ref = i_load_ref*1 = p_load = i_load_ref +Sbase = 100 # MVA +sys.gfmi_e[0].i_load_ref = P_load/Sbase + +# Run power flow +pf = ACPowerFlow(system=sys, model_settings=None, solver_settings=None) +pf.solve() + +# Break down lines into branches and shunts for small-signal modeling +sys_modifier = SystemModifier(system=sys) +sys_modifier.decompose_lines() +sys_modifier.combine_shunts() + +# Construct small-signal model +ssm = SmallSignalModel(system=sys) +ssm.construct_system_ssm() + +ssm.simulate_ssm(t_max=t_max, inputs=inputs) + +emt_sc = SimulationEMT(system=sys) +emt_sc.sim(t_max, inputs) + +print('ok') \ No newline at end of file diff --git a/sting/generator/gfmi_e.py b/sting/generator/gfmi_e.py index 29046b0..99cb9db 100644 --- a/sting/generator/gfmi_e.py +++ b/sting/generator/gfmi_e.py @@ -67,7 +67,6 @@ class InitialConditionsEMT(NamedTuple): x_1: float # DC voltage regulator integrator x_2: float # DC current regulator integrator i_load: float - v_dc_f_L: float p_vsc: float @@ -112,11 +111,10 @@ class GFMIe(Generator): Kff_idc: float Kff_iload: float Ti_load: float # for DC/DC controller - measurement filter - Tvdc_load: float # measurement that the load makes of the dc bus voltage - Pload: float + Tload: float # time constant for actuation of load current change + i_load_ref: float #bus_id: int = None name: str = field(default_factory=str) - type: str = "gfmi_e" #pf: Optional[Power_flow_variables] = None emt_init: Optional[InitialConditionsEMT] = None ssm: Optional[StateSpaceModel] = None @@ -213,10 +211,10 @@ def _build_small_signal_model(self): # DC side # Parameters - l_dc, c_dc, TiL, Tvdc, Tidc, Kp_vdc, Ki_vdc, Kp_iL, Ki_iL, Kff_idc, Kff_iload, Ti_load, Tvdc_load = self.l_dc, self.c_dc, self.Ti_L, self.Tv_dc, self.Ti_dc, self.kp_v_dc, self.ki_v_dc, self.kp_i_L, self.ki_i_L, self.Kff_idc, self.Kff_iload, self.Ti_load, self.Tvdc_load + l_dc, c_dc, TiL, Tvdc, Tidc, Kp_vdc, Ki_vdc, Kp_iL, Ki_iL, Kff_idc, Kff_iload, Ti_load, Tload = self.l_dc, self.c_dc, self.Ti_L, self.Tv_dc, self.Ti_dc, self.kp_v_dc, self.ki_v_dc, self.kp_i_L, self.ki_i_L, self.Kff_idc, self.Kff_iload, self.Ti_load, self.Tload # Initial conditions - v_dc, duty_cycle, i_dc, i_L, x1, x2, i_load, v_dc_f_L, Pload = self.emt_init.v_dc, self.emt_init.d, self.emt_init.i_dc, self.emt_init.i_L, self.emt_init.x_1, self.emt_init.x_2, self.emt_init.i_load, self.emt_init.v_dc_f_L, self.Pload + v_dc, duty_cycle, i_dc, i_L, x1, x2, i_load = self.emt_init.v_dc, self.emt_init.d, self.emt_init.i_dc, self.emt_init.i_L, self.emt_init.x_1, self.emt_init.x_2, self.emt_init.i_load # Controller @@ -265,15 +263,15 @@ def _build_small_signal_model(self): # Load control load = StateSpaceModel( - A = np.array([[-1/Tvdc_load]]), - B = np.array([[1/Tvdc_load, 0]]), - C = np.array([[1/v_dc_f_L]]), - D = np.array([[0, -Pload/(v_dc_f_L**2)]]), - u = DynamicalVariables(name=['v_dc', 'Pload']), + A = np.array([[-1/Tload]]), + B = np.array([[1/Tload]]), + C = np.array([[1]]), + D = np.array([[0]]), + u = DynamicalVariables(name=['i_load_ref']), y = DynamicalVariables(name=['i_load']), x = DynamicalVariables( - name = ['v_dc_f_L'], - init = [v_dc_f_L] + name = ['i_load'], + init = [i_load] ) ) @@ -316,8 +314,7 @@ def _build_small_signal_model(self): np.hstack( (np.zeros(11,),[1, 0, 0, 0])), # d np.hstack( ([0, 0, 0, a2, a4, a1, a3, 0, 0, 0, 0, 0, 0, a5, 0])), # i_dc np.hstack( (np.zeros(14,), [1])), # i_load - np.hstack( (np.zeros(13,), [1, 0])), # v_dc - np.hstack( (np.zeros(13,), [1, 0])) # Pload + np.hstack( (np.zeros(13,), [0, 0])) # i_load_ref )) # G is 25 x 8 matrix Gccm = np.vstack(( np.zeros((4,8)) , @@ -329,8 +326,8 @@ def _build_small_signal_model(self): np.zeros((4,8)), # i_L, v_dc, i_dc, i_load np.hstack( ([0, 0, 0, 1], np.zeros(4,))), # vdc_ref np.hstack( ([0, 0, 0, 0, 1], np.zeros(3,))), # v_s - np.zeros((4,8)), #d, i_dc, i_load, v_dc - np.hstack( (np.zeros(5,), [1, 0, 0])) # Pload + np.zeros((3,8)), #d, i_dc, i_load + np.hstack( (np.zeros(5,), [1, 0, 0])) # i_load_ref )) # H is 2 x 15 @@ -346,9 +343,9 @@ def _build_small_signal_model(self): # Inputs and outputs u = DynamicalVariables( - name=["p_ref", "q_ref", "v_ref", "v_dc_ref", "v_s", 'Pload', "v_bus_D", "v_bus_Q"], + name=["p_ref", "q_ref", "v_ref", "v_dc_ref", "v_s", 'i_load_ref', "v_bus_D", "v_bus_Q"], type=["device", "device", "device", "device", "device", "device", "grid", "grid"], - init=[p_ref, q_ref, v_ref, self.v_dc_ref, self.v_s, self.Pload, v_bus_D, v_bus_Q] + init=[p_ref, q_ref, v_ref, self.v_dc_ref, self.v_s, self.i_load_ref, v_bus_D, v_bus_Q] ) i_bus_D, i_bus_Q = self.emt_init.i_bus_D, self.emt_init.i_bus_Q @@ -358,7 +355,7 @@ def _build_small_signal_model(self): ) # Generate small-signal model - ssm = StateSpaceModel.from_interconnected(components, connections, u, y, component_label=f"{self.type}_{self.id}") + ssm = StateSpaceModel.from_interconnected(components, connections, u, y, component_label=f"{self.type_}_{self.id}") self.ssm = ssm @@ -405,20 +402,15 @@ def _calculate_emt_initial_conditions(self): v_lcl_sh_dq = v_lcl_sh_DQ * np.exp(-angle_ref * np.pi / 180 * 1j) # DC-side initial conditions - v_dc = self.v_dc_ref duty_cycle = (v_dc - self.v_s)/v_dc p_vsc = (v_vsc_dq*np.conjugate(i_vsc_dq)).real # power at converter terminals i_dc = p_vsc/v_dc - i_load = self.Pload/v_dc + i_load = self.i_load_ref i_L = (i_load+i_dc)/(1-duty_cycle) x_1 = i_L - self.Kff_idc*i_dc - self.Kff_iload*i_load x_2 = duty_cycle - self.kp_i_L*(x_1 - i_L + self.Kff_idc*i_dc + self.Kff_iload*i_load) - v_dc_f_L = v_dc - # DC power balances: - # v_s*iL = (1-d)iL*v_dc - # v_s*iL + Pload = Pvsc self.emt_init = InitialConditionsEMT( vmag_bus=vmag_bus, @@ -430,7 +422,7 @@ def _calculate_emt_initial_conditions(self): v_ref=v_ref, angle_ref=angle_ref, v_vsc_d=v_vsc_dq.real, - v_vsc_q = v_vsc_dq.imag, # added + v_vsc_q=v_vsc_dq.imag, # added i_vsc_d=i_vsc_dq.real, i_vsc_q=i_vsc_dq.imag, i_bus_d=i_bus_dq.real, @@ -450,7 +442,6 @@ def _calculate_emt_initial_conditions(self): x_1 = x_1, x_2 = x_2, i_load = i_load, - v_dc_f_L = v_dc_f_L, p_vsc = p_vsc ) @@ -475,12 +466,13 @@ def define_variables_emt(self): v_vsc_d = self.emt_init.v_vsc_d - v_dc, i_dc, i_L, x1, x2, i_load, v_dc_f_L = self.emt_init.v_dc, self.emt_init.i_dc, self.emt_init.i_L, self.emt_init.x_1, self.emt_init.x_2, self.emt_init.i_load, self.emt_init.v_dc_f_L + # DC side + v_dc, i_dc, i_L, x1, x2, i_load = self.emt_init.v_dc, self.emt_init.i_dc, self.emt_init.i_L, self.emt_init.x_1, self.emt_init.x_2, self.emt_init.i_load x = DynamicalVariables( - name = ['angle_pc', 'w_pc', 'p_pc', 'q_pc', 'gamma',"i_vsc_a", "i_vsc_b","i_vsc_c", "v_sh_a", "v_sh_b","v_sh_c", "i_bus_a", "i_bus_b", "i_bus_c", 'i_l_f', 'v_dc_f', 'i_dc_f', 'i_load_f','x_1', 'x_2', 'i_L', 'v_dc', 'v_dc_f_L'], + name = ['angle_pc', 'w_pc', 'p_pc', 'q_pc', 'gamma',"i_vsc_a", "i_vsc_b","i_vsc_c", "v_sh_a", "v_sh_b","v_sh_c", "i_bus_a", "i_bus_b", "i_bus_c", 'i_l_f', 'v_dc_f', 'i_dc_f', 'i_load_f','x_1', 'x_2', 'i_L', 'v_dc', 'i_load'], component = f"{self.type_}_{self.id}", - init=[angle_ref*np.pi/180, 1.0, p_ref, q_ref, v_vsc_d, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_L, v_dc, i_dc, i_load, x1, x2, i_L, v_dc, v_dc_f_L] + init=[angle_ref*np.pi/180, 1.0, p_ref, q_ref, v_vsc_d, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_L, v_dc, i_dc, i_load, x1, x2, i_L, v_dc, i_load] ) # Inputs @@ -491,10 +483,10 @@ def define_variables_emt(self): v_bus_a, v_bus_b, v_bus_c = dq02abc(v_bus_D, v_bus_Q, 0, 0) u = DynamicalVariables( - name=["p_ref", "q_ref", "v_ref", "v_dc_ref", "v_s", 'Pload', "v_bus_a", "v_bus_b", "v_bus_c"], + name=["p_ref", "q_ref", "v_ref", "v_dc_ref", "v_s", 'i_load_ref', "v_bus_a", "v_bus_b", "v_bus_c"], component=f"{self.type_}_{self.id}", type=["device", "device", "device", "device", "device", "device", "grid", "grid", "grid"], - init=[p_ref, q_ref, v_ref, self.v_dc_ref, self.v_s, self.Pload, v_bus_a, v_bus_b, v_bus_c] + init=[p_ref, q_ref, v_ref, self.v_dc_ref, self.v_s, self.i_load_ref, v_bus_a, v_bus_b, v_bus_c] ) # Outputs @@ -512,37 +504,27 @@ def define_variables_emt(self): def get_derivative_state_emt(self): # Get state values - angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, v_dc_f_L = self.variables_emt.x.value + angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, i_load = self.variables_emt.x.value # Get input values (external inputs) - p_ref, q_ref, v_ref, v_dc_ref, v_s, Pload, v_bus_a, v_bus_b, v_bus_c = self.variables_emt.u.value + p_ref, q_ref, v_ref, v_dc_ref, v_s, i_load_ref, v_bus_a, v_bus_b, v_bus_c = self.variables_emt.u.value - # convert relevant quantities to dq + # convert relevant quantities to dq (ibr frame) v_sh_d, v_sh_q, _ = abc2dq0(v_sh_a, v_sh_b, v_sh_c, angle_pc) # for power controller i_bus_d, i_bus_q, _ = abc2dq0(i_bus_a, i_bus_b, i_bus_c, angle_pc) # for power controller - - # Calculate DC-side current using current vsc voltage and current - # need to calculate v_vsc_dq, because it is an algebraic state so is not available in our state vector i_vsc_d, i_vsc_q, _ = abc2dq0(i_vsc_a, i_vsc_b, i_vsc_c, angle_pc) - i_vsc_dq = i_vsc_d + 1j*i_vsc_q - v_sh_dq = v_sh_d + 1j*v_sh_q - v_vsc_dq = v_sh_dq + (self.rf1_pu + self.xf1_pu * 1j) * i_vsc_dq - # Do Q-V droop - v_sh_mag = (v_sh_d**2+v_sh_q**2)**0.5 # current voltage mag v_sh_mag_ref = v_ref - self.droop_q_pu*(q_pc - q_ref) # droop on error from ref # NB updating algebraic states! - v_vsc_d = gamma + self.kp_vc_pu*(v_sh_mag_ref - v_sh_mag) # update + v_vsc_d = gamma + self.kp_vc_pu*(v_sh_mag_ref - (v_sh_d**2 + v_sh_q**2)**0.5) # update v_vsc_q = 0.0 # update # convert to abc to feed into filter dynamics v_vsc_a, v_vsc_b, v_vsc_c = dq02abc(v_vsc_d, v_vsc_q, 0, angle_pc) # correct to use this angle? - # Load control - updating algebraic states! - i_load = Pload/v_dc_f_L - + # power balance i_dc = (v_vsc_d*i_vsc_d + v_vsc_q*i_vsc_q)/v_dc @@ -614,24 +596,24 @@ def lcl_filter_dynamics(y, internal_inputs): wb = self.wbase r1 = rf1 r2 = rf2 - l1 = xf1/wb #todo check - l2 = xf2/wb + x1 = xf1 + x2 = xf2 # Inputs v_vsc_a, v_vsc_b, v_vsc_c, v_bus_a, v_bus_b, v_bus_c = internal_inputs # Define ODEs that describe the dynamics of the LCL filter - di_vsc_a = wb/l1 *(v_vsc_a - v_sh_a - r1 * i_vsc_a) - di_vsc_b = wb/l1 *(v_vsc_b - v_sh_b - r1 * i_vsc_b) - di_vsc_c = wb/l1 *(v_vsc_c - v_sh_c - r1 * i_vsc_c) + di_vsc_a = wb/x1 *(v_vsc_a - v_sh_a - r1 * i_vsc_a) + di_vsc_b = wb/x1 *(v_vsc_b - v_sh_b - r1 * i_vsc_b) + di_vsc_c = wb/x1 *(v_vsc_c - v_sh_c - r1 * i_vsc_c) dv_sh_a = wb/csh * (-v_sh_a/rsh + i_vsc_a - i_bus_a) dv_sh_b = wb/csh * (-v_sh_b/rsh + i_vsc_b - i_bus_b) dv_sh_c = wb/csh * (-v_sh_c/rsh + i_vsc_c - i_bus_c) - di_bus_a = wb/l2 *(v_sh_a - v_bus_a - r2 * i_bus_a) - di_bus_b = wb/l2 *(v_sh_b - v_bus_b - r2 * i_bus_b) - di_bus_c = wb/l2 *(v_sh_c - v_bus_c - r2 * i_bus_c) + di_bus_a = wb/x2 *(v_sh_a - v_bus_a - r2 * i_bus_a) + di_bus_b = wb/x2 *(v_sh_b - v_bus_b - r2 * i_bus_b) + di_bus_c = wb/x2 *(v_sh_c - v_bus_c - r2 * i_bus_c) return [di_vsc_a, di_vsc_b, di_vsc_c, dv_sh_a, dv_sh_b, dv_sh_c, di_bus_a, di_bus_b, di_bus_c] @@ -641,13 +623,13 @@ def dc_side(y, internal_inputs): DC-DC controller + circuit + load control """ # Define states - i_Lf, v_dcf, i_dcf, i_loadf, x_1, x_2, i_L, v_dc, v_dc_f_L = y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8] + i_Lf, v_dcf, i_dcf, i_loadf, x_1, x_2, i_L, v_dc, i_load = y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7], y[8] # Inputs - i_dc, i_load, v_dc_ref, v_s = internal_inputs + i_dc, i_load_ref, v_dc_ref, v_s = internal_inputs # Parameters - l_dc, c_dc, TiL, Tvdc, Tidc, Kp_vdc, Ki_vdc, Kp_iL, Ki_iL, Kff_idc, Kff_iload, Ti_load, Tvdc_load = self.l_dc, self.c_dc, self.Ti_L, self.Tv_dc, self.Ti_dc, self.kp_v_dc, self.ki_v_dc, self.kp_i_L, self.ki_i_L, self.Kff_idc, self.Kff_iload, self.Ti_load, self.Tvdc_load + l_dc, c_dc, TiL, Tvdc, Tidc, Kp_vdc, Ki_vdc, Kp_iL, Ki_iL, Kff_idc, Kff_iload, Ti_load, Tload = self.l_dc, self.c_dc, self.Ti_L, self.Tv_dc, self.Ti_dc, self.kp_v_dc, self.ki_v_dc, self.kp_i_L, self.ki_i_L, self.Kff_idc, self.Kff_iload, self.Ti_load, self.Tload wb = self.wbase # ODEs @@ -666,15 +648,16 @@ def dc_side(y, internal_inputs): d_i_L = (wb/l_dc)*(v_s - (1-duty_cycle)*v_dc) # Load control - d_v_dc_f_L = (1/Tvdc_load)*(v_dc - v_dc_f_L) + d_i_load = (1/Tload)*(i_load_ref - i_load) - return [d_i_Lf, d_v_dcf, d_i_dcf, d_i_load_f, d_x_1, d_x_2, d_i_L, d_v_dc, d_v_dc_f_L] + return [d_i_Lf, d_v_dcf, d_i_dcf, d_i_load_f, d_x_1, d_x_2, d_i_L, d_v_dc, d_i_load] + #return [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] dy_pc = power_controller_dynamics([angle_pc, w_pc, p_pc, q_pc], [v_sh_d, v_sh_q, i_bus_d, i_bus_q, p_ref]) dy_vc = voltage_controller_dynamics([gamma], [v_sh_mag_ref, v_sh_d, v_sh_q]) dy_lcl = lcl_filter_dynamics([i_vsc_a , i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c], [v_vsc_a, v_vsc_b, v_vsc_c, v_bus_a, v_bus_b, v_bus_c]) - dy_dc_side = dc_side([i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, v_dc_f_L], [i_dc, i_load, v_dc_ref, v_s]) + dy_dc_side = dc_side([i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, i_load], [i_dc, i_load_ref, v_dc_ref, v_s]) return np.hstack([dy_pc, dy_vc, dy_lcl, dy_dc_side]) @@ -682,24 +665,28 @@ def dc_side(y, internal_inputs): def get_output_emt(self): # Output is i_bus_abc - angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, v_dc_f_L = self.variables_emt.x.value + angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, i_load = self.variables_emt.x.value return [i_bus_a, i_bus_b, i_bus_c] def plot_results_emt(self, output_dir): - angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, v_dc_f_L = self.variables_emt.x.value + angle_pc, w_pc, p_pc, q_pc, gamma, i_vsc_a, i_vsc_b, i_vsc_c, v_sh_a, v_sh_b, v_sh_c, i_bus_a, i_bus_b, i_bus_c, i_Lf, v_dcf, i_dcf, i_loadf, x1, x2, i_L, v_dc, i_load = self.variables_emt.x.value tps = self.variables_emt.x.time - p_ref, q_ref, v_ref, v_dc_ref, v_s, Pload, v_bus_a, v_bus_b, v_bus_c, = self.variables_emt.u.value # Transform abc to dq0 i_vsc_d, i_vsc_q, _ = zip(*[abc2dq0(a, b, c, ang) for a, b, c, ang in zip(i_vsc_a, i_vsc_b, i_vsc_c, angle_pc)]) v_sh_d, v_sh_q, _ = zip(*[abc2dq0(a, b, c, ang) for a, b, c, ang in zip(v_sh_a, v_sh_b, v_sh_c, angle_pc)]) i_bus_d, i_bus_q, _ = zip(*[abc2dq0(a, b, c, ang) for a, b, c, ang in zip(i_bus_a, i_bus_b, i_bus_c, angle_pc)]) + # calculate v_vsc + v_sh_dq = v_sh_d + np.multiply(v_sh_q, 1j) + i_vsc_dq = i_vsc_d + np.multiply(i_vsc_q, 1j) + v_vsc_dq = v_sh_dq + np.multiply((self.rf1_pu + self.xf1_pu * 1j), i_vsc_dq) + fig = make_subplots( - rows=7, cols=2, + rows=12, cols=2, horizontal_spacing=0.15, vertical_spacing=0.05, ) @@ -728,6 +715,13 @@ def plot_results_emt(self, output_dir): row=3, col=1) fig.update_xaxes(title_text='Time [s]', row=3, col=1) fig.update_yaxes(title_text='Gamma [p.u.]', row=3, col=1) + + fig.add_trace(go.Scatter(x=tps, y=i_loadf, mode='lines', line=dict(color='red', dash='solid')), + row=3, col=2) + fig.update_xaxes(title_text='Time [s]', row=3, col=2) + fig.update_yaxes(title_text='iload_f [p.u.]', row=3, col=2) + + fig.add_trace(go.Scatter(x=tps, y=i_vsc_d, mode='lines', line=dict(color='red', dash='solid')), row=4, col=1) @@ -768,6 +762,66 @@ def plot_results_emt(self, output_dir): row=7, col=2) fig.update_xaxes(title_text='Time [s]', row=7, col=2) fig.update_yaxes(title_text='i_L [p.u.]', row=7, col=2) + + + fig.add_trace(go.Scatter(x=tps, y=v_dcf, mode='lines', line=dict(color='red', dash='solid')), + row=8, col=1) + fig.update_xaxes(title_text='Time [s]', row=8, col=1) + fig.update_yaxes(title_text='v_dcf [p.u.]', row=8, col=1) + + fig.add_trace(go.Scatter(x=tps, y=i_Lf, mode='lines', line=dict(color='red', dash='solid')), + row=8, col=2) + fig.update_xaxes(title_text='Time [s]', row=8, col=2) + fig.update_yaxes(title_text='i_Lf [p.u.]', row=8, col=2) + + + fig.add_trace(go.Scatter(x=tps, y=i_dcf, mode='lines', line=dict(color='red', dash='solid')), + row=9, col=1) + fig.update_xaxes(title_text='Time [s]', row=9, col=1) + fig.update_yaxes(title_text='i_dcf [p.u.]', row=9, col=1) + + fig.add_trace(go.Scatter(x=tps, y=x1, mode='lines', line=dict(color='red', dash='solid')), + row=9, col=2) + fig.update_xaxes(title_text='Time [s]', row=9, col=2) + fig.update_yaxes(title_text='x1 [p.u.]', row=9, col=2) + + fig.add_trace(go.Scatter(x=tps, y=x2, mode='lines', line=dict(color='red', dash='solid')), + row=10, col=1) + fig.update_xaxes(title_text='Time [s]', row=10, col=1) + fig.update_yaxes(title_text='x2 [p.u.]', row=10, col=1) + + fig.add_trace(go.Scatter(x=tps, y=i_load, mode='lines', line=dict(color='red', dash='solid')), + row=10, col=2) + fig.update_xaxes(title_text='Time [s]', row=10, col=2) + fig.update_yaxes(title_text='i_load [p.u.]', row=10, col=2) + + # power comparisons (calculated) + p_vsc = (v_vsc_dq*np.conjugate(i_vsc_dq)).real + p_load = i_load*v_dc + p_ref, q_ref, v_ref, v_dc_ref, v_s, i_load_ref, v_bus_a, v_bus_b, v_bus_c = self.variables_emt.u.value + p_bat = i_L*v_s + fig.add_trace(go.Scatter(x=tps, y=p_vsc, name="p_vsc", mode='lines', line=dict(color='red', dash='solid')), + row=11, col=1) + fig.add_trace(go.Scatter(x=tps, y=p_load, name="p_load", mode='lines', line=dict(color='blue', dash='solid')), + row=11, col=1) + fig.add_trace(go.Scatter(x=tps, y=p_bat, name="p_bat", mode='lines', line=dict(color='green', dash='solid')), + row=11, col=1) + + + fig.update_xaxes(title_text='Time [s]', row=11, col=1) + fig.update_yaxes(title_text='p [p.u.]', row=11, col=1) + + # v_vsc (calculated) + fig.add_trace(go.Scatter(x=tps, y=v_vsc_dq.real, mode='lines', line=dict(color='red', dash='solid')), + row=12, col=1) + fig.update_xaxes(title_text='Time [s]', row=12, col=1) + fig.update_yaxes(title_text='v_vsc_d [p.u.]', row=12, col=1) + + fig.add_trace(go.Scatter(x=tps, y=v_vsc_dq.imag, mode='lines', line=dict(color='red', dash='solid')), + row=12, col=2) + fig.update_xaxes(title_text='Time [s]', row=12, col=2) + fig.update_yaxes(title_text='v_vsc_q [p.u.]', row=12, col=2) + name = f"{self.type_}_{self.id}" fig.update_layout( title_text = name,