From f2dfcdd596d425b9837bb9d4e20a1adb4f2ab151 Mon Sep 17 00:00:00 2001 From: marenat <102612479+marenat@users.noreply.github.com> Date: Tue, 4 Oct 2022 16:37:56 -0600 Subject: [PATCH 01/12] test incomplete (#265) * test incomplete * progress on tests * test edits and placeholder csv file * updated dynamic_test_data Co-authored-by: Jose Daniel Lara Co-authored-by: m-bossart --- .../generator_components/init_machine.jl | 106 + src/models/generator_models/machine_models.jl | 90 + test/Project.toml | 1 + test/benchmarks/psat/Test45/Test45_delta.csv | 4002 +++++++++++++++++ test/data_tests/ThreeBusPSCAD.raw | 33 + test/data_tests/dynamic_test_data.jl | 15 + test/data_tests/test45.jl | 69 + test/results/results_initial_conditions.jl | 41 + test/runtests.jl | 2 + test/test_case45_sauerpai.jl | 151 + 10 files changed, 4510 insertions(+) create mode 100644 test/benchmarks/psat/Test45/Test45_delta.csv create mode 100644 test/data_tests/ThreeBusPSCAD.raw create mode 100644 test/data_tests/test45.jl create mode 100644 test/test_case45_sauerpai.jl diff --git a/src/initialization/generator_components/init_machine.jl b/src/initialization/generator_components/init_machine.jl index d09bcd641..3ebffed14 100644 --- a/src/initialization/generator_components/init_machine.jl +++ b/src/initialization/generator_components/init_machine.jl @@ -149,6 +149,112 @@ function initialize_mach_shaft!( return end +""" +Initialitation of model of 6-state (SauerPai) synchronous machine in Julia. +Refer to Power System Modelling and Scripting by F. Milano for the equations +""" +function initialize_mach_shaft!( + device_states, + static::PSY.StaticInjection, + dynamic_device::DynamicWrapper{PSY.DynamicGenerator{PSY.SauerPaiMachine, S, A, TG, P}}, + inner_vars::AbstractVector, +) where {S <: PSY.Shaft, A <: PSY.AVR, TG <: PSY.TurbineGov, P <: PSY.PSS} + #PowerFlow Data + + P0 = PSY.get_active_power(static) + Q0 = PSY.get_reactive_power(static) + Vm = PSY.get_magnitude(PSY.get_bus(static)) + θ = PSY.get_angle(PSY.get_bus(static)) + S0 = P0 + Q0 * 1im + V_R = Vm * cos(θ) + V_I = Vm * sin(θ) + V = V_R + V_I * 1im + I = conj(S0 / V) + + #Machine Data + machine = PSY.get_machine(dynamic_device) + R = PSY.get_R(machine) + Xd = PSY.get_Xd(machine) + Xq = PSY.get_Xq(machine) + Xd_p = PSY.get_Xd_p(machine) + Xq_p = PSY.get_Xq_p(machine) + Xd_pp = PSY.get_Xd_pp(machine) + Xq_pp = PSY.get_Xq_pp(machine) + Xl = PSY.get_Xl(machine) + Td0_p = PSY.get_Td0_p(machine) + γ_d1 = PSY.get_γ_d1(machine) + γ_q1 = PSY.get_γ_q1(machine) + γ_d2 = PSY.get_γ_d2(machine) + γ_q2 = PSY.get_γ_q2(machine) + + #States of SauerPaiMachine are [1] ψq, [2] ψd, [3] eq_p, [4] ed_p, [5] ψd_pp and [6] ψq_pp + δ0 = angle(V + (R + Xq * 1im) * I) + ω0 = 1.0 + τm0 = real(V * conj(I)) + @assert isapprox(τm0, P0; atol = STRICT_NLSOLVE_F_TOLERANCE) + #To solve: δ, τm, Vf0, eq_p, ed_p + function f!(out, x) + δ = x[1] + τm = x[2] + Vf0 = x[3] + ψq = x[4] + ψd = x[5] + eq_p = x[6] + ed_p = x[7] + ψd_pp = x[8] + ψq_pp = x[9] + + V_dq = ri_dq(δ) * [V_R; V_I] + i_d = (1.0 / Xd_pp) * (γ_d1 * eq_p - ψd + (1 - γ_d1) * ψd_pp) #15.15 + i_q = (1.0 / Xq_pp) * (-γ_q1 * ed_p - ψq + (1 - γ_q1) * ψq_pp) #15.15 + τ_e = ψd * i_q - ψq * i_d #15.6 + out[1] = τm - τ_e #Mechanical Torque + out[2] = P0 - (V_dq[1] * i_d + V_dq[2] * i_q) #Output Power + out[3] = Q0 - (V_dq[2] * i_d - V_dq[1] * i_q) #Output Reactive Power + out[4] = R * i_q - ω0 * ψd + V_dq[2] #15.9 ψq + out[5] = R * i_d + ω0 * ψq + V_dq[1] #15.9 ψd + out[6] = -eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 -γ_d1) * i_d + γ_d2 * eq_p) + Vf0 #15.13 + out[7] = -ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 -γ_q1) * i_q - γ_d2 * ed_p) #15.13 + out[8] = -ψd_pp + eq_p - (Xd_p - Xl) * i_d #15.13 + out[9] = -ψq_pp - ed_p - (Xq_p - Xl) * i_q #15.13 + end + + V_dq0 = ri_dq(δ0) * [V_R; V_I] + x0 = [δ0, τm0, 1.0, V_dq0[1], V_dq0[2], V_dq0[2], V_dq0[1], V_dq0[2], V_dq0[1]] + sol = NLsolve.nlsolve(f!, x0, ftol = STRICT_NLSOLVE_F_TOLERANCE) + if !NLsolve.converged(sol) + @warn("Initialization in Machine $(PSY.get_name(static)) failed") + else + sol_x0 = sol.zero + #Update terminal voltages + inner_vars[VR_gen_var] = V_R + inner_vars[VI_gen_var] = V_I + #Update δ and ω of Shaft. Works for every Shaft. + shaft_ix = get_local_state_ix(dynamic_device, S) + shaft_states = @view device_states[shaft_ix] + shaft_states[1] = sol_x0[1] #δ + shaft_states[2] = ω0 #ω + #Update Mechanical and Electrical Torque on Generator + inner_vars[τe_var] = sol_x0[2] + inner_vars[τm_var] = sol_x0[2] + #Update Vf for AVR in OneDOneQ Machine. + inner_vars[Vf_var] = sol_x0[3] + #Update states for Machine + machine_ix = get_local_state_ix(dynamic_device, PSY.SauerPaiMachine) + machine_states = @view device_states[machine_ix] + machine_states[1] = sol_x0[4] #ψq + machine_states[2] = sol_x0[5] #ψd + machine_states[3] = sol_x0[6] #eq_p + machine_states[4] = sol_x0[7] #ed_p + machine_states[5] = sol_x0[8] #eq_pp + machine_states[6] = sol_x0[9] #ed_pp + #Update fluxes inner vars + inner_vars[ψq_var] = sol_x0[4] + inner_vars[ψd_var] = sol_x0[5] + end + return +end + """ Initialitation of model of 6-state (Marconato) synchronous machine in Julia. Refer to Power System Modelling and Scripting by F. Milano for the equations diff --git a/src/models/generator_models/machine_models.jl b/src/models/generator_models/machine_models.jl index 4c574b484..775052b6e 100644 --- a/src/models/generator_models/machine_models.jl +++ b/src/models/generator_models/machine_models.jl @@ -122,6 +122,96 @@ function mdl_machine_ode!( return end +""" +Model of 6-state (SauerPaiMachine) synchronous machine in Julia. +Refer to Power System Modelling and Scripting by F. Milano for the equations +""" +function mdl_machine_ode!( + device_states::AbstractArray{<:ACCEPTED_REAL_TYPES}, + output_ode::AbstractArray{<:ACCEPTED_REAL_TYPES}, + inner_vars::AbstractArray{<:ACCEPTED_REAL_TYPES}, + current_r::AbstractArray{<:ACCEPTED_REAL_TYPES}, + current_i::AbstractArray{<:ACCEPTED_REAL_TYPES}, + dynamic_device::DynamicWrapper{PSY.DynamicGenerator{PSY.SauerPaiMachine, S, A, TG, P}}, +) where {S <: PSY.Shaft, A <: PSY.AVR, TG <: PSY.TurbineGov, P <: PSY.PSS} + Sbase = get_system_base_power(dynamic_device) + f0 = get_system_base_frequency(dynamic_device) + + #Obtain indices for component w/r to device + local_ix = get_local_state_ix(dynamic_device, PSY.SauerPaiMachine) + + #Define internal states for component + internal_states = @view device_states[local_ix] + ψq = internal_states[1] + ψd = internal_states[2] + eq_p = internal_states[3] + ed_p = internal_states[4] + ψd_pp = internal_states[5] + ψq_pp = internal_states[6] + + #Obtain external states inputs for component + external_ix = get_input_port_ix(dynamic_device, PSY.SauerPaiMachine) + δ = device_states[external_ix[1]] + ω = device_states[external_ix[2]] + + #Obtain inner variables for component + V_tR = inner_vars[VR_gen_var] + V_tI = inner_vars[VI_gen_var] + Vf = inner_vars[Vf_var] + + #Get parameters + machine = PSY.get_machine(dynamic_device) + R = PSY.get_R(machine) + Xd = PSY.get_Xd(machine) + Xq = PSY.get_Xq(machine) + Xd_p = PSY.get_Xd_p(machine) + Xq_p = PSY.get_Xq_p(machine) + Xd_pp = PSY.get_Xd_pp(machine) + Xq_pp = PSY.get_Xq_pp(machine) + Xl = PSY.get_Xl(machine) + Td0_p = PSY.get_Td0_p(machine) + Tq0_p = PSY.get_Tq0_p(machine) + Td0_pp = PSY.get_Td0_pp(machine) + Tq0_pp = PSY.get_Tq0_pp(machine) + γ_d1 = PSY.get_γ_d1(machine) + γ_q1 = PSY.get_γ_q1(machine) + γ_d2 = PSY.get_γ_d2(machine) + γ_q2 = PSY.get_γ_q2(machine) + basepower = PSY.get_base_power(dynamic_device) +`` + #RI to dq transformation + V_dq = ri_dq(δ) * [V_tR; V_tI] + + #Obtain electric variables + i_d = (1.0 / Xd_pp) * (γ_d1 * eq_p - ψd + (1 - γ_d1) * ψd_pp) #15.15 + i_q = (1.0 / Xq_pp) * (-γ_q1 * ed_p - ψq + (1 - γ_q1) * ψq_pp) #15.15 + τ_e = ψd * i_q - ψq * i_d #15.6 + + #Compute ODEs + output_ode[local_ix[1]] = 2 * π * f0 * (R * i_q - ω * ψd + V_dq[2]) #15.9 ψq + output_ode[local_ix[2]] = 2 * π * f0 * (R * i_d + ω * ψq + V_dq[1]) #15.9 ψd + output_ode[local_ix[3]] = + (1.0 / Td0_p) * (-eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 -γ_d1) * i_d + γ_d2 * eq_p) + Vf) #15.13 eq_p + output_ode[local_ix[4]] = + (1.0 / Tq0_p) * (-ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 -γ_q1) * i_q - γ_d2 * ed_p)) #15.13 ed_p + output_ode[local_ix[5]] = + (1.0 / Td0_pp) * (-ψd_pp + eq_p - (Xd_p - Xl) * i_d) #15.13 ψd_pp + output_ode[local_ix[6]] = + (1.0 / Tq0_pp) * (-ψq_pp - ed_p - (Xq_p - Xl) * i_q) #15.13 ψq_pp + + #Update inner_vars + inner_vars[τe_var] = τ_e + + #Compute current from the generator to the grid + I_RI = (basepower / Sbase) * dq_ri(δ) * [i_d; i_q] + + #Update current + current_r[1] += I_RI[1] + current_i[1] += I_RI[2] + + return +end + """ Model of 6-state (MarconatoMachine) synchronous machine in Julia. Refer to Power System Modelling and Scripting by F. Milano for the equations diff --git a/test/Project.toml b/test/Project.toml index 1bedd44ad..f4b5b8a2d 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -9,6 +9,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PowerFlows = "94fada2c-fd9a-4e89-8d82-81405f5cb4f6" PowerSimulationsDynamics = "398b2ede-47ed-4edc-b52e-69e4a48b4336" PowerSystems = "bcd98974-b02a-5e2f-9ee0-a103f5c450dd" diff --git a/test/benchmarks/psat/Test45/Test45_delta.csv b/test/benchmarks/psat/Test45/Test45_delta.csv new file mode 100644 index 000000000..a99541072 --- /dev/null +++ b/test/benchmarks/psat/Test45/Test45_delta.csv @@ -0,0 +1,4002 @@ +0,0.52028 +0.005,0.52028 +0.01,0.52028 +0.015,0.52028 +0.02,0.52028 +0.025,0.52028 +0.03,0.52028 +0.035,0.52028 +0.04,0.52028 +0.045,0.52028 +0.05,0.52028 +0.055,0.52028 +0.06,0.52028 +0.065,0.52028 +0.07,0.52028 +0.075,0.52028 +0.08,0.52028 +0.085,0.52028 +0.09,0.52028 +0.095,0.52028 +0.1,0.52028 +0.105,0.52028 +0.11,0.52028 +0.115,0.52028 +0.12,0.52028 +0.125,0.52028 +0.13,0.52028 +0.135,0.52028 +0.14,0.52028 +0.145,0.52028 +0.15,0.52028 +0.155,0.52028 +0.16,0.52028 +0.165,0.52028 +0.17,0.52028 +0.175,0.52028 +0.18,0.52028 +0.185,0.52028 +0.19,0.52028 +0.195,0.52028 +0.2,0.52028 +0.205,0.52028 +0.21,0.52028 +0.215,0.52028 +0.22,0.52028 +0.225,0.52028 +0.23,0.52028 +0.235,0.52028 +0.24,0.52028 +0.245,0.52028 +0.25,0.52028 +0.255,0.52028 +0.26,0.52028 +0.265,0.52028 +0.27,0.52028 +0.275,0.52028 +0.28,0.52028 +0.285,0.52028 +0.29,0.52028 +0.295,0.52028 +0.3,0.52028 +0.305,0.52028 +0.31,0.52028 +0.315,0.52028 +0.32,0.52028 +0.325,0.52028 +0.33,0.52028 +0.335,0.52028 +0.34,0.52028 +0.345,0.52028 +0.35,0.52028 +0.355,0.52028 +0.36,0.52028 +0.365,0.52028 +0.37,0.52028 +0.375,0.52028 +0.38,0.52028 +0.385,0.52028 +0.39,0.52028 +0.395,0.52028 +0.4,0.52028 +0.405,0.52028 +0.41,0.52028 +0.415,0.52028 +0.42,0.52028 +0.425,0.52028 +0.43,0.52028 +0.435,0.52028 +0.44,0.52028 +0.445,0.52028 +0.45,0.52028 +0.455,0.52028 +0.46,0.52028 +0.465,0.52028 +0.47,0.52028 +0.475,0.52028 +0.48,0.52028 +0.485,0.52028 +0.49,0.52028 +0.495,0.52028 +0.5,0.52028 +0.505,0.52028 +0.51,0.52028 +0.515,0.52028 +0.52,0.52028 +0.525,0.52028 +0.53,0.52028 +0.535,0.52028 +0.54,0.52028 +0.545,0.52028 +0.55,0.52028 +0.555,0.52028 +0.56,0.52028 +0.565,0.52028 +0.57,0.52028 +0.575,0.52028 +0.58,0.52028 +0.585,0.52028 +0.59,0.52028 +0.595,0.52028 +0.6,0.52028 +0.605,0.52028 +0.61,0.52028 +0.615,0.52028 +0.62,0.52028 +0.625,0.52028 +0.63,0.52028 +0.635,0.52028 +0.64,0.52028 +0.645,0.52028 +0.65,0.52028 +0.655,0.52028 +0.66,0.52028 +0.665,0.52028 +0.67,0.52028 +0.675,0.52028 +0.68,0.52028 +0.685,0.52028 +0.69,0.52028 +0.695,0.52028 +0.7,0.52028 +0.705,0.52028 +0.71,0.52028 +0.715,0.52028 +0.72,0.52028 +0.725,0.52028 +0.73,0.52028 +0.735,0.52028 +0.74,0.52028 +0.745,0.52028 +0.75,0.52028 +0.755,0.52028 +0.76,0.52028 +0.765,0.52028 +0.77,0.52028 +0.775,0.52028 +0.78,0.52028 +0.785,0.52028 +0.79,0.52028 +0.795,0.52028 +0.8,0.52028 +0.805,0.52028 +0.81,0.52028 +0.815,0.52028 +0.82,0.52028 +0.825,0.52028 +0.83,0.52028 +0.835,0.52028 +0.84,0.52028 +0.845,0.52028 +0.85,0.52028 +0.855,0.52028 +0.86,0.52028 +0.865,0.52028 +0.87,0.52028 +0.875,0.52028 +0.88,0.52028 +0.885,0.52028 +0.89,0.52028 +0.895,0.52028 +0.9,0.52028 +0.905,0.52028 +0.91,0.52028 +0.915,0.52028 +0.92,0.52028 +0.925,0.52028 +0.93,0.52028 +0.935,0.52028 +0.94,0.52028 +0.945,0.52028 +0.95,0.52028 +0.955,0.52028 +0.96,0.52028 +0.965,0.52028 +0.97,0.52028 +0.975,0.52028 +0.98,0.52028 +0.985,0.52028 +0.99,0.52028 +0.995,0.52028 +1,0.52028 +1,0.52028 +1.005,0.5203 +1.01,0.52035 +1.015,0.52045 +1.02,0.52058 +1.025,0.52075 +1.03,0.52097 +1.035,0.52121 +1.04,0.52149 +1.045,0.52182 +1.05,0.52217 +1.055,0.52256 +1.06,0.52299 +1.065,0.52345 +1.07,0.52393 +1.075,0.52445 +1.08,0.525 +1.085,0.52558 +1.09,0.52617 +1.095,0.5268 +1.1,0.52745 +1.105,0.52812 +1.11,0.52881 +1.115,0.52952 +1.12,0.53024 +1.125,0.53098 +1.13,0.53173 +1.135,0.53249 +1.14,0.53326 +1.145,0.53403 +1.15,0.53481 +1.155,0.53559 +1.16,0.53636 +1.165,0.53714 +1.17,0.53791 +1.175,0.53867 +1.18,0.53942 +1.185,0.54016 +1.19,0.54088 +1.195,0.54159 +1.2,0.54227 +1.205,0.54294 +1.21,0.54358 +1.215,0.5442 +1.22,0.54479 +1.225,0.54535 +1.23,0.54588 +1.235,0.54637 +1.24,0.54684 +1.245,0.54726 +1.25,0.54765 +1.255,0.54799 +1.26,0.5483 +1.265,0.54856 +1.27,0.54878 +1.275,0.54896 +1.28,0.5491 +1.285,0.54918 +1.29,0.54923 +1.295,0.54923 +1.3,0.54918 +1.305,0.54908 +1.31,0.54894 +1.315,0.54876 +1.32,0.54853 +1.325,0.54826 +1.33,0.54795 +1.335,0.54759 +1.34,0.54719 +1.345,0.54676 +1.35,0.54628 +1.355,0.54577 +1.36,0.54523 +1.365,0.54465 +1.37,0.54405 +1.375,0.54341 +1.38,0.54275 +1.385,0.54206 +1.39,0.54136 +1.395,0.54063 +1.4,0.53989 +1.405,0.53914 +1.41,0.53837 +1.415,0.5376 +1.42,0.53682 +1.425,0.53604 +1.43,0.53525 +1.435,0.53448 +1.44,0.5337 +1.445,0.53294 +1.45,0.53219 +1.455,0.53145 +1.46,0.53073 +1.465,0.53002 +1.47,0.52934 +1.475,0.52868 +1.48,0.52805 +1.485,0.52745 +1.49,0.52688 +1.495,0.52634 +1.5,0.52583 +1.505,0.52536 +1.51,0.52493 +1.515,0.52454 +1.52,0.52418 +1.525,0.52387 +1.53,0.5236 +1.535,0.52338 +1.54,0.52319 +1.545,0.52305 +1.55,0.52296 +1.555,0.52291 +1.56,0.5229 +1.565,0.52294 +1.57,0.52302 +1.575,0.52314 +1.58,0.52331 +1.585,0.52352 +1.59,0.52376 +1.595,0.52405 +1.6,0.52438 +1.605,0.52474 +1.61,0.52514 +1.615,0.52557 +1.62,0.52603 +1.625,0.52652 +1.63,0.52704 +1.635,0.52759 +1.64,0.52815 +1.645,0.52874 +1.65,0.52935 +1.655,0.52998 +1.66,0.53062 +1.665,0.53128 +1.67,0.53194 +1.675,0.53261 +1.68,0.53328 +1.685,0.53396 +1.69,0.53464 +1.695,0.53532 +1.7,0.53599 +1.705,0.53665 +1.71,0.53731 +1.715,0.53795 +1.72,0.53858 +1.725,0.5392 +1.73,0.5398 +1.735,0.54037 +1.74,0.54093 +1.745,0.54146 +1.75,0.54197 +1.755,0.54246 +1.76,0.54291 +1.765,0.54334 +1.77,0.54374 +1.775,0.5441 +1.78,0.54444 +1.785,0.54474 +1.79,0.545 +1.795,0.54524 +1.8,0.54543 +1.805,0.5456 +1.81,0.54572 +1.815,0.54582 +1.82,0.54587 +1.825,0.54589 +1.83,0.54588 +1.835,0.54583 +1.84,0.54575 +1.845,0.54563 +1.85,0.54549 +1.855,0.54531 +1.86,0.54509 +1.865,0.54485 +1.87,0.54458 +1.875,0.54428 +1.88,0.54395 +1.885,0.5436 +1.89,0.54323 +1.895,0.54283 +1.9,0.54241 +1.905,0.54197 +1.91,0.54151 +1.915,0.54103 +1.92,0.54054 +1.925,0.54004 +1.93,0.53953 +1.935,0.539 +1.94,0.53847 +1.945,0.53793 +1.95,0.53739 +1.955,0.53684 +1.96,0.53629 +1.965,0.53574 +1.97,0.5352 +1.975,0.53465 +1.98,0.53412 +1.985,0.53359 +1.99,0.53306 +1.995,0.53255 +2,0.53205 +2.005,0.53156 +2.01,0.53109 +2.015,0.53063 +2.02,0.53019 +2.025,0.52976 +2.03,0.52936 +2.035,0.52897 +2.04,0.52861 +2.045,0.52826 +2.05,0.52794 +2.055,0.52764 +2.06,0.52737 +2.065,0.52712 +2.07,0.5269 +2.075,0.5267 +2.08,0.52653 +2.085,0.52638 +2.09,0.52626 +2.095,0.52616 +2.1,0.52609 +2.105,0.52605 +2.11,0.52604 +2.115,0.52605 +2.12,0.52608 +2.125,0.52614 +2.13,0.52623 +2.135,0.52634 +2.14,0.52647 +2.145,0.52663 +2.15,0.52681 +2.155,0.52701 +2.16,0.52724 +2.165,0.52748 +2.17,0.52774 +2.175,0.52802 +2.18,0.52832 +2.185,0.52863 +2.19,0.52896 +2.195,0.5293 +2.2,0.52965 +2.205,0.53002 +2.21,0.53039 +2.215,0.53077 +2.22,0.53116 +2.225,0.53156 +2.23,0.53196 +2.235,0.53237 +2.24,0.53278 +2.245,0.53318 +2.25,0.53359 +2.255,0.534 +2.26,0.5344 +2.265,0.5348 +2.27,0.53519 +2.275,0.53558 +2.28,0.53595 +2.285,0.53632 +2.29,0.53668 +2.295,0.53702 +2.3,0.53735 +2.305,0.53767 +2.31,0.53797 +2.315,0.53826 +2.32,0.53853 +2.325,0.53878 +2.33,0.53901 +2.335,0.53923 +2.34,0.53942 +2.345,0.53959 +2.35,0.53975 +2.355,0.53988 +2.36,0.53998 +2.365,0.54007 +2.37,0.54013 +2.375,0.54017 +2.38,0.54019 +2.385,0.54018 +2.39,0.54015 +2.395,0.5401 +2.4,0.54002 +2.405,0.53992 +2.41,0.5398 +2.415,0.53966 +2.42,0.53949 +2.425,0.53931 +2.43,0.5391 +2.435,0.53887 +2.44,0.53863 +2.445,0.53836 +2.45,0.53808 +2.455,0.53778 +2.46,0.53747 +2.465,0.53714 +2.47,0.53679 +2.475,0.53643 +2.48,0.53607 +2.485,0.53569 +2.49,0.5353 +2.495,0.5349 +2.5,0.5345 +2.505,0.53409 +2.51,0.53367 +2.515,0.53325 +2.52,0.53283 +2.525,0.53241 +2.53,0.53199 +2.535,0.53157 +2.54,0.53116 +2.545,0.53074 +2.55,0.53034 +2.555,0.52994 +2.56,0.52955 +2.565,0.52916 +2.57,0.52879 +2.575,0.52843 +2.58,0.52808 +2.585,0.52774 +2.59,0.52742 +2.595,0.52711 +2.6,0.52682 +2.605,0.52654 +2.61,0.52629 +2.615,0.52605 +2.62,0.52582 +2.625,0.52562 +2.63,0.52544 +2.635,0.52527 +2.64,0.52513 +2.645,0.52501 +2.65,0.52491 +2.655,0.52483 +2.66,0.52477 +2.665,0.52473 +2.67,0.52471 +2.675,0.52471 +2.68,0.52473 +2.685,0.52477 +2.69,0.52484 +2.695,0.52492 +2.7,0.52502 +2.705,0.52514 +2.71,0.52527 +2.715,0.52542 +2.72,0.52559 +2.725,0.52578 +2.73,0.52597 +2.735,0.52619 +2.74,0.52641 +2.745,0.52665 +2.75,0.52689 +2.755,0.52715 +2.76,0.52742 +2.765,0.52769 +2.77,0.52797 +2.775,0.52826 +2.78,0.52855 +2.785,0.52884 +2.79,0.52913 +2.795,0.52943 +2.8,0.52973 +2.805,0.53002 +2.81,0.53032 +2.815,0.5306 +2.82,0.53089 +2.825,0.53117 +2.83,0.53144 +2.835,0.53171 +2.84,0.53196 +2.845,0.53221 +2.85,0.53245 +2.855,0.53267 +2.86,0.53289 +2.865,0.53309 +2.87,0.53328 +2.875,0.53345 +2.88,0.53361 +2.885,0.53375 +2.89,0.53388 +2.895,0.53399 +2.9,0.53409 +2.905,0.53417 +2.91,0.53423 +2.915,0.53427 +2.92,0.5343 +2.925,0.53431 +2.93,0.5343 +2.935,0.53427 +2.94,0.53422 +2.945,0.53416 +2.95,0.53408 +2.955,0.53399 +2.96,0.53387 +2.965,0.53374 +2.97,0.5336 +2.975,0.53344 +2.98,0.53326 +2.985,0.53307 +2.99,0.53286 +2.995,0.53265 +3,0.53242 +3.005,0.53217 +3.01,0.53192 +3.015,0.53166 +3.02,0.53138 +3.025,0.5311 +3.03,0.53081 +3.035,0.53052 +3.04,0.53022 +3.045,0.52991 +3.05,0.5296 +3.055,0.52928 +3.06,0.52896 +3.065,0.52865 +3.07,0.52833 +3.075,0.52801 +3.08,0.52769 +3.085,0.52737 +3.09,0.52706 +3.095,0.52675 +3.1,0.52645 +3.105,0.52615 +3.11,0.52586 +3.115,0.52558 +3.12,0.5253 +3.125,0.52503 +3.13,0.52477 +3.135,0.52453 +3.14,0.52429 +3.145,0.52406 +3.15,0.52385 +3.155,0.52364 +3.16,0.52345 +3.165,0.52327 +3.17,0.52311 +3.175,0.52296 +3.18,0.52282 +3.185,0.5227 +3.19,0.52259 +3.195,0.5225 +3.2,0.52242 +3.205,0.52236 +3.21,0.52231 +3.215,0.52227 +3.22,0.52225 +3.225,0.52225 +3.23,0.52225 +3.235,0.52227 +3.24,0.52231 +3.245,0.52236 +3.25,0.52242 +3.255,0.52249 +3.26,0.52258 +3.265,0.52267 +3.27,0.52278 +3.275,0.5229 +3.28,0.52303 +3.285,0.52317 +3.29,0.52331 +3.295,0.52347 +3.3,0.52363 +3.305,0.5238 +3.31,0.52397 +3.315,0.52415 +3.32,0.52433 +3.325,0.52452 +3.33,0.52471 +3.335,0.52491 +3.34,0.5251 +3.345,0.52529 +3.35,0.52549 +3.355,0.52568 +3.36,0.52588 +3.365,0.52607 +3.37,0.52626 +3.375,0.52644 +3.38,0.52662 +3.385,0.5268 +3.39,0.52697 +3.395,0.52713 +3.4,0.52729 +3.405,0.52743 +3.41,0.52758 +3.415,0.52771 +3.42,0.52783 +3.425,0.52794 +3.43,0.52805 +3.435,0.52814 +3.44,0.52823 +3.445,0.5283 +3.45,0.52836 +3.455,0.52841 +3.46,0.52845 +3.465,0.52847 +3.47,0.52849 +3.475,0.52849 +3.48,0.52848 +3.485,0.52846 +3.49,0.52842 +3.495,0.52837 +3.5,0.52832 +3.505,0.52825 +3.51,0.52816 +3.515,0.52807 +3.52,0.52797 +3.525,0.52785 +3.53,0.52773 +3.535,0.52759 +3.54,0.52744 +3.545,0.52729 +3.55,0.52712 +3.555,0.52695 +3.56,0.52677 +3.565,0.52658 +3.57,0.52639 +3.575,0.52619 +3.58,0.52598 +3.585,0.52577 +3.59,0.52555 +3.595,0.52533 +3.6,0.52511 +3.605,0.52489 +3.61,0.52466 +3.615,0.52443 +3.62,0.5242 +3.625,0.52397 +3.63,0.52374 +3.635,0.52351 +3.64,0.52328 +3.645,0.52306 +3.65,0.52284 +3.655,0.52262 +3.66,0.52241 +3.665,0.5222 +3.67,0.522 +3.675,0.5218 +3.68,0.52161 +3.685,0.52143 +3.69,0.52125 +3.695,0.52109 +3.7,0.52093 +3.705,0.52078 +3.71,0.52063 +3.715,0.5205 +3.72,0.52038 +3.725,0.52027 +3.73,0.52016 +3.735,0.52007 +3.74,0.51999 +3.745,0.51992 +3.75,0.51985 +3.755,0.5198 +3.76,0.51976 +3.765,0.51973 +3.77,0.51971 +3.775,0.51971 +3.78,0.51971 +3.785,0.51972 +3.79,0.51974 +3.795,0.51977 +3.8,0.51981 +3.805,0.51987 +3.81,0.51992 +3.815,0.51999 +3.82,0.52007 +3.825,0.52015 +3.83,0.52024 +3.835,0.52034 +3.84,0.52045 +3.845,0.52056 +3.85,0.52068 +3.855,0.5208 +3.86,0.52092 +3.865,0.52105 +3.87,0.52119 +3.875,0.52133 +3.88,0.52146 +3.885,0.52161 +3.89,0.52175 +3.895,0.52189 +3.9,0.52203 +3.905,0.52218 +3.91,0.52232 +3.915,0.52246 +3.92,0.5226 +3.925,0.52273 +3.93,0.52287 +3.935,0.523 +3.94,0.52312 +3.945,0.52324 +3.95,0.52336 +3.955,0.52347 +3.96,0.52357 +3.965,0.52367 +3.97,0.52376 +3.975,0.52385 +3.98,0.52393 +3.985,0.524 +3.99,0.52406 +3.995,0.52412 +4,0.52416 +4.005,0.5242 +4.01,0.52423 +4.015,0.52425 +4.02,0.52426 +4.025,0.52427 +4.03,0.52426 +4.035,0.52425 +4.04,0.52423 +4.045,0.5242 +4.05,0.52416 +4.055,0.52411 +4.06,0.52405 +4.065,0.52399 +4.07,0.52392 +4.075,0.52384 +4.08,0.52375 +4.085,0.52365 +4.09,0.52355 +4.095,0.52344 +4.1,0.52333 +4.105,0.52321 +4.11,0.52308 +4.115,0.52295 +4.12,0.52282 +4.125,0.52268 +4.13,0.52253 +4.135,0.52239 +4.14,0.52224 +4.145,0.52208 +4.15,0.52193 +4.155,0.52177 +4.16,0.52161 +4.165,0.52146 +4.17,0.5213 +4.175,0.52114 +4.18,0.52098 +4.185,0.52083 +4.19,0.52067 +4.195,0.52052 +4.2,0.52037 +4.205,0.52022 +4.21,0.52008 +4.215,0.51994 +4.22,0.5198 +4.225,0.51967 +4.23,0.51954 +4.235,0.51942 +4.24,0.51931 +4.245,0.5192 +4.25,0.51909 +4.255,0.519 +4.26,0.51891 +4.265,0.51882 +4.27,0.51875 +4.275,0.51868 +4.28,0.51861 +4.285,0.51856 +4.29,0.51851 +4.295,0.51847 +4.3,0.51844 +4.305,0.51841 +4.31,0.5184 +4.315,0.51839 +4.32,0.51839 +4.325,0.51839 +4.33,0.51841 +4.335,0.51843 +4.34,0.51845 +4.345,0.51849 +4.35,0.51853 +4.355,0.51857 +4.36,0.51863 +4.365,0.51869 +4.37,0.51875 +4.375,0.51882 +4.38,0.5189 +4.385,0.51898 +4.39,0.51907 +4.395,0.51916 +4.4,0.51925 +4.405,0.51935 +4.41,0.51945 +4.415,0.51955 +4.42,0.51966 +4.425,0.51976 +4.43,0.51987 +4.435,0.51998 +4.44,0.52009 +4.445,0.5202 +4.45,0.52031 +4.455,0.52043 +4.46,0.52054 +4.465,0.52064 +4.47,0.52075 +4.475,0.52086 +4.48,0.52096 +4.485,0.52106 +4.49,0.52116 +4.495,0.52126 +4.5,0.52135 +4.505,0.52144 +4.51,0.52152 +4.515,0.5216 +4.52,0.52167 +4.525,0.52174 +4.53,0.52181 +4.535,0.52187 +4.54,0.52192 +4.545,0.52197 +4.55,0.52201 +4.555,0.52205 +4.56,0.52208 +4.565,0.52211 +4.57,0.52213 +4.575,0.52214 +4.58,0.52215 +4.585,0.52215 +4.59,0.52214 +4.595,0.52213 +4.6,0.52211 +4.605,0.52209 +4.61,0.52206 +4.615,0.52203 +4.62,0.52199 +4.625,0.52195 +4.63,0.5219 +4.635,0.52184 +4.64,0.52178 +4.645,0.52172 +4.65,0.52165 +4.655,0.52158 +4.66,0.5215 +4.665,0.52142 +4.67,0.52134 +4.675,0.52125 +4.68,0.52117 +4.685,0.52107 +4.69,0.52098 +4.695,0.52089 +4.7,0.52079 +4.705,0.5207 +4.71,0.5206 +4.715,0.5205 +4.72,0.5204 +4.725,0.52031 +4.73,0.52021 +4.735,0.52012 +4.74,0.52002 +4.745,0.51993 +4.75,0.51984 +4.755,0.51975 +4.76,0.51966 +4.765,0.51958 +4.77,0.5195 +4.775,0.51942 +4.78,0.51935 +4.785,0.51928 +4.79,0.51921 +4.795,0.51915 +4.8,0.51909 +4.805,0.51904 +4.81,0.51899 +4.815,0.51895 +4.82,0.51891 +4.825,0.51888 +4.83,0.51885 +4.835,0.51883 +4.84,0.51881 +4.845,0.5188 +4.85,0.51879 +4.855,0.51879 +4.86,0.5188 +4.865,0.51881 +4.87,0.51882 +4.875,0.51884 +4.88,0.51887 +4.885,0.5189 +4.89,0.51894 +4.895,0.51898 +4.9,0.51902 +4.905,0.51907 +4.91,0.51913 +4.915,0.51919 +4.92,0.51925 +4.925,0.51932 +4.93,0.51939 +4.935,0.51946 +4.94,0.51954 +4.945,0.51962 +4.95,0.5197 +4.955,0.51979 +4.96,0.51988 +4.965,0.51997 +4.97,0.52006 +4.975,0.52015 +4.98,0.52024 +4.985,0.52034 +4.99,0.52043 +4.995,0.52053 +5,0.52062 +5.005,0.52072 +5.01,0.52081 +5.015,0.52091 +5.02,0.521 +5.025,0.52109 +5.03,0.52118 +5.035,0.52127 +5.04,0.52135 +5.045,0.52144 +5.05,0.52152 +5.055,0.5216 +5.06,0.52167 +5.065,0.52174 +5.07,0.52181 +5.075,0.52188 +5.08,0.52194 +5.085,0.522 +5.09,0.52205 +5.095,0.52211 +5.1,0.52215 +5.105,0.52219 +5.11,0.52223 +5.115,0.52227 +5.12,0.5223 +5.125,0.52232 +5.13,0.52234 +5.135,0.52236 +5.14,0.52237 +5.145,0.52238 +5.15,0.52239 +5.155,0.52239 +5.16,0.52238 +5.165,0.52238 +5.17,0.52236 +5.175,0.52235 +5.18,0.52233 +5.185,0.52231 +5.19,0.52228 +5.195,0.52225 +5.2,0.52222 +5.205,0.52219 +5.21,0.52215 +5.215,0.52211 +5.22,0.52207 +5.225,0.52203 +5.23,0.52198 +5.235,0.52194 +5.24,0.52189 +5.245,0.52184 +5.25,0.52179 +5.255,0.52174 +5.26,0.52169 +5.265,0.52164 +5.27,0.52159 +5.275,0.52154 +5.28,0.52149 +5.285,0.52144 +5.29,0.52139 +5.295,0.52135 +5.3,0.5213 +5.305,0.52126 +5.31,0.52121 +5.315,0.52117 +5.32,0.52114 +5.325,0.5211 +5.33,0.52107 +5.335,0.52104 +5.34,0.52101 +5.345,0.52099 +5.35,0.52097 +5.355,0.52095 +5.36,0.52094 +5.365,0.52093 +5.37,0.52092 +5.375,0.52092 +5.38,0.52092 +5.385,0.52092 +5.39,0.52093 +5.395,0.52094 +5.4,0.52095 +5.405,0.52097 +5.41,0.521 +5.415,0.52102 +5.42,0.52105 +5.425,0.52109 +5.43,0.52113 +5.435,0.52117 +5.44,0.52121 +5.445,0.52126 +5.45,0.52131 +5.455,0.52137 +5.46,0.52143 +5.465,0.52149 +5.47,0.52155 +5.475,0.52162 +5.48,0.52169 +5.485,0.52176 +5.49,0.52183 +5.495,0.52191 +5.5,0.52199 +5.505,0.52207 +5.51,0.52215 +5.515,0.52223 +5.52,0.52231 +5.525,0.5224 +5.53,0.52248 +5.535,0.52257 +5.54,0.52265 +5.545,0.52274 +5.55,0.52282 +5.555,0.52291 +5.56,0.52299 +5.565,0.52308 +5.57,0.52316 +5.575,0.52324 +5.58,0.52333 +5.585,0.52341 +5.59,0.52348 +5.595,0.52356 +5.6,0.52364 +5.605,0.52371 +5.61,0.52378 +5.615,0.52385 +5.62,0.52391 +5.625,0.52398 +5.63,0.52404 +5.635,0.5241 +5.64,0.52415 +5.645,0.52421 +5.65,0.52426 +5.655,0.5243 +5.66,0.52435 +5.665,0.52439 +5.67,0.52443 +5.675,0.52446 +5.68,0.5245 +5.685,0.52453 +5.69,0.52455 +5.695,0.52458 +5.7,0.5246 +5.705,0.52462 +5.71,0.52463 +5.715,0.52464 +5.72,0.52465 +5.725,0.52466 +5.73,0.52466 +5.735,0.52467 +5.74,0.52467 +5.745,0.52466 +5.75,0.52466 +5.755,0.52465 +5.76,0.52465 +5.765,0.52464 +5.77,0.52463 +5.775,0.52461 +5.78,0.5246 +5.785,0.52459 +5.79,0.52457 +5.795,0.52455 +5.8,0.52454 +5.805,0.52452 +5.81,0.5245 +5.815,0.52448 +5.82,0.52447 +5.825,0.52445 +5.83,0.52443 +5.835,0.52442 +5.84,0.5244 +5.845,0.52439 +5.85,0.52437 +5.855,0.52436 +5.86,0.52435 +5.865,0.52434 +5.87,0.52433 +5.875,0.52433 +5.88,0.52432 +5.885,0.52432 +5.89,0.52432 +5.895,0.52432 +5.9,0.52432 +5.905,0.52433 +5.91,0.52434 +5.915,0.52435 +5.92,0.52436 +5.925,0.52438 +5.93,0.5244 +5.935,0.52442 +5.94,0.52444 +5.945,0.52447 +5.95,0.5245 +5.955,0.52453 +5.96,0.52456 +5.965,0.5246 +5.97,0.52464 +5.975,0.52468 +5.98,0.52473 +5.985,0.52477 +5.99,0.52482 +5.995,0.52487 +6,0.52493 +6.005,0.52499 +6.01,0.52504 +6.015,0.5251 +6.02,0.52517 +6.025,0.52523 +6.03,0.5253 +6.035,0.52536 +6.04,0.52543 +6.045,0.5255 +6.05,0.52558 +6.055,0.52565 +6.06,0.52572 +6.065,0.5258 +6.07,0.52587 +6.075,0.52595 +6.08,0.52602 +6.085,0.5261 +6.09,0.52618 +6.095,0.52625 +6.1,0.52633 +6.105,0.52641 +6.11,0.52648 +6.115,0.52656 +6.12,0.52663 +6.125,0.52671 +6.13,0.52678 +6.135,0.52685 +6.14,0.52692 +6.145,0.52699 +6.15,0.52706 +6.155,0.52713 +6.16,0.52719 +6.165,0.52726 +6.17,0.52732 +6.175,0.52738 +6.18,0.52744 +6.185,0.5275 +6.19,0.52755 +6.195,0.5276 +6.2,0.52766 +6.205,0.5277 +6.21,0.52775 +6.215,0.52779 +6.22,0.52784 +6.225,0.52788 +6.23,0.52792 +6.235,0.52795 +6.24,0.52798 +6.245,0.52802 +6.25,0.52805 +6.255,0.52807 +6.26,0.5281 +6.265,0.52812 +6.27,0.52814 +6.275,0.52816 +6.28,0.52818 +6.285,0.5282 +6.29,0.52821 +6.295,0.52823 +6.3,0.52824 +6.305,0.52825 +6.31,0.52826 +6.315,0.52826 +6.32,0.52827 +6.325,0.52828 +6.33,0.52828 +6.335,0.52829 +6.34,0.52829 +6.345,0.52829 +6.35,0.5283 +6.355,0.5283 +6.36,0.5283 +6.365,0.5283 +6.37,0.5283 +6.375,0.52831 +6.38,0.52831 +6.385,0.52831 +6.39,0.52831 +6.395,0.52832 +6.4,0.52832 +6.405,0.52833 +6.41,0.52833 +6.415,0.52834 +6.42,0.52835 +6.425,0.52836 +6.43,0.52837 +6.435,0.52838 +6.44,0.52839 +6.445,0.52841 +6.45,0.52842 +6.455,0.52844 +6.46,0.52846 +6.465,0.52848 +6.47,0.52851 +6.475,0.52853 +6.48,0.52856 +6.485,0.52858 +6.49,0.52861 +6.495,0.52865 +6.5,0.52868 +6.505,0.52871 +6.51,0.52875 +6.515,0.52879 +6.52,0.52883 +6.525,0.52887 +6.53,0.52892 +6.535,0.52896 +6.54,0.52901 +6.545,0.52906 +6.55,0.52911 +6.555,0.52916 +6.56,0.52921 +6.565,0.52927 +6.57,0.52933 +6.575,0.52938 +6.58,0.52944 +6.585,0.5295 +6.59,0.52956 +6.595,0.52962 +6.6,0.52968 +6.605,0.52975 +6.61,0.52981 +6.615,0.52987 +6.62,0.52994 +6.625,0.53 +6.63,0.53007 +6.635,0.53013 +6.64,0.5302 +6.645,0.53026 +6.65,0.53033 +6.655,0.53039 +6.66,0.53046 +6.665,0.53052 +6.67,0.53059 +6.675,0.53065 +6.68,0.53071 +6.685,0.53077 +6.69,0.53083 +6.695,0.53089 +6.7,0.53095 +6.705,0.53101 +6.71,0.53106 +6.715,0.53112 +6.72,0.53117 +6.725,0.53123 +6.73,0.53128 +6.735,0.53133 +6.74,0.53138 +6.745,0.53142 +6.75,0.53147 +6.755,0.53151 +6.76,0.53155 +6.765,0.5316 +6.77,0.53163 +6.775,0.53167 +6.78,0.53171 +6.785,0.53174 +6.79,0.53178 +6.795,0.53181 +6.8,0.53184 +6.805,0.53187 +6.81,0.53189 +6.815,0.53192 +6.82,0.53194 +6.825,0.53197 +6.83,0.53199 +6.835,0.53201 +6.84,0.53203 +6.845,0.53204 +6.85,0.53206 +6.855,0.53208 +6.86,0.53209 +6.865,0.5321 +6.87,0.53212 +6.875,0.53213 +6.88,0.53214 +6.885,0.53215 +6.89,0.53216 +6.895,0.53217 +6.9,0.53218 +6.905,0.53219 +6.91,0.5322 +6.915,0.53221 +6.92,0.53222 +6.925,0.53223 +6.93,0.53224 +6.935,0.53225 +6.94,0.53226 +6.945,0.53227 +6.95,0.53228 +6.955,0.53229 +6.96,0.5323 +6.965,0.53231 +6.97,0.53232 +6.975,0.53234 +6.98,0.53235 +6.985,0.53237 +6.99,0.53238 +6.995,0.5324 +7,0.53242 +7.005,0.53244 +7.01,0.53246 +7.015,0.53248 +7.02,0.5325 +7.025,0.53252 +7.03,0.53255 +7.035,0.53257 +7.04,0.5326 +7.045,0.53263 +7.05,0.53266 +7.055,0.53269 +7.06,0.53272 +7.065,0.53275 +7.07,0.53279 +7.075,0.53282 +7.08,0.53286 +7.085,0.5329 +7.09,0.53294 +7.095,0.53298 +7.1,0.53302 +7.105,0.53306 +7.11,0.5331 +7.115,0.53314 +7.12,0.53319 +7.125,0.53323 +7.13,0.53328 +7.135,0.53333 +7.14,0.53337 +7.145,0.53342 +7.15,0.53347 +7.155,0.53352 +7.16,0.53357 +7.165,0.53362 +7.17,0.53367 +7.175,0.53372 +7.18,0.53377 +7.185,0.53382 +7.19,0.53387 +7.195,0.53392 +7.2,0.53396 +7.205,0.53401 +7.21,0.53406 +7.215,0.53411 +7.22,0.53416 +7.225,0.53421 +7.23,0.53426 +7.235,0.5343 +7.24,0.53435 +7.245,0.53439 +7.25,0.53444 +7.255,0.53448 +7.26,0.53452 +7.265,0.53457 +7.27,0.53461 +7.275,0.53465 +7.28,0.53469 +7.285,0.53472 +7.29,0.53476 +7.295,0.5348 +7.3,0.53483 +7.305,0.53487 +7.31,0.5349 +7.315,0.53493 +7.32,0.53496 +7.325,0.53499 +7.33,0.53502 +7.335,0.53504 +7.34,0.53507 +7.345,0.53509 +7.35,0.53511 +7.355,0.53514 +7.36,0.53516 +7.365,0.53518 +7.37,0.5352 +7.375,0.53521 +7.38,0.53523 +7.385,0.53525 +7.39,0.53526 +7.395,0.53527 +7.4,0.53529 +7.405,0.5353 +7.41,0.53531 +7.415,0.53532 +7.42,0.53533 +7.425,0.53534 +7.43,0.53535 +7.435,0.53536 +7.44,0.53537 +7.445,0.53538 +7.45,0.53538 +7.455,0.53539 +7.46,0.5354 +7.465,0.5354 +7.47,0.53541 +7.475,0.53542 +7.48,0.53542 +7.485,0.53543 +7.49,0.53544 +7.495,0.53544 +7.5,0.53545 +7.505,0.53546 +7.51,0.53547 +7.515,0.53547 +7.52,0.53548 +7.525,0.53549 +7.53,0.5355 +7.535,0.53551 +7.54,0.53552 +7.545,0.53553 +7.55,0.53554 +7.555,0.53556 +7.56,0.53557 +7.565,0.53558 +7.57,0.5356 +7.575,0.53561 +7.58,0.53563 +7.585,0.53564 +7.59,0.53566 +7.595,0.53568 +7.6,0.5357 +7.605,0.53572 +7.61,0.53574 +7.615,0.53576 +7.62,0.53578 +7.625,0.53581 +7.63,0.53583 +7.635,0.53586 +7.64,0.53588 +7.645,0.53591 +7.65,0.53593 +7.655,0.53596 +7.66,0.53599 +7.665,0.53602 +7.67,0.53604 +7.675,0.53607 +7.68,0.5361 +7.685,0.53613 +7.69,0.53616 +7.695,0.5362 +7.7,0.53623 +7.705,0.53626 +7.71,0.53629 +7.715,0.53632 +7.72,0.53635 +7.725,0.53639 +7.73,0.53642 +7.735,0.53645 +7.74,0.53648 +7.745,0.53652 +7.75,0.53655 +7.755,0.53658 +7.76,0.53661 +7.765,0.53664 +7.77,0.53667 +7.775,0.5367 +7.78,0.53673 +7.785,0.53676 +7.79,0.53679 +7.795,0.53682 +7.8,0.53685 +7.805,0.53687 +7.81,0.5369 +7.815,0.53693 +7.82,0.53695 +7.825,0.53697 +7.83,0.537 +7.835,0.53702 +7.84,0.53704 +7.845,0.53706 +7.85,0.53708 +7.855,0.5371 +7.86,0.53712 +7.865,0.53714 +7.87,0.53716 +7.875,0.53717 +7.88,0.53719 +7.885,0.5372 +7.89,0.53721 +7.895,0.53723 +7.9,0.53724 +7.905,0.53725 +7.91,0.53726 +7.915,0.53727 +7.92,0.53728 +7.925,0.53728 +7.93,0.53729 +7.935,0.5373 +7.94,0.5373 +7.945,0.53731 +7.95,0.53731 +7.955,0.53731 +7.96,0.53731 +7.965,0.53732 +7.97,0.53732 +7.975,0.53732 +7.98,0.53732 +7.985,0.53732 +7.99,0.53732 +7.995,0.53732 +8,0.53732 +8.005,0.53732 +8.01,0.53732 +8.015,0.53731 +8.02,0.53731 +8.025,0.53731 +8.03,0.53731 +8.035,0.53731 +8.04,0.53731 +8.045,0.5373 +8.05,0.5373 +8.055,0.5373 +8.06,0.5373 +8.065,0.5373 +8.07,0.5373 +8.075,0.5373 +8.08,0.5373 +8.085,0.5373 +8.09,0.5373 +8.095,0.5373 +8.1,0.5373 +8.105,0.5373 +8.11,0.5373 +8.115,0.53731 +8.12,0.53731 +8.125,0.53731 +8.13,0.53732 +8.135,0.53732 +8.14,0.53732 +8.145,0.53733 +8.15,0.53734 +8.155,0.53734 +8.16,0.53735 +8.165,0.53736 +8.17,0.53736 +8.175,0.53737 +8.18,0.53738 +8.185,0.53739 +8.19,0.5374 +8.195,0.53741 +8.2,0.53742 +8.205,0.53743 +8.21,0.53744 +8.215,0.53746 +8.22,0.53747 +8.225,0.53748 +8.23,0.53749 +8.235,0.53751 +8.24,0.53752 +8.245,0.53753 +8.25,0.53755 +8.255,0.53756 +8.26,0.53758 +8.265,0.53759 +8.27,0.5376 +8.275,0.53762 +8.28,0.53763 +8.285,0.53765 +8.29,0.53766 +8.295,0.53767 +8.3,0.53769 +8.305,0.5377 +8.31,0.53771 +8.315,0.53773 +8.32,0.53774 +8.325,0.53775 +8.33,0.53777 +8.335,0.53778 +8.34,0.53779 +8.345,0.5378 +8.35,0.53781 +8.355,0.53782 +8.36,0.53783 +8.365,0.53784 +8.37,0.53785 +8.375,0.53786 +8.38,0.53786 +8.385,0.53787 +8.39,0.53788 +8.395,0.53788 +8.4,0.53789 +8.405,0.53789 +8.41,0.5379 +8.415,0.5379 +8.42,0.5379 +8.425,0.5379 +8.43,0.5379 +8.435,0.53791 +8.44,0.5379 +8.445,0.5379 +8.45,0.5379 +8.455,0.5379 +8.46,0.5379 +8.465,0.53789 +8.47,0.53789 +8.475,0.53789 +8.48,0.53788 +8.485,0.53788 +8.49,0.53787 +8.495,0.53786 +8.5,0.53785 +8.505,0.53785 +8.51,0.53784 +8.515,0.53783 +8.52,0.53782 +8.525,0.53781 +8.53,0.5378 +8.535,0.53779 +8.54,0.53778 +8.545,0.53777 +8.55,0.53776 +8.555,0.53775 +8.56,0.53774 +8.565,0.53773 +8.57,0.53771 +8.575,0.5377 +8.58,0.53769 +8.585,0.53768 +8.59,0.53767 +8.595,0.53766 +8.6,0.53764 +8.605,0.53763 +8.61,0.53762 +8.615,0.53761 +8.62,0.5376 +8.625,0.53759 +8.63,0.53757 +8.635,0.53756 +8.64,0.53755 +8.645,0.53754 +8.65,0.53753 +8.655,0.53752 +8.66,0.53751 +8.665,0.5375 +8.67,0.53749 +8.675,0.53749 +8.68,0.53748 +8.685,0.53747 +8.69,0.53746 +8.695,0.53745 +8.7,0.53745 +8.705,0.53744 +8.71,0.53743 +8.715,0.53743 +8.72,0.53742 +8.725,0.53742 +8.73,0.53741 +8.735,0.53741 +8.74,0.5374 +8.745,0.5374 +8.75,0.53739 +8.755,0.53739 +8.76,0.53739 +8.765,0.53738 +8.77,0.53738 +8.775,0.53738 +8.78,0.53738 +8.785,0.53737 +8.79,0.53737 +8.795,0.53737 +8.8,0.53737 +8.805,0.53737 +8.81,0.53737 +8.815,0.53736 +8.82,0.53736 +8.825,0.53736 +8.83,0.53736 +8.835,0.53736 +8.84,0.53736 +8.845,0.53736 +8.85,0.53735 +8.855,0.53735 +8.86,0.53735 +8.865,0.53735 +8.87,0.53734 +8.875,0.53734 +8.88,0.53734 +8.885,0.53734 +8.89,0.53733 +8.895,0.53733 +8.9,0.53733 +8.905,0.53732 +8.91,0.53732 +8.915,0.53731 +8.92,0.53731 +8.925,0.5373 +8.93,0.53729 +8.935,0.53729 +8.94,0.53728 +8.945,0.53727 +8.95,0.53726 +8.955,0.53726 +8.96,0.53725 +8.965,0.53724 +8.97,0.53723 +8.975,0.53722 +8.98,0.53721 +8.985,0.53719 +8.99,0.53718 +8.995,0.53717 +9,0.53716 +9.005,0.53714 +9.01,0.53713 +9.015,0.53712 +9.02,0.5371 +9.025,0.53709 +9.03,0.53707 +9.035,0.53706 +9.04,0.53704 +9.045,0.53702 +9.05,0.53701 +9.055,0.53699 +9.06,0.53697 +9.065,0.53695 +9.07,0.53693 +9.075,0.53692 +9.08,0.5369 +9.085,0.53688 +9.09,0.53686 +9.095,0.53684 +9.1,0.53682 +9.105,0.5368 +9.11,0.53678 +9.115,0.53676 +9.12,0.53674 +9.125,0.53672 +9.13,0.5367 +9.135,0.53668 +9.14,0.53666 +9.145,0.53664 +9.15,0.53662 +9.155,0.5366 +9.16,0.53658 +9.165,0.53656 +9.17,0.53654 +9.175,0.53652 +9.18,0.5365 +9.185,0.53648 +9.19,0.53646 +9.195,0.53644 +9.2,0.53642 +9.205,0.5364 +9.21,0.53638 +9.215,0.53636 +9.22,0.53634 +9.225,0.53633 +9.23,0.53631 +9.235,0.53629 +9.24,0.53627 +9.245,0.53626 +9.25,0.53624 +9.255,0.53622 +9.26,0.53621 +9.265,0.53619 +9.27,0.53617 +9.275,0.53616 +9.28,0.53614 +9.285,0.53613 +9.29,0.53611 +9.295,0.5361 +9.3,0.53608 +9.305,0.53607 +9.31,0.53605 +9.315,0.53604 +9.32,0.53603 +9.325,0.53601 +9.33,0.536 +9.335,0.53599 +9.34,0.53597 +9.345,0.53596 +9.35,0.53595 +9.355,0.53593 +9.36,0.53592 +9.365,0.53591 +9.37,0.5359 +9.375,0.53588 +9.38,0.53587 +9.385,0.53586 +9.39,0.53584 +9.395,0.53583 +9.4,0.53582 +9.405,0.53581 +9.41,0.53579 +9.415,0.53578 +9.42,0.53577 +9.425,0.53575 +9.43,0.53574 +9.435,0.53573 +9.44,0.53571 +9.445,0.5357 +9.45,0.53568 +9.455,0.53567 +9.46,0.53566 +9.465,0.53564 +9.47,0.53562 +9.475,0.53561 +9.48,0.53559 +9.485,0.53558 +9.49,0.53556 +9.495,0.53554 +9.5,0.53553 +9.505,0.53551 +9.51,0.53549 +9.515,0.53547 +9.52,0.53546 +9.525,0.53544 +9.53,0.53542 +9.535,0.5354 +9.54,0.53538 +9.545,0.53536 +9.55,0.53534 +9.555,0.53532 +9.56,0.5353 +9.565,0.53528 +9.57,0.53526 +9.575,0.53524 +9.58,0.53521 +9.585,0.53519 +9.59,0.53517 +9.595,0.53515 +9.6,0.53512 +9.605,0.5351 +9.61,0.53508 +9.615,0.53505 +9.62,0.53503 +9.625,0.535 +9.63,0.53498 +9.635,0.53496 +9.64,0.53493 +9.645,0.53491 +9.65,0.53488 +9.655,0.53486 +9.66,0.53483 +9.665,0.53481 +9.67,0.53478 +9.675,0.53476 +9.68,0.53473 +9.685,0.53471 +9.69,0.53468 +9.695,0.53466 +9.7,0.53463 +9.705,0.53461 +9.71,0.53458 +9.715,0.53456 +9.72,0.53453 +9.725,0.53451 +9.73,0.53448 +9.735,0.53446 +9.74,0.53443 +9.745,0.53441 +9.75,0.53438 +9.755,0.53436 +9.76,0.53434 +9.765,0.53431 +9.77,0.53429 +9.775,0.53427 +9.78,0.53424 +9.785,0.53422 +9.79,0.5342 +9.795,0.53418 +9.8,0.53415 +9.805,0.53413 +9.81,0.53411 +9.815,0.53409 +9.82,0.53407 +9.825,0.53405 +9.83,0.53402 +9.835,0.534 +9.84,0.53398 +9.845,0.53396 +9.85,0.53394 +9.855,0.53392 +9.86,0.5339 +9.865,0.53388 +9.87,0.53386 +9.875,0.53384 +9.88,0.53382 +9.885,0.5338 +9.89,0.53379 +9.895,0.53377 +9.9,0.53375 +9.905,0.53373 +9.91,0.53371 +9.915,0.53369 +9.92,0.53367 +9.925,0.53365 +9.93,0.53364 +9.935,0.53362 +9.94,0.5336 +9.945,0.53358 +9.95,0.53356 +9.955,0.53354 +9.96,0.53353 +9.965,0.53351 +9.97,0.53349 +9.975,0.53347 +9.98,0.53345 +9.985,0.53343 +9.99,0.53341 +9.995,0.53339 +10,0.53338 +10.005,0.53336 +10.01,0.53334 +10.015,0.53332 +10.02,0.5333 +10.025,0.53328 +10.03,0.53326 +10.035,0.53324 +10.04,0.53322 +10.045,0.5332 +10.05,0.53318 +10.055,0.53315 +10.06,0.53313 +10.065,0.53311 +10.07,0.53309 +10.075,0.53307 +10.08,0.53305 +10.085,0.53302 +10.09,0.533 +10.095,0.53298 +10.1,0.53296 +10.105,0.53293 +10.11,0.53291 +10.115,0.53289 +10.12,0.53286 +10.125,0.53284 +10.13,0.53282 +10.135,0.53279 +10.14,0.53277 +10.145,0.53274 +10.15,0.53272 +10.155,0.5327 +10.16,0.53267 +10.165,0.53265 +10.17,0.53262 +10.175,0.5326 +10.18,0.53257 +10.185,0.53255 +10.19,0.53252 +10.195,0.5325 +10.2,0.53247 +10.205,0.53244 +10.21,0.53242 +10.215,0.53239 +10.22,0.53237 +10.225,0.53234 +10.23,0.53232 +10.235,0.53229 +10.24,0.53227 +10.245,0.53224 +10.25,0.53222 +10.255,0.53219 +10.26,0.53217 +10.265,0.53214 +10.27,0.53212 +10.275,0.53209 +10.28,0.53207 +10.285,0.53204 +10.29,0.53202 +10.295,0.53199 +10.3,0.53197 +10.305,0.53194 +10.31,0.53192 +10.315,0.5319 +10.32,0.53187 +10.325,0.53185 +10.33,0.53183 +10.335,0.5318 +10.34,0.53178 +10.345,0.53176 +10.35,0.53173 +10.355,0.53171 +10.36,0.53169 +10.365,0.53167 +10.37,0.53165 +10.375,0.53162 +10.38,0.5316 +10.385,0.53158 +10.39,0.53156 +10.395,0.53154 +10.4,0.53152 +10.405,0.5315 +10.41,0.53148 +10.415,0.53146 +10.42,0.53144 +10.425,0.53142 +10.43,0.5314 +10.435,0.53138 +10.44,0.53136 +10.445,0.53134 +10.45,0.53132 +10.455,0.5313 +10.46,0.53128 +10.465,0.53126 +10.47,0.53124 +10.475,0.53122 +10.48,0.5312 +10.485,0.53118 +10.49,0.53116 +10.495,0.53115 +10.5,0.53113 +10.505,0.53111 +10.51,0.53109 +10.515,0.53107 +10.52,0.53105 +10.525,0.53103 +10.53,0.53102 +10.535,0.531 +10.54,0.53098 +10.545,0.53096 +10.55,0.53094 +10.555,0.53092 +10.56,0.5309 +10.565,0.53088 +10.57,0.53086 +10.575,0.53084 +10.58,0.53083 +10.585,0.53081 +10.59,0.53079 +10.595,0.53077 +10.6,0.53075 +10.605,0.53073 +10.61,0.53071 +10.615,0.53069 +10.62,0.53067 +10.625,0.53065 +10.63,0.53063 +10.635,0.53061 +10.64,0.53059 +10.645,0.53057 +10.65,0.53055 +10.655,0.53052 +10.66,0.5305 +10.665,0.53048 +10.67,0.53046 +10.675,0.53044 +10.68,0.53042 +10.685,0.5304 +10.69,0.53038 +10.695,0.53036 +10.7,0.53033 +10.705,0.53031 +10.71,0.53029 +10.715,0.53027 +10.72,0.53025 +10.725,0.53023 +10.73,0.5302 +10.735,0.53018 +10.74,0.53016 +10.745,0.53014 +10.75,0.53012 +10.755,0.53009 +10.76,0.53007 +10.765,0.53005 +10.77,0.53003 +10.775,0.53001 +10.78,0.52999 +10.785,0.52996 +10.79,0.52994 +10.795,0.52992 +10.8,0.5299 +10.805,0.52988 +10.81,0.52986 +10.815,0.52984 +10.82,0.52982 +10.825,0.52979 +10.83,0.52977 +10.835,0.52975 +10.84,0.52973 +10.845,0.52971 +10.85,0.52969 +10.855,0.52967 +10.86,0.52965 +10.865,0.52963 +10.87,0.52961 +10.875,0.52959 +10.88,0.52957 +10.885,0.52955 +10.89,0.52953 +10.895,0.52952 +10.9,0.5295 +10.905,0.52948 +10.91,0.52946 +10.915,0.52944 +10.92,0.52942 +10.925,0.52941 +10.93,0.52939 +10.935,0.52937 +10.94,0.52935 +10.945,0.52934 +10.95,0.52932 +10.955,0.5293 +10.96,0.52929 +10.965,0.52927 +10.97,0.52925 +10.975,0.52924 +10.98,0.52922 +10.985,0.5292 +10.99,0.52919 +10.995,0.52917 +11,0.52916 +11.005,0.52914 +11.01,0.52913 +11.015,0.52911 +11.02,0.52909 +11.025,0.52908 +11.03,0.52906 +11.035,0.52905 +11.04,0.52903 +11.045,0.52902 +11.05,0.529 +11.055,0.52899 +11.06,0.52897 +11.065,0.52896 +11.07,0.52895 +11.075,0.52893 +11.08,0.52892 +11.085,0.5289 +11.09,0.52889 +11.095,0.52887 +11.1,0.52886 +11.105,0.52884 +11.11,0.52883 +11.115,0.52881 +11.12,0.5288 +11.125,0.52879 +11.13,0.52877 +11.135,0.52876 +11.14,0.52874 +11.145,0.52873 +11.15,0.52871 +11.155,0.5287 +11.16,0.52868 +11.165,0.52867 +11.17,0.52865 +11.175,0.52864 +11.18,0.52862 +11.185,0.52861 +11.19,0.52859 +11.195,0.52858 +11.2,0.52856 +11.205,0.52855 +11.21,0.52853 +11.215,0.52852 +11.22,0.5285 +11.225,0.52849 +11.23,0.52847 +11.235,0.52846 +11.24,0.52844 +11.245,0.52843 +11.25,0.52841 +11.255,0.52839 +11.26,0.52838 +11.265,0.52836 +11.27,0.52835 +11.275,0.52833 +11.28,0.52832 +11.285,0.5283 +11.29,0.52829 +11.295,0.52827 +11.3,0.52826 +11.305,0.52824 +11.31,0.52823 +11.315,0.52821 +11.32,0.5282 +11.325,0.52818 +11.33,0.52817 +11.335,0.52815 +11.34,0.52814 +11.345,0.52812 +11.35,0.52811 +11.355,0.52809 +11.36,0.52808 +11.365,0.52806 +11.37,0.52805 +11.375,0.52804 +11.38,0.52802 +11.385,0.52801 +11.39,0.52799 +11.395,0.52798 +11.4,0.52797 +11.405,0.52795 +11.41,0.52794 +11.415,0.52793 +11.42,0.52791 +11.425,0.5279 +11.43,0.52789 +11.435,0.52788 +11.44,0.52786 +11.445,0.52785 +11.45,0.52784 +11.455,0.52783 +11.46,0.52782 +11.465,0.52781 +11.47,0.52779 +11.475,0.52778 +11.48,0.52777 +11.485,0.52776 +11.49,0.52775 +11.495,0.52774 +11.5,0.52773 +11.505,0.52772 +11.51,0.52771 +11.515,0.5277 +11.52,0.52769 +11.525,0.52768 +11.53,0.52767 +11.535,0.52766 +11.54,0.52765 +11.545,0.52764 +11.55,0.52763 +11.555,0.52762 +11.56,0.52761 +11.565,0.5276 +11.57,0.52759 +11.575,0.52759 +11.58,0.52758 +11.585,0.52757 +11.59,0.52756 +11.595,0.52755 +11.6,0.52754 +11.605,0.52754 +11.61,0.52753 +11.615,0.52752 +11.62,0.52751 +11.625,0.5275 +11.63,0.52749 +11.635,0.52749 +11.64,0.52748 +11.645,0.52747 +11.65,0.52746 +11.655,0.52746 +11.66,0.52745 +11.665,0.52744 +11.67,0.52743 +11.675,0.52742 +11.68,0.52742 +11.685,0.52741 +11.69,0.5274 +11.695,0.52739 +11.7,0.52739 +11.705,0.52738 +11.71,0.52737 +11.715,0.52736 +11.72,0.52736 +11.725,0.52735 +11.73,0.52734 +11.735,0.52733 +11.74,0.52732 +11.745,0.52732 +11.75,0.52731 +11.755,0.5273 +11.76,0.52729 +11.765,0.52729 +11.77,0.52728 +11.775,0.52727 +11.78,0.52726 +11.785,0.52726 +11.79,0.52725 +11.795,0.52724 +11.8,0.52723 +11.805,0.52723 +11.81,0.52722 +11.815,0.52721 +11.82,0.5272 +11.825,0.5272 +11.83,0.52719 +11.835,0.52718 +11.84,0.52717 +11.845,0.52717 +11.85,0.52716 +11.855,0.52715 +11.86,0.52714 +11.865,0.52714 +11.87,0.52713 +11.875,0.52712 +11.88,0.52712 +11.885,0.52711 +11.89,0.5271 +11.895,0.5271 +11.9,0.52709 +11.905,0.52708 +11.91,0.52708 +11.915,0.52707 +11.92,0.52707 +11.925,0.52706 +11.93,0.52705 +11.935,0.52705 +11.94,0.52704 +11.945,0.52704 +11.95,0.52703 +11.955,0.52703 +11.96,0.52702 +11.965,0.52702 +11.97,0.52701 +11.975,0.52701 +11.98,0.527 +11.985,0.527 +11.99,0.52699 +11.995,0.52699 +12,0.52698 +12.005,0.52698 +12.01,0.52697 +12.015,0.52697 +12.02,0.52697 +12.025,0.52696 +12.03,0.52696 +12.035,0.52696 +12.04,0.52695 +12.045,0.52695 +12.05,0.52695 +12.055,0.52694 +12.06,0.52694 +12.065,0.52694 +12.07,0.52694 +12.075,0.52693 +12.08,0.52693 +12.085,0.52693 +12.09,0.52693 +12.095,0.52693 +12.1,0.52692 +12.105,0.52692 +12.11,0.52692 +12.115,0.52692 +12.12,0.52692 +12.125,0.52692 +12.13,0.52692 +12.135,0.52691 +12.14,0.52691 +12.145,0.52691 +12.15,0.52691 +12.155,0.52691 +12.16,0.52691 +12.165,0.52691 +12.17,0.52691 +12.175,0.52691 +12.18,0.52691 +12.185,0.52691 +12.19,0.5269 +12.195,0.5269 +12.2,0.5269 +12.205,0.5269 +12.21,0.5269 +12.215,0.5269 +12.22,0.5269 +12.225,0.5269 +12.23,0.5269 +12.235,0.5269 +12.24,0.5269 +12.245,0.5269 +12.25,0.5269 +12.255,0.5269 +12.26,0.5269 +12.265,0.5269 +12.27,0.5269 +12.275,0.5269 +12.28,0.5269 +12.285,0.5269 +12.29,0.5269 +12.295,0.5269 +12.3,0.5269 +12.305,0.5269 +12.31,0.5269 +12.315,0.5269 +12.32,0.5269 +12.325,0.5269 +12.33,0.5269 +12.335,0.5269 +12.34,0.5269 +12.345,0.5269 +12.35,0.5269 +12.355,0.5269 +12.36,0.5269 +12.365,0.5269 +12.37,0.5269 +12.375,0.5269 +12.38,0.5269 +12.385,0.5269 +12.39,0.5269 +12.395,0.5269 +12.4,0.5269 +12.405,0.52691 +12.41,0.52691 +12.415,0.52691 +12.42,0.52691 +12.425,0.52691 +12.43,0.52691 +12.435,0.52691 +12.44,0.52691 +12.445,0.52691 +12.45,0.52691 +12.455,0.52691 +12.46,0.52692 +12.465,0.52692 +12.47,0.52692 +12.475,0.52692 +12.48,0.52692 +12.485,0.52692 +12.49,0.52693 +12.495,0.52693 +12.5,0.52693 +12.505,0.52693 +12.51,0.52693 +12.515,0.52694 +12.52,0.52694 +12.525,0.52694 +12.53,0.52694 +12.535,0.52695 +12.54,0.52695 +12.545,0.52695 +12.55,0.52696 +12.555,0.52696 +12.56,0.52696 +12.565,0.52697 +12.57,0.52697 +12.575,0.52697 +12.58,0.52698 +12.585,0.52698 +12.59,0.52698 +12.595,0.52699 +12.6,0.52699 +12.605,0.527 +12.61,0.527 +12.615,0.527 +12.62,0.52701 +12.625,0.52701 +12.63,0.52702 +12.635,0.52702 +12.64,0.52703 +12.645,0.52703 +12.65,0.52704 +12.655,0.52704 +12.66,0.52705 +12.665,0.52705 +12.67,0.52706 +12.675,0.52706 +12.68,0.52707 +12.685,0.52707 +12.69,0.52708 +12.695,0.52708 +12.7,0.52709 +12.705,0.52709 +12.71,0.5271 +12.715,0.52711 +12.72,0.52711 +12.725,0.52712 +12.73,0.52712 +12.735,0.52713 +12.74,0.52713 +12.745,0.52714 +12.75,0.52715 +12.755,0.52715 +12.76,0.52716 +12.765,0.52716 +12.77,0.52717 +12.775,0.52718 +12.78,0.52718 +12.785,0.52719 +12.79,0.52719 +12.795,0.5272 +12.8,0.52721 +12.805,0.52721 +12.81,0.52722 +12.815,0.52723 +12.82,0.52723 +12.825,0.52724 +12.83,0.52724 +12.835,0.52725 +12.84,0.52726 +12.845,0.52726 +12.85,0.52727 +12.855,0.52728 +12.86,0.52728 +12.865,0.52729 +12.87,0.52729 +12.875,0.5273 +12.88,0.52731 +12.885,0.52731 +12.89,0.52732 +12.895,0.52733 +12.9,0.52733 +12.905,0.52734 +12.91,0.52735 +12.915,0.52735 +12.92,0.52736 +12.925,0.52737 +12.93,0.52737 +12.935,0.52738 +12.94,0.52739 +12.945,0.52739 +12.95,0.5274 +12.955,0.52741 +12.96,0.52741 +12.965,0.52742 +12.97,0.52743 +12.975,0.52743 +12.98,0.52744 +12.985,0.52745 +12.99,0.52745 +12.995,0.52746 +13,0.52747 +13.005,0.52748 +13.01,0.52748 +13.015,0.52749 +13.02,0.5275 +13.025,0.52751 +13.03,0.52751 +13.035,0.52752 +13.04,0.52753 +13.045,0.52754 +13.05,0.52754 +13.055,0.52755 +13.06,0.52756 +13.065,0.52757 +13.07,0.52758 +13.075,0.52758 +13.08,0.52759 +13.085,0.5276 +13.09,0.52761 +13.095,0.52762 +13.1,0.52763 +13.105,0.52763 +13.11,0.52764 +13.115,0.52765 +13.12,0.52766 +13.125,0.52767 +13.13,0.52768 +13.135,0.52769 +13.14,0.52769 +13.145,0.5277 +13.15,0.52771 +13.155,0.52772 +13.16,0.52773 +13.165,0.52774 +13.17,0.52775 +13.175,0.52776 +13.18,0.52777 +13.185,0.52778 +13.19,0.52779 +13.195,0.5278 +13.2,0.52781 +13.205,0.52782 +13.21,0.52783 +13.215,0.52784 +13.22,0.52785 +13.225,0.52786 +13.23,0.52787 +13.235,0.52788 +13.24,0.52789 +13.245,0.5279 +13.25,0.52791 +13.255,0.52792 +13.26,0.52793 +13.265,0.52794 +13.27,0.52795 +13.275,0.52796 +13.28,0.52797 +13.285,0.52798 +13.29,0.52799 +13.295,0.528 +13.3,0.52801 +13.305,0.52802 +13.31,0.52803 +13.315,0.52804 +13.32,0.52805 +13.325,0.52806 +13.33,0.52807 +13.335,0.52808 +13.34,0.52809 +13.345,0.5281 +13.35,0.52811 +13.355,0.52812 +13.36,0.52813 +13.365,0.52814 +13.37,0.52815 +13.375,0.52816 +13.38,0.52817 +13.385,0.52818 +13.39,0.52819 +13.395,0.5282 +13.4,0.52821 +13.405,0.52822 +13.41,0.52823 +13.415,0.52824 +13.42,0.52825 +13.425,0.52827 +13.43,0.52828 +13.435,0.52829 +13.44,0.5283 +13.445,0.52831 +13.45,0.52832 +13.455,0.52833 +13.46,0.52834 +13.465,0.52835 +13.47,0.52836 +13.475,0.52837 +13.48,0.52838 +13.485,0.52839 +13.49,0.5284 +13.495,0.52841 +13.5,0.52842 +13.505,0.52843 +13.51,0.52844 +13.515,0.52845 +13.52,0.52846 +13.525,0.52847 +13.53,0.52848 +13.535,0.52849 +13.54,0.5285 +13.545,0.52852 +13.55,0.52853 +13.555,0.52854 +13.56,0.52855 +13.565,0.52856 +13.57,0.52857 +13.575,0.52858 +13.58,0.52859 +13.585,0.5286 +13.59,0.52861 +13.595,0.52862 +13.6,0.52863 +13.605,0.52864 +13.61,0.52866 +13.615,0.52867 +13.62,0.52868 +13.625,0.52869 +13.63,0.5287 +13.635,0.52871 +13.64,0.52872 +13.645,0.52873 +13.65,0.52874 +13.655,0.52876 +13.66,0.52877 +13.665,0.52878 +13.67,0.52879 +13.675,0.5288 +13.68,0.52881 +13.685,0.52882 +13.69,0.52884 +13.695,0.52885 +13.7,0.52886 +13.705,0.52887 +13.71,0.52888 +13.715,0.52889 +13.72,0.5289 +13.725,0.52892 +13.73,0.52893 +13.735,0.52894 +13.74,0.52895 +13.745,0.52896 +13.75,0.52898 +13.755,0.52899 +13.76,0.529 +13.765,0.52901 +13.77,0.52902 +13.775,0.52903 +13.78,0.52905 +13.785,0.52906 +13.79,0.52907 +13.795,0.52908 +13.8,0.52909 +13.805,0.52911 +13.81,0.52912 +13.815,0.52913 +13.82,0.52914 +13.825,0.52915 +13.83,0.52917 +13.835,0.52918 +13.84,0.52919 +13.845,0.5292 +13.85,0.52921 +13.855,0.52923 +13.86,0.52924 +13.865,0.52925 +13.87,0.52926 +13.875,0.52927 +13.88,0.52928 +13.885,0.5293 +13.89,0.52931 +13.895,0.52932 +13.9,0.52933 +13.905,0.52934 +13.91,0.52936 +13.915,0.52937 +13.92,0.52938 +13.925,0.52939 +13.93,0.5294 +13.935,0.52941 +13.94,0.52943 +13.945,0.52944 +13.95,0.52945 +13.955,0.52946 +13.96,0.52947 +13.965,0.52948 +13.97,0.5295 +13.975,0.52951 +13.98,0.52952 +13.985,0.52953 +13.99,0.52954 +13.995,0.52955 +14,0.52956 +14.005,0.52958 +14.01,0.52959 +14.015,0.5296 +14.02,0.52961 +14.025,0.52962 +14.03,0.52963 +14.035,0.52964 +14.04,0.52966 +14.045,0.52967 +14.05,0.52968 +14.055,0.52969 +14.06,0.5297 +14.065,0.52971 +14.07,0.52972 +14.075,0.52973 +14.08,0.52975 +14.085,0.52976 +14.09,0.52977 +14.095,0.52978 +14.1,0.52979 +14.105,0.5298 +14.11,0.52981 +14.115,0.52983 +14.12,0.52984 +14.125,0.52985 +14.13,0.52986 +14.135,0.52987 +14.14,0.52988 +14.145,0.52989 +14.15,0.5299 +14.155,0.52992 +14.16,0.52993 +14.165,0.52994 +14.17,0.52995 +14.175,0.52996 +14.18,0.52997 +14.185,0.52998 +14.19,0.52999 +14.195,0.53001 +14.2,0.53002 +14.205,0.53003 +14.21,0.53004 +14.215,0.53005 +14.22,0.53006 +14.225,0.53007 +14.23,0.53009 +14.235,0.5301 +14.24,0.53011 +14.245,0.53012 +14.25,0.53013 +14.255,0.53014 +14.26,0.53015 +14.265,0.53016 +14.27,0.53018 +14.275,0.53019 +14.28,0.5302 +14.285,0.53021 +14.29,0.53022 +14.295,0.53023 +14.3,0.53024 +14.305,0.53026 +14.31,0.53027 +14.315,0.53028 +14.32,0.53029 +14.325,0.5303 +14.33,0.53031 +14.335,0.53032 +14.34,0.53033 +14.345,0.53035 +14.35,0.53036 +14.355,0.53037 +14.36,0.53038 +14.365,0.53039 +14.37,0.5304 +14.375,0.53041 +14.38,0.53042 +14.385,0.53043 +14.39,0.53045 +14.395,0.53046 +14.4,0.53047 +14.405,0.53048 +14.41,0.53049 +14.415,0.5305 +14.42,0.53051 +14.425,0.53052 +14.43,0.53053 +14.435,0.53054 +14.44,0.53055 +14.445,0.53057 +14.45,0.53058 +14.455,0.53059 +14.46,0.5306 +14.465,0.53061 +14.47,0.53062 +14.475,0.53063 +14.48,0.53064 +14.485,0.53065 +14.49,0.53066 +14.495,0.53067 +14.5,0.53068 +14.505,0.53069 +14.51,0.5307 +14.515,0.53071 +14.52,0.53072 +14.525,0.53073 +14.53,0.53074 +14.535,0.53075 +14.54,0.53076 +14.545,0.53077 +14.55,0.53078 +14.555,0.53079 +14.56,0.5308 +14.565,0.53081 +14.57,0.53082 +14.575,0.53083 +14.58,0.53084 +14.585,0.53085 +14.59,0.53086 +14.595,0.53087 +14.6,0.53088 +14.605,0.53089 +14.61,0.5309 +14.615,0.53091 +14.62,0.53092 +14.625,0.53093 +14.63,0.53094 +14.635,0.53095 +14.64,0.53096 +14.645,0.53097 +14.65,0.53098 +14.655,0.53099 +14.66,0.531 +14.665,0.53101 +14.67,0.53102 +14.675,0.53103 +14.68,0.53103 +14.685,0.53104 +14.69,0.53105 +14.695,0.53106 +14.7,0.53107 +14.705,0.53108 +14.71,0.53109 +14.715,0.5311 +14.72,0.53111 +14.725,0.53112 +14.73,0.53113 +14.735,0.53114 +14.74,0.53115 +14.745,0.53115 +14.75,0.53116 +14.755,0.53117 +14.76,0.53118 +14.765,0.53119 +14.77,0.5312 +14.775,0.53121 +14.78,0.53122 +14.785,0.53123 +14.79,0.53124 +14.795,0.53125 +14.8,0.53125 +14.805,0.53126 +14.81,0.53127 +14.815,0.53128 +14.82,0.53129 +14.825,0.5313 +14.83,0.53131 +14.835,0.53132 +14.84,0.53132 +14.845,0.53133 +14.85,0.53134 +14.855,0.53135 +14.86,0.53136 +14.865,0.53137 +14.87,0.53138 +14.875,0.53139 +14.88,0.53139 +14.885,0.5314 +14.89,0.53141 +14.895,0.53142 +14.9,0.53143 +14.905,0.53144 +14.91,0.53144 +14.915,0.53145 +14.92,0.53146 +14.925,0.53147 +14.93,0.53148 +14.935,0.53149 +14.94,0.53149 +14.945,0.5315 +14.95,0.53151 +14.955,0.53152 +14.96,0.53153 +14.965,0.53153 +14.97,0.53154 +14.975,0.53155 +14.98,0.53156 +14.985,0.53157 +14.99,0.53157 +14.995,0.53158 +15,0.53159 +15.005,0.5316 +15.01,0.5316 +15.015,0.53161 +15.02,0.53162 +15.025,0.53163 +15.03,0.53163 +15.035,0.53164 +15.04,0.53165 +15.045,0.53166 +15.05,0.53166 +15.055,0.53167 +15.06,0.53168 +15.065,0.53168 +15.07,0.53169 +15.075,0.5317 +15.08,0.53171 +15.085,0.53171 +15.09,0.53172 +15.095,0.53173 +15.1,0.53173 +15.105,0.53174 +15.11,0.53175 +15.115,0.53175 +15.12,0.53176 +15.125,0.53177 +15.13,0.53177 +15.135,0.53178 +15.14,0.53179 +15.145,0.53179 +15.15,0.5318 +15.155,0.53181 +15.16,0.53181 +15.165,0.53182 +15.17,0.53182 +15.175,0.53183 +15.18,0.53184 +15.185,0.53184 +15.19,0.53185 +15.195,0.53186 +15.2,0.53186 +15.205,0.53187 +15.21,0.53187 +15.215,0.53188 +15.22,0.53189 +15.225,0.53189 +15.23,0.5319 +15.235,0.5319 +15.24,0.53191 +15.245,0.53191 +15.25,0.53192 +15.255,0.53193 +15.26,0.53193 +15.265,0.53194 +15.27,0.53194 +15.275,0.53195 +15.28,0.53195 +15.285,0.53196 +15.29,0.53196 +15.295,0.53197 +15.3,0.53198 +15.305,0.53198 +15.31,0.53199 +15.315,0.53199 +15.32,0.532 +15.325,0.532 +15.33,0.53201 +15.335,0.53201 +15.34,0.53202 +15.345,0.53202 +15.35,0.53203 +15.355,0.53203 +15.36,0.53204 +15.365,0.53204 +15.37,0.53205 +15.375,0.53205 +15.38,0.53206 +15.385,0.53206 +15.39,0.53207 +15.395,0.53207 +15.4,0.53208 +15.405,0.53208 +15.41,0.53209 +15.415,0.53209 +15.42,0.5321 +15.425,0.5321 +15.43,0.53211 +15.435,0.53211 +15.44,0.53212 +15.445,0.53212 +15.45,0.53212 +15.455,0.53213 +15.46,0.53213 +15.465,0.53214 +15.47,0.53214 +15.475,0.53215 +15.48,0.53215 +15.485,0.53215 +15.49,0.53216 +15.495,0.53216 +15.5,0.53217 +15.505,0.53217 +15.51,0.53217 +15.515,0.53218 +15.52,0.53218 +15.525,0.53219 +15.53,0.53219 +15.535,0.53219 +15.54,0.5322 +15.545,0.5322 +15.55,0.5322 +15.555,0.53221 +15.56,0.53221 +15.565,0.53222 +15.57,0.53222 +15.575,0.53222 +15.58,0.53223 +15.585,0.53223 +15.59,0.53223 +15.595,0.53224 +15.6,0.53224 +15.605,0.53224 +15.61,0.53224 +15.615,0.53225 +15.62,0.53225 +15.625,0.53225 +15.63,0.53226 +15.635,0.53226 +15.64,0.53226 +15.645,0.53226 +15.65,0.53227 +15.655,0.53227 +15.66,0.53227 +15.665,0.53228 +15.67,0.53228 +15.675,0.53228 +15.68,0.53228 +15.685,0.53229 +15.69,0.53229 +15.695,0.53229 +15.7,0.53229 +15.705,0.53229 +15.71,0.5323 +15.715,0.5323 +15.72,0.5323 +15.725,0.5323 +15.73,0.53231 +15.735,0.53231 +15.74,0.53231 +15.745,0.53231 +15.75,0.53231 +15.755,0.53232 +15.76,0.53232 +15.765,0.53232 +15.77,0.53232 +15.775,0.53232 +15.78,0.53232 +15.785,0.53233 +15.79,0.53233 +15.795,0.53233 +15.8,0.53233 +15.805,0.53233 +15.81,0.53233 +15.815,0.53234 +15.82,0.53234 +15.825,0.53234 +15.83,0.53234 +15.835,0.53234 +15.84,0.53234 +15.845,0.53234 +15.85,0.53235 +15.855,0.53235 +15.86,0.53235 +15.865,0.53235 +15.87,0.53235 +15.875,0.53235 +15.88,0.53235 +15.885,0.53235 +15.89,0.53235 +15.895,0.53236 +15.9,0.53236 +15.905,0.53236 +15.91,0.53236 +15.915,0.53236 +15.92,0.53236 +15.925,0.53236 +15.93,0.53236 +15.935,0.53236 +15.94,0.53236 +15.945,0.53236 +15.95,0.53236 +15.955,0.53236 +15.96,0.53237 +15.965,0.53237 +15.97,0.53237 +15.975,0.53237 +15.98,0.53237 +15.985,0.53237 +15.99,0.53237 +15.995,0.53237 +16,0.53237 +16.005,0.53237 +16.01,0.53237 +16.015,0.53237 +16.02,0.53237 +16.025,0.53237 +16.03,0.53237 +16.035,0.53237 +16.04,0.53237 +16.045,0.53237 +16.05,0.53237 +16.055,0.53237 +16.06,0.53237 +16.065,0.53237 +16.07,0.53237 +16.075,0.53237 +16.08,0.53237 +16.085,0.53237 +16.09,0.53237 +16.095,0.53237 +16.1,0.53237 +16.105,0.53237 +16.11,0.53236 +16.115,0.53236 +16.12,0.53236 +16.125,0.53236 +16.13,0.53236 +16.135,0.53236 +16.14,0.53236 +16.145,0.53236 +16.15,0.53236 +16.155,0.53236 +16.16,0.53236 +16.165,0.53236 +16.17,0.53236 +16.175,0.53235 +16.18,0.53235 +16.185,0.53235 +16.19,0.53235 +16.195,0.53235 +16.2,0.53235 +16.205,0.53235 +16.21,0.53235 +16.215,0.53234 +16.22,0.53234 +16.225,0.53234 +16.23,0.53234 +16.235,0.53234 +16.24,0.53234 +16.245,0.53234 +16.25,0.53233 +16.255,0.53233 +16.26,0.53233 +16.265,0.53233 +16.27,0.53233 +16.275,0.53233 +16.28,0.53232 +16.285,0.53232 +16.29,0.53232 +16.295,0.53232 +16.3,0.53232 +16.305,0.53231 +16.31,0.53231 +16.315,0.53231 +16.32,0.53231 +16.325,0.53231 +16.33,0.5323 +16.335,0.5323 +16.34,0.5323 +16.345,0.5323 +16.35,0.5323 +16.355,0.53229 +16.36,0.53229 +16.365,0.53229 +16.37,0.53229 +16.375,0.53228 +16.38,0.53228 +16.385,0.53228 +16.39,0.53228 +16.395,0.53228 +16.4,0.53227 +16.405,0.53227 +16.41,0.53227 +16.415,0.53227 +16.42,0.53226 +16.425,0.53226 +16.43,0.53226 +16.435,0.53225 +16.44,0.53225 +16.445,0.53225 +16.45,0.53225 +16.455,0.53224 +16.46,0.53224 +16.465,0.53224 +16.47,0.53224 +16.475,0.53223 +16.48,0.53223 +16.485,0.53223 +16.49,0.53222 +16.495,0.53222 +16.5,0.53222 +16.505,0.53222 +16.51,0.53221 +16.515,0.53221 +16.52,0.53221 +16.525,0.5322 +16.53,0.5322 +16.535,0.5322 +16.54,0.53219 +16.545,0.53219 +16.55,0.53219 +16.555,0.53218 +16.56,0.53218 +16.565,0.53218 +16.57,0.53217 +16.575,0.53217 +16.58,0.53217 +16.585,0.53216 +16.59,0.53216 +16.595,0.53216 +16.6,0.53215 +16.605,0.53215 +16.61,0.53215 +16.615,0.53214 +16.62,0.53214 +16.625,0.53214 +16.63,0.53213 +16.635,0.53213 +16.64,0.53212 +16.645,0.53212 +16.65,0.53212 +16.655,0.53211 +16.66,0.53211 +16.665,0.53211 +16.67,0.5321 +16.675,0.5321 +16.68,0.53209 +16.685,0.53209 +16.69,0.53209 +16.695,0.53208 +16.7,0.53208 +16.705,0.53207 +16.71,0.53207 +16.715,0.53207 +16.72,0.53206 +16.725,0.53206 +16.73,0.53205 +16.735,0.53205 +16.74,0.53204 +16.745,0.53204 +16.75,0.53204 +16.755,0.53203 +16.76,0.53203 +16.765,0.53202 +16.77,0.53202 +16.775,0.53201 +16.78,0.53201 +16.785,0.53201 +16.79,0.532 +16.795,0.532 +16.8,0.53199 +16.805,0.53199 +16.81,0.53198 +16.815,0.53198 +16.82,0.53197 +16.825,0.53197 +16.83,0.53196 +16.835,0.53196 +16.84,0.53196 +16.845,0.53195 +16.85,0.53195 +16.855,0.53194 +16.86,0.53194 +16.865,0.53193 +16.87,0.53193 +16.875,0.53192 +16.88,0.53192 +16.885,0.53191 +16.89,0.53191 +16.895,0.5319 +16.9,0.5319 +16.905,0.53189 +16.91,0.53189 +16.915,0.53188 +16.92,0.53188 +16.925,0.53187 +16.93,0.53187 +16.935,0.53186 +16.94,0.53186 +16.945,0.53185 +16.95,0.53185 +16.955,0.53184 +16.96,0.53184 +16.965,0.53183 +16.97,0.53183 +16.975,0.53182 +16.98,0.53182 +16.985,0.53181 +16.99,0.53181 +16.995,0.5318 +17,0.5318 +17.005,0.53179 +17.01,0.53179 +17.015,0.53178 +17.02,0.53178 +17.025,0.53177 +17.03,0.53176 +17.035,0.53176 +17.04,0.53175 +17.045,0.53175 +17.05,0.53174 +17.055,0.53174 +17.06,0.53173 +17.065,0.53173 +17.07,0.53172 +17.075,0.53172 +17.08,0.53171 +17.085,0.53171 +17.09,0.5317 +17.095,0.5317 +17.1,0.53169 +17.105,0.53168 +17.11,0.53168 +17.115,0.53167 +17.12,0.53167 +17.125,0.53166 +17.13,0.53166 +17.135,0.53165 +17.14,0.53165 +17.145,0.53164 +17.15,0.53163 +17.155,0.53163 +17.16,0.53162 +17.165,0.53162 +17.17,0.53161 +17.175,0.53161 +17.18,0.5316 +17.185,0.53159 +17.19,0.53159 +17.195,0.53158 +17.2,0.53158 +17.205,0.53157 +17.21,0.53157 +17.215,0.53156 +17.22,0.53155 +17.225,0.53155 +17.23,0.53154 +17.235,0.53154 +17.24,0.53153 +17.245,0.53153 +17.25,0.53152 +17.255,0.53151 +17.26,0.53151 +17.265,0.5315 +17.27,0.5315 +17.275,0.53149 +17.28,0.53148 +17.285,0.53148 +17.29,0.53147 +17.295,0.53147 +17.3,0.53146 +17.305,0.53145 +17.31,0.53145 +17.315,0.53144 +17.32,0.53144 +17.325,0.53143 +17.33,0.53142 +17.335,0.53142 +17.34,0.53141 +17.345,0.53141 +17.35,0.5314 +17.355,0.53139 +17.36,0.53139 +17.365,0.53138 +17.37,0.53138 +17.375,0.53137 +17.38,0.53136 +17.385,0.53136 +17.39,0.53135 +17.395,0.53135 +17.4,0.53134 +17.405,0.53133 +17.41,0.53133 +17.415,0.53132 +17.42,0.53131 +17.425,0.53131 +17.43,0.5313 +17.435,0.5313 +17.44,0.53129 +17.445,0.53128 +17.45,0.53128 +17.455,0.53127 +17.46,0.53127 +17.465,0.53126 +17.47,0.53125 +17.475,0.53125 +17.48,0.53124 +17.485,0.53123 +17.49,0.53123 +17.495,0.53122 +17.5,0.53122 +17.505,0.53121 +17.51,0.5312 +17.515,0.5312 +17.52,0.53119 +17.525,0.53118 +17.53,0.53118 +17.535,0.53117 +17.54,0.53117 +17.545,0.53116 +17.55,0.53115 +17.555,0.53115 +17.56,0.53114 +17.565,0.53113 +17.57,0.53113 +17.575,0.53112 +17.58,0.53112 +17.585,0.53111 +17.59,0.5311 +17.595,0.5311 +17.6,0.53109 +17.605,0.53109 +17.61,0.53108 +17.615,0.53107 +17.62,0.53107 +17.625,0.53106 +17.63,0.53105 +17.635,0.53105 +17.64,0.53104 +17.645,0.53104 +17.65,0.53103 +17.655,0.53102 +17.66,0.53102 +17.665,0.53101 +17.67,0.531 +17.675,0.531 +17.68,0.53099 +17.685,0.53099 +17.69,0.53098 +17.695,0.53097 +17.7,0.53097 +17.705,0.53096 +17.71,0.53095 +17.715,0.53095 +17.72,0.53094 +17.725,0.53094 +17.73,0.53093 +17.735,0.53092 +17.74,0.53092 +17.745,0.53091 +17.75,0.53091 +17.755,0.5309 +17.76,0.53089 +17.765,0.53089 +17.77,0.53088 +17.775,0.53087 +17.78,0.53087 +17.785,0.53086 +17.79,0.53086 +17.795,0.53085 +17.8,0.53084 +17.805,0.53084 +17.81,0.53083 +17.815,0.53082 +17.82,0.53082 +17.825,0.53081 +17.83,0.53081 +17.835,0.5308 +17.84,0.53079 +17.845,0.53079 +17.85,0.53078 +17.855,0.53078 +17.86,0.53077 +17.865,0.53076 +17.87,0.53076 +17.875,0.53075 +17.88,0.53074 +17.885,0.53074 +17.89,0.53073 +17.895,0.53073 +17.9,0.53072 +17.905,0.53071 +17.91,0.53071 +17.915,0.5307 +17.92,0.5307 +17.925,0.53069 +17.93,0.53068 +17.935,0.53068 +17.94,0.53067 +17.945,0.53066 +17.95,0.53066 +17.955,0.53065 +17.96,0.53065 +17.965,0.53064 +17.97,0.53063 +17.975,0.53063 +17.98,0.53062 +17.985,0.53062 +17.99,0.53061 +17.995,0.5306 +18,0.5306 +18.005,0.53059 +18.01,0.53059 +18.015,0.53058 +18.02,0.53057 +18.025,0.53057 +18.03,0.53056 +18.035,0.53056 +18.04,0.53055 +18.045,0.53055 +18.05,0.53054 +18.055,0.53053 +18.06,0.53053 +18.065,0.53052 +18.07,0.53052 +18.075,0.53051 +18.08,0.5305 +18.085,0.5305 +18.09,0.53049 +18.095,0.53049 +18.1,0.53048 +18.105,0.53048 +18.11,0.53047 +18.115,0.53046 +18.12,0.53046 +18.125,0.53045 +18.13,0.53045 +18.135,0.53044 +18.14,0.53043 +18.145,0.53043 +18.15,0.53042 +18.155,0.53042 +18.16,0.53041 +18.165,0.53041 +18.17,0.5304 +18.175,0.5304 +18.18,0.53039 +18.185,0.53038 +18.19,0.53038 +18.195,0.53037 +18.2,0.53037 +18.205,0.53036 +18.21,0.53036 +18.215,0.53035 +18.22,0.53035 +18.225,0.53034 +18.23,0.53033 +18.235,0.53033 +18.24,0.53032 +18.245,0.53032 +18.25,0.53031 +18.255,0.53031 +18.26,0.5303 +18.265,0.5303 +18.27,0.53029 +18.275,0.53028 +18.28,0.53028 +18.285,0.53027 +18.29,0.53027 +18.295,0.53026 +18.3,0.53026 +18.305,0.53025 +18.31,0.53025 +18.315,0.53024 +18.32,0.53024 +18.325,0.53023 +18.33,0.53023 +18.335,0.53022 +18.34,0.53022 +18.345,0.53021 +18.35,0.53021 +18.355,0.5302 +18.36,0.53019 +18.365,0.53019 +18.37,0.53018 +18.375,0.53018 +18.38,0.53017 +18.385,0.53017 +18.39,0.53016 +18.395,0.53016 +18.4,0.53015 +18.405,0.53015 +18.41,0.53014 +18.415,0.53014 +18.42,0.53013 +18.425,0.53013 +18.43,0.53012 +18.435,0.53012 +18.44,0.53011 +18.445,0.53011 +18.45,0.5301 +18.455,0.5301 +18.46,0.53009 +18.465,0.53009 +18.47,0.53008 +18.475,0.53008 +18.48,0.53007 +18.485,0.53007 +18.49,0.53006 +18.495,0.53006 +18.5,0.53006 +18.505,0.53005 +18.51,0.53005 +18.515,0.53004 +18.52,0.53004 +18.525,0.53003 +18.53,0.53003 +18.535,0.53002 +18.54,0.53002 +18.545,0.53001 +18.55,0.53001 +18.555,0.53 +18.56,0.53 +18.565,0.52999 +18.57,0.52999 +18.575,0.52999 +18.58,0.52998 +18.585,0.52998 +18.59,0.52997 +18.595,0.52997 +18.6,0.52996 +18.605,0.52996 +18.61,0.52995 +18.615,0.52995 +18.62,0.52994 +18.625,0.52994 +18.63,0.52994 +18.635,0.52993 +18.64,0.52993 +18.645,0.52992 +18.65,0.52992 +18.655,0.52991 +18.66,0.52991 +18.665,0.52991 +18.67,0.5299 +18.675,0.5299 +18.68,0.52989 +18.685,0.52989 +18.69,0.52989 +18.695,0.52988 +18.7,0.52988 +18.705,0.52987 +18.71,0.52987 +18.715,0.52987 +18.72,0.52986 +18.725,0.52986 +18.73,0.52985 +18.735,0.52985 +18.74,0.52985 +18.745,0.52984 +18.75,0.52984 +18.755,0.52983 +18.76,0.52983 +18.765,0.52983 +18.77,0.52982 +18.775,0.52982 +18.78,0.52981 +18.785,0.52981 +18.79,0.52981 +18.795,0.5298 +18.8,0.5298 +18.805,0.5298 +18.81,0.52979 +18.815,0.52979 +18.82,0.52978 +18.825,0.52978 +18.83,0.52978 +18.835,0.52977 +18.84,0.52977 +18.845,0.52977 +18.85,0.52976 +18.855,0.52976 +18.86,0.52976 +18.865,0.52975 +18.87,0.52975 +18.875,0.52975 +18.88,0.52974 +18.885,0.52974 +18.89,0.52974 +18.895,0.52973 +18.9,0.52973 +18.905,0.52973 +18.91,0.52972 +18.915,0.52972 +18.92,0.52972 +18.925,0.52971 +18.93,0.52971 +18.935,0.52971 +18.94,0.5297 +18.945,0.5297 +18.95,0.5297 +18.955,0.52969 +18.96,0.52969 +18.965,0.52969 +18.97,0.52968 +18.975,0.52968 +18.98,0.52968 +18.985,0.52967 +18.99,0.52967 +18.995,0.52967 +19,0.52967 +19.005,0.52966 +19.01,0.52966 +19.015,0.52966 +19.02,0.52965 +19.025,0.52965 +19.03,0.52965 +19.035,0.52964 +19.04,0.52964 +19.045,0.52964 +19.05,0.52964 +19.055,0.52963 +19.06,0.52963 +19.065,0.52963 +19.07,0.52963 +19.075,0.52962 +19.08,0.52962 +19.085,0.52962 +19.09,0.52962 +19.095,0.52961 +19.1,0.52961 +19.105,0.52961 +19.11,0.5296 +19.115,0.5296 +19.12,0.5296 +19.125,0.5296 +19.13,0.52959 +19.135,0.52959 +19.14,0.52959 +19.145,0.52959 +19.15,0.52959 +19.155,0.52958 +19.16,0.52958 +19.165,0.52958 +19.17,0.52958 +19.175,0.52957 +19.18,0.52957 +19.185,0.52957 +19.19,0.52957 +19.195,0.52957 +19.2,0.52956 +19.205,0.52956 +19.21,0.52956 +19.215,0.52956 +19.22,0.52955 +19.225,0.52955 +19.23,0.52955 +19.235,0.52955 +19.24,0.52955 +19.245,0.52954 +19.25,0.52954 +19.255,0.52954 +19.26,0.52954 +19.265,0.52954 +19.27,0.52954 +19.275,0.52953 +19.28,0.52953 +19.285,0.52953 +19.29,0.52953 +19.295,0.52953 +19.3,0.52952 +19.305,0.52952 +19.31,0.52952 +19.315,0.52952 +19.32,0.52952 +19.325,0.52952 +19.33,0.52951 +19.335,0.52951 +19.34,0.52951 +19.345,0.52951 +19.35,0.52951 +19.355,0.52951 +19.36,0.52951 +19.365,0.5295 +19.37,0.5295 +19.375,0.5295 +19.38,0.5295 +19.385,0.5295 +19.39,0.5295 +19.395,0.5295 +19.4,0.52949 +19.405,0.52949 +19.41,0.52949 +19.415,0.52949 +19.42,0.52949 +19.425,0.52949 +19.43,0.52949 +19.435,0.52949 +19.44,0.52948 +19.445,0.52948 +19.45,0.52948 +19.455,0.52948 +19.46,0.52948 +19.465,0.52948 +19.47,0.52948 +19.475,0.52948 +19.48,0.52948 +19.485,0.52947 +19.49,0.52947 +19.495,0.52947 +19.5,0.52947 +19.505,0.52947 +19.51,0.52947 +19.515,0.52947 +19.52,0.52947 +19.525,0.52947 +19.53,0.52947 +19.535,0.52947 +19.54,0.52947 +19.545,0.52946 +19.55,0.52946 +19.555,0.52946 +19.56,0.52946 +19.565,0.52946 +19.57,0.52946 +19.575,0.52946 +19.58,0.52946 +19.585,0.52946 +19.59,0.52946 +19.595,0.52946 +19.6,0.52946 +19.605,0.52946 +19.61,0.52946 +19.615,0.52946 +19.62,0.52946 +19.625,0.52946 +19.63,0.52945 +19.635,0.52945 +19.64,0.52945 +19.645,0.52945 +19.65,0.52945 +19.655,0.52945 +19.66,0.52945 +19.665,0.52945 +19.67,0.52945 +19.675,0.52945 +19.68,0.52945 +19.685,0.52945 +19.69,0.52945 +19.695,0.52945 +19.7,0.52945 +19.705,0.52945 +19.71,0.52945 +19.715,0.52945 +19.72,0.52945 +19.725,0.52945 +19.73,0.52945 +19.735,0.52945 +19.74,0.52945 +19.745,0.52945 +19.75,0.52945 +19.755,0.52945 +19.76,0.52945 +19.765,0.52945 +19.77,0.52945 +19.775,0.52945 +19.78,0.52945 +19.785,0.52945 +19.79,0.52945 +19.795,0.52945 +19.8,0.52945 +19.805,0.52945 +19.81,0.52945 +19.815,0.52945 +19.82,0.52945 +19.825,0.52945 +19.83,0.52945 +19.835,0.52945 +19.84,0.52946 +19.845,0.52946 +19.85,0.52946 +19.855,0.52946 +19.86,0.52946 +19.865,0.52946 +19.87,0.52946 +19.875,0.52946 +19.88,0.52946 +19.885,0.52946 +19.89,0.52946 +19.895,0.52946 +19.9,0.52946 +19.905,0.52946 +19.91,0.52946 +19.915,0.52946 +19.92,0.52946 +19.925,0.52946 +19.93,0.52947 +19.935,0.52947 +19.94,0.52947 +19.945,0.52947 +19.95,0.52947 +19.955,0.52947 +19.96,0.52947 +19.965,0.52947 +19.97,0.52947 +19.975,0.52947 +19.98,0.52947 +19.985,0.52947 +19.99,0.52948 +19.995,0.52948 +20,0.52948 diff --git a/test/data_tests/ThreeBusPSCAD.raw b/test/data_tests/ThreeBusPSCAD.raw new file mode 100644 index 000000000..0b1d4bd5d --- /dev/null +++ b/test/data_tests/ThreeBusPSCAD.raw @@ -0,0 +1,33 @@ +0, 100, 33, 0, 0, 60 / 24-Apr-2020 19:28:39 - MATPOWER 7.0.1-dev + + + 101, 'BUS 1', 138, 3, 1, 1, 1, 1.02, 0, 1.1, 0.9, 1.1, 0.9 + 102, 'BUS 2', 138, 2, 1, 1, 1, 1.0142, 0, 1.1, 0.9, 1.1, 0.9 + 103, 'BUS 3', 138, 1, 1, 1, 1, 1.00, 0, 1.1, 0.9, 1.1, 0.9 +0 / END OF BUS DATA, BEGIN LOAD DATA + 103, 1, 1, 1, 1, 50, 5, 0, 0, 0, 0, 1, 1, 0 + 103, 2, 1, 1, 1, 50, 5, 0, 0, 0, 0, 1, 1, 0 +0 / END OF LOAD DATA, BEGIN FIXED SHUNT DATA +0 / END OF FIXED SHUNT DATA, BEGIN GENERATOR DATA + 101, 1, 50, 10, 100, -100, 1.02, 0, 100, 0, 1, 0, 0, 1, 1, 100, 318, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 + 102, 1, 50, 10, 100, -100, 1.0142, 0, 100, 0, 1, 0, 0, 1, 1, 100, 318, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 +0 / END OF GENERATOR DATA, BEGIN BRANCH DATA + 101, 103, 1, 0.01000, 0.12, 0.05, 250, 250, 250, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 + 101, 102, 1, 0.01000, 0.12, 0.05, 250, 250, 250, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 + 102, 103, 1, 0.01000, 0.12, 0.05, 250, 250, 250, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 +0 / END OF BRANCH DATA, BEGIN TRANSFORMER DATA +0 / END OF TRANSFORMER DATA, BEGIN AREA DATA +0 / END OF AREA DATA, BEGIN TWO-TERMINAL DC DATA +0 / END OF TWO-TERMINAL DC DATA, BEGIN VOLTAGE SOURCE CONVERTER DATA +0 / END OF VOLTAGE SOURCE CONVERTER DATA, BEGIN IMPEDANCE CORRECTION DATA +0 / END OF IMPEDANCE CORRECTION DATA, BEGIN MULTI-TERMINAL DC DATA +0 / END OF MULTI-TERMINAL DC DATA, BEGIN MULTI-SECTION LINE DATA +0 / END OF MULTI-SECTION LINE DATA, BEGIN ZONE DATA +0 / END OF ZONE DATA, BEGIN INTER-AREA TRANSFER DATA +0 / END OF INTER-AREA TRANSFER DATA, BEGIN OWNER DATA +0 / END OF OWNER DATA, BEGIN FACTS CONTROL DEVICE DATA +0 / END OF FACTS CONTROL DEVICE DATA, BEGIN SWITCHED SHUNT DATA +0 / END OF SWITCHED SHUNT DATA, BEGIN GNE DEVICE DATA +0 / END OF GNE DEVICE DATA, BEGIN INDUCTION MACHINE DATA +0 / END OF INDUCTION MACHINE DATA +Q diff --git a/test/data_tests/dynamic_test_data.jl b/test/data_tests/dynamic_test_data.jl index 20f90e124..801cb3a6a 100644 --- a/test/data_tests/dynamic_test_data.jl +++ b/test/data_tests/dynamic_test_data.jl @@ -52,6 +52,21 @@ machine_marconato() = MarconatoMachine( 0.0, ) #MVABase +machine_sauerpai() = SauerPaiMachine( + 0.002, # check + 1.79, #Xd + 1.71, #Xq + 0.169, #Xd_p + 0.228, #Xq_p + 0.135, #Xd_pp + 0.2, #Xq_pp + 0.13, #Xl + 4.3, #Td0_p + 0.85, #Tq0_p + 0.032, #Td0_pp + 0.05, #Tq0_pp +) #MVABase + machine_anderson() = AndersonFouadMachine( 0.0, #R 0.8979, #Xd diff --git a/test/data_tests/test45.jl b/test/data_tests/test45.jl new file mode 100644 index 000000000..160317101 --- /dev/null +++ b/test/data_tests/test45.jl @@ -0,0 +1,69 @@ +using PowerSystems +using NLsolve +const PSY = PowerSystems + +############### Data Network ######################## +include(joinpath(dirname(@__FILE__), "dynamic_test_data.jl")) +include(joinpath(dirname(@__FILE__), "data_utils.jl")) +############### Data Network ######################## +threebus_file_dir = joinpath(dirname(@__FILE__), "ThreeBusPSCAD.raw") +threebus_sys = System(threebus_file_dir, runchecks = false) + +function dyn_gen_sauerpai(generator) + return PSY.DynamicGenerator( + name = get_name(generator), #static generator + ω_ref = 1.0, # ω_ref + machine = machine_sauerpai(), #machine + shaft = shaft_no_damping(), #shaft + avr = avr_type1(), #avr + prime_mover = tg_none(), #tg + pss = pss_none(), + ) #pss +end +#= +function inv_darco(static_device) + return PSY.DynamicInverter( + get_name(static_device), + 1.0, #ω_ref + converter_low_power(), #converte + outer_control(), #outercontrol + inner_control(), #inner_control + dc_source_lv(), + pll(), + filt(), + ) #pss +end =# + +function inv_darco_droop(static_device) + return PSY.DynamicInverter( + get_name(static_device), + 1.0, #ω_ref + converter_low_power(), #converter + outer_control_droop(), #outercontrol + inner_control(), #inner_control + dc_source_lv(), + no_pll(), + filt(), + ) #pss +end + +for l in get_components(PSY.PowerLoad, threebus_sys) + PSY.set_model!(l, PSY.LoadModels.ConstantImpedance) +end + +for g in get_components(Generator, threebus_sys) + if get_number(get_bus(g)) == 101 + case_gen = dyn_gen_sauerpai(g) + add_component!(threebus_sys, case_gen, g) + elseif get_number(get_bus(g)) == 102 + case_gen = inv_darco_droop(g) + add_component!(threebus_sys, case_gen, g) + end +end + +for b in get_components(Line, threebus_sys) + if get_name(b) != "BUS 1-BUS 2-i_1" + dyn_branch = PowerSystems.DynamicBranch(b) + add_component!(threebus_sys, dyn_branch) + end +end diff --git a/test/results/results_initial_conditions.jl b/test/results/results_initial_conditions.jl index 952221daf..7e03762aa 100644 --- a/test/results/results_initial_conditions.jl +++ b/test/results/results_initial_conditions.jl @@ -1352,3 +1352,44 @@ test44_x0_init = Dict{String, Any}( 0.005106292260901783 ], ) + +test45_x0_init = Dict{String, Any}( + "V_R" => [ + 1.019999999999998 + 1.013582443120006 + 1.0058149732811905 + ], + "V_I" => [ + 3.3403893936518543e-16 + -0.03538744103229077 + 0.0130785869050527 + ], + "generator-102-1" => [ + -0.20953525878346027 + 0.992318807294552 + 1.1682067113460506 + 0.00881355042359892 + 1.18634848633647 + -0.04895789209557118 + 0.17320119808376772 + 1.0 + 2.265638576007125 + 0.32209253092671186 + -0.40781494368128257 + 1.0141999999920794 + ], + "generator-103-1" => [ + -0.2463927549545287 + 0.9752565919889967 + 1.033566471471254 + 0.010363864212683078 + 1.0395807833649011 + -0.05756964236105219 + 0.26046785111713866 + 1.0 + 1.3973840978933814 + 0.061844884998895185 + -0.25152913762080864 + 1.0058999999562952 + ], +) diff --git a/test/runtests.jl b/test/runtests.jl index b6726cac6..9cb689352 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,3 +1,5 @@ +using Revise +using Plots using PowerSimulationsDynamics using PowerSystems using Test diff --git a/test/test_case45_sauerpai.jl b/test/test_case45_sauerpai.jl new file mode 100644 index 000000000..86fe6ff84 --- /dev/null +++ b/test/test_case45_sauerpai.jl @@ -0,0 +1,151 @@ +""" +Case 45: +This case study a three bus system with 2 machines (Sauer Pai: 6th order model) and an infinite source. +The fault drop the connection between buses 1 and 3, eliminating the direct connection between the infinite source +and the generator located in bus 3. +""" + +################################################## +############### LOAD DATA ######################## +################################################## + +include(joinpath(TEST_FILES_DIR, "data_tests/test45.jl")) + +################################################## +############### SOLVE PROBLEM #################### +################################################## + +# Define Fault: Line trip +PSY.show_components(threebus_sys, Line) +perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") + +@testset "Test 45 SauerPai ResidualModel" begin + path = (joinpath(pwd(), "test-45")) + !isdir(path) && mkdir(path) + try + # Define Simulation Problem + sim = Simulation!( + ResidualModel, + threebus_sys, #system + path, + (0.0, 20.0), #time span + perturbation, #Type of Fault + ) #initial guess + dict_setpoints = get_setpoints(sim) + + for g in get_components(DynamicGenerator, threebus_sys) + display("Power setpoints") + display(get_P_ref(g)) + end + # Test Initial Condition + diff_val = [0.0] +#= res = get_init_values_for_comparison(sim) + for (k, v) in test45_x0_init + diff_val[1] += LinearAlgebra.norm(res[k] - v) + end =# + + #@test (diff_val[1] < 1e-3) + + # Obtain small signal results for initial conditions + small_sig = small_signal_analysis(sim) + eigs = small_sig.eigenvalues + @test small_sig.stable + + # Test Eigenvalues + #@test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 + + # Solve problem + @test execute!(sim, IDA(), dtmax = 0.005, saveat = 0.005) == + PSID.SIMULATION_FINALIZED + results = read_results(sim) + + # Obtain data for angles + series = get_voltage_magnitude_series(results, 101) + t = series[1] + V101 = series[2] + display(plot(t,V101)) + + # Should return zeros and a warning + series3 = get_field_current_series(results, "generator-102-1") + + # Obtain PSAT benchmark data + psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + t_psat, δ_psat = get_csv_delta(psat_csv) + + # Test Transient Simulation Results + @test LinearAlgebra.norm(t - t_psat) == 0.0 + # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + + power = PSID.get_activepower_series(results, "generator-102-1") + rpower = PSID.get_reactivepower_series(results, "generator-102-1") + @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + finally + @info("removing test files") + rm(path, force = true, recursive = true) + end +end + +@testset "Test 45 SauerPai MassMatrixModel" begin + path = (joinpath(pwd(), "test-45")) + !isdir(path) && mkdir(path) + try + # Define Simulation Problem + sim = Simulation!( + MassMatrixModel, + threebus_sys, #system, + path, + (0.0, 20.0), #time span + perturbation, #Type of Fault + ) #initial guess + + # Test Initial Condition + diff_val = [0.0] + res = get_init_values_for_comparison(sim) + for (k, v) in test45_x0_init + diff_val[1] += LinearAlgebra.norm(res[k] - v) + end + + @test (diff_val[1] < 1e-3) + + # Obtain small signal results for initial conditions + small_sig = small_signal_analysis(sim) + eigs = small_sig.eigenvalues + @test small_sig.stable + + # Test Eigenvalues + @test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 + + # Solve problem + @test execute!(sim, Rodas4(), dtmax = 0.005, saveat = 0.005) == + PSID.SIMULATION_FINALIZED + results = read_results(sim) + + # Obtain data for angles + series = get_state_series(results, ("generator-102-1", :δ)) + t = series[1] + δ = series[2] + + # Should return zeros and a warning + series3 = get_field_current_series(results, "generator-102-1") + + + # Obtain PSAT benchmark data + psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + t_psat, δ_psat = get_csv_delta(psat_csv) + + # Test Transient Simulation Results + @test LinearAlgebra.norm(t - t_psat) == 0.0 + @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + + power = PSID.get_activepower_series(results, "generator-102-1") + rpower = PSID.get_reactivepower_series(results, "generator-102-1") + @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + + finally + @info("removing test files") + rm(path, force = true, recursive = true) + end + +end From 635611810a4d4ab26df97d843c1c459698862e7b Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 15:54:41 -0700 Subject: [PATCH 02/12] update test name --- debug/dyn_data.dyr | 37 +++++++++ test/test_case45_sauerpai.jl | 151 ----------------------------------- 2 files changed, 37 insertions(+), 151 deletions(-) create mode 100644 debug/dyn_data.dyr delete mode 100644 test/test_case45_sauerpai.jl diff --git a/debug/dyn_data.dyr b/debug/dyn_data.dyr new file mode 100644 index 000000000..df058528a --- /dev/null +++ b/debug/dyn_data.dyr @@ -0,0 +1,37 @@ + 1 'GENROU' 1 7.4000 0.30000E-01 0.85000 0.33000E-01 + 5.1480 2.0000 0.89790 0.64600 0.30000 + 0.64600 0.23000 0.22000 0.10000E-01 1.0000 / + 1 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 + 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 + 1.0000 0.20000 0.38000 1.0000 3.1400 + 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / + 1 'GAST' 1 0.50000E-01 0.20000 0.20000 2.0000 + 1.0000 2.5000 1.1000 0.10000E-01 0.0000 / + 2 'GENROU' 1 6.1000 0.40000E-01 0.30000 0.99000E-01 + 6.5400 2.0000 1.0500 0.98000 0.18500 + 0.36000 0.13000 0.0000 0.10000E-01 1.0000 / + 2 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 + 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 + 1.0000 0.20000 0.38000 1.0000 3.1400 + 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / + 3 'GENROU' 1 6.1000 0.40000E-01 0.30000 0.99000E-01 + 6.5400 2.0000 1.0500 0.98000 0.18500 + 0.36000 0.13000 0.0000 0.10000 0.40000 / + 3 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 + 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 + 1.0000 0.20000 0.38000 1.0000 3.1400 + 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / + 6 'GENROU' 1 4.7500 0.60000E-01 1.5000 0.19000 + 5.0600 2.0000 1.2500 1.2200 0.23200 + 0.71500 0.12000 0.11000 0.10000 0.40000 / + 6 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 + 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 + 1.0000 0.20000 0.38000 1.0000 3.1400 + 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / + 8 'GENROU' 1 4.7500 0.60000E-01 1.5000 0.19000 + 5.0600 2.0000 1.2500 1.2200 0.23200 + 0.71500 0.12000 0.11000 0.10000 0.40000 / + 8 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 + 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 + 1.0000 0.20000 0.38000 1.0000 3.1400 + 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / diff --git a/test/test_case45_sauerpai.jl b/test/test_case45_sauerpai.jl deleted file mode 100644 index 86fe6ff84..000000000 --- a/test/test_case45_sauerpai.jl +++ /dev/null @@ -1,151 +0,0 @@ -""" -Case 45: -This case study a three bus system with 2 machines (Sauer Pai: 6th order model) and an infinite source. -The fault drop the connection between buses 1 and 3, eliminating the direct connection between the infinite source -and the generator located in bus 3. -""" - -################################################## -############### LOAD DATA ######################## -################################################## - -include(joinpath(TEST_FILES_DIR, "data_tests/test45.jl")) - -################################################## -############### SOLVE PROBLEM #################### -################################################## - -# Define Fault: Line trip -PSY.show_components(threebus_sys, Line) -perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") - -@testset "Test 45 SauerPai ResidualModel" begin - path = (joinpath(pwd(), "test-45")) - !isdir(path) && mkdir(path) - try - # Define Simulation Problem - sim = Simulation!( - ResidualModel, - threebus_sys, #system - path, - (0.0, 20.0), #time span - perturbation, #Type of Fault - ) #initial guess - dict_setpoints = get_setpoints(sim) - - for g in get_components(DynamicGenerator, threebus_sys) - display("Power setpoints") - display(get_P_ref(g)) - end - # Test Initial Condition - diff_val = [0.0] -#= res = get_init_values_for_comparison(sim) - for (k, v) in test45_x0_init - diff_val[1] += LinearAlgebra.norm(res[k] - v) - end =# - - #@test (diff_val[1] < 1e-3) - - # Obtain small signal results for initial conditions - small_sig = small_signal_analysis(sim) - eigs = small_sig.eigenvalues - @test small_sig.stable - - # Test Eigenvalues - #@test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 - - # Solve problem - @test execute!(sim, IDA(), dtmax = 0.005, saveat = 0.005) == - PSID.SIMULATION_FINALIZED - results = read_results(sim) - - # Obtain data for angles - series = get_voltage_magnitude_series(results, 101) - t = series[1] - V101 = series[2] - display(plot(t,V101)) - - # Should return zeros and a warning - series3 = get_field_current_series(results, "generator-102-1") - - # Obtain PSAT benchmark data - psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") - t_psat, δ_psat = get_csv_delta(psat_csv) - - # Test Transient Simulation Results - @test LinearAlgebra.norm(t - t_psat) == 0.0 - # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 - - power = PSID.get_activepower_series(results, "generator-102-1") - rpower = PSID.get_reactivepower_series(results, "generator-102-1") - @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) - @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) - finally - @info("removing test files") - rm(path, force = true, recursive = true) - end -end - -@testset "Test 45 SauerPai MassMatrixModel" begin - path = (joinpath(pwd(), "test-45")) - !isdir(path) && mkdir(path) - try - # Define Simulation Problem - sim = Simulation!( - MassMatrixModel, - threebus_sys, #system, - path, - (0.0, 20.0), #time span - perturbation, #Type of Fault - ) #initial guess - - # Test Initial Condition - diff_val = [0.0] - res = get_init_values_for_comparison(sim) - for (k, v) in test45_x0_init - diff_val[1] += LinearAlgebra.norm(res[k] - v) - end - - @test (diff_val[1] < 1e-3) - - # Obtain small signal results for initial conditions - small_sig = small_signal_analysis(sim) - eigs = small_sig.eigenvalues - @test small_sig.stable - - # Test Eigenvalues - @test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 - - # Solve problem - @test execute!(sim, Rodas4(), dtmax = 0.005, saveat = 0.005) == - PSID.SIMULATION_FINALIZED - results = read_results(sim) - - # Obtain data for angles - series = get_state_series(results, ("generator-102-1", :δ)) - t = series[1] - δ = series[2] - - # Should return zeros and a warning - series3 = get_field_current_series(results, "generator-102-1") - - - # Obtain PSAT benchmark data - psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") - t_psat, δ_psat = get_csv_delta(psat_csv) - - # Test Transient Simulation Results - @test LinearAlgebra.norm(t - t_psat) == 0.0 - @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 - - power = PSID.get_activepower_series(results, "generator-102-1") - rpower = PSID.get_reactivepower_series(results, "generator-102-1") - @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) - @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) - - finally - @info("removing test files") - rm(path, force = true, recursive = true) - end - -end From 441beede0284fc0f047c0d14989b46e4de0ab115 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 15:55:00 -0700 Subject: [PATCH 03/12] update test name sauer pai --- test/x_test_case45_sauerpai.jl | 151 +++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 test/x_test_case45_sauerpai.jl diff --git a/test/x_test_case45_sauerpai.jl b/test/x_test_case45_sauerpai.jl new file mode 100644 index 000000000..86fe6ff84 --- /dev/null +++ b/test/x_test_case45_sauerpai.jl @@ -0,0 +1,151 @@ +""" +Case 45: +This case study a three bus system with 2 machines (Sauer Pai: 6th order model) and an infinite source. +The fault drop the connection between buses 1 and 3, eliminating the direct connection between the infinite source +and the generator located in bus 3. +""" + +################################################## +############### LOAD DATA ######################## +################################################## + +include(joinpath(TEST_FILES_DIR, "data_tests/test45.jl")) + +################################################## +############### SOLVE PROBLEM #################### +################################################## + +# Define Fault: Line trip +PSY.show_components(threebus_sys, Line) +perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") + +@testset "Test 45 SauerPai ResidualModel" begin + path = (joinpath(pwd(), "test-45")) + !isdir(path) && mkdir(path) + try + # Define Simulation Problem + sim = Simulation!( + ResidualModel, + threebus_sys, #system + path, + (0.0, 20.0), #time span + perturbation, #Type of Fault + ) #initial guess + dict_setpoints = get_setpoints(sim) + + for g in get_components(DynamicGenerator, threebus_sys) + display("Power setpoints") + display(get_P_ref(g)) + end + # Test Initial Condition + diff_val = [0.0] +#= res = get_init_values_for_comparison(sim) + for (k, v) in test45_x0_init + diff_val[1] += LinearAlgebra.norm(res[k] - v) + end =# + + #@test (diff_val[1] < 1e-3) + + # Obtain small signal results for initial conditions + small_sig = small_signal_analysis(sim) + eigs = small_sig.eigenvalues + @test small_sig.stable + + # Test Eigenvalues + #@test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 + + # Solve problem + @test execute!(sim, IDA(), dtmax = 0.005, saveat = 0.005) == + PSID.SIMULATION_FINALIZED + results = read_results(sim) + + # Obtain data for angles + series = get_voltage_magnitude_series(results, 101) + t = series[1] + V101 = series[2] + display(plot(t,V101)) + + # Should return zeros and a warning + series3 = get_field_current_series(results, "generator-102-1") + + # Obtain PSAT benchmark data + psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + t_psat, δ_psat = get_csv_delta(psat_csv) + + # Test Transient Simulation Results + @test LinearAlgebra.norm(t - t_psat) == 0.0 + # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + + power = PSID.get_activepower_series(results, "generator-102-1") + rpower = PSID.get_reactivepower_series(results, "generator-102-1") + @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + finally + @info("removing test files") + rm(path, force = true, recursive = true) + end +end + +@testset "Test 45 SauerPai MassMatrixModel" begin + path = (joinpath(pwd(), "test-45")) + !isdir(path) && mkdir(path) + try + # Define Simulation Problem + sim = Simulation!( + MassMatrixModel, + threebus_sys, #system, + path, + (0.0, 20.0), #time span + perturbation, #Type of Fault + ) #initial guess + + # Test Initial Condition + diff_val = [0.0] + res = get_init_values_for_comparison(sim) + for (k, v) in test45_x0_init + diff_val[1] += LinearAlgebra.norm(res[k] - v) + end + + @test (diff_val[1] < 1e-3) + + # Obtain small signal results for initial conditions + small_sig = small_signal_analysis(sim) + eigs = small_sig.eigenvalues + @test small_sig.stable + + # Test Eigenvalues + @test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 + + # Solve problem + @test execute!(sim, Rodas4(), dtmax = 0.005, saveat = 0.005) == + PSID.SIMULATION_FINALIZED + results = read_results(sim) + + # Obtain data for angles + series = get_state_series(results, ("generator-102-1", :δ)) + t = series[1] + δ = series[2] + + # Should return zeros and a warning + series3 = get_field_current_series(results, "generator-102-1") + + + # Obtain PSAT benchmark data + psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + t_psat, δ_psat = get_csv_delta(psat_csv) + + # Test Transient Simulation Results + @test LinearAlgebra.norm(t - t_psat) == 0.0 + @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + + power = PSID.get_activepower_series(results, "generator-102-1") + rpower = PSID.get_reactivepower_series(results, "generator-102-1") + @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + + finally + @info("removing test files") + rm(path, force = true, recursive = true) + end + +end From af78f89c4ec0cb48c56bc0b7bb77ed80635ed0c5 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:14:46 -0700 Subject: [PATCH 04/12] add load model output current dispatch --- src/base/simulation_results.jl | 6 +- src/post_processing/post_proc_loads.jl | 82 ++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/base/simulation_results.jl b/src/base/simulation_results.jl index 40387c675..7f67054ca 100644 --- a/src/base/simulation_results.jl +++ b/src/base/simulation_results.jl @@ -81,7 +81,11 @@ function post_proc_voltage_current_series( bus_ix = get(bus_lookup, PSY.get_number(PSY.get_bus(device)), -1) ts, V_R, V_I = post_proc_voltage_series(solution, bus_ix, n_buses, dt) dyn_device = PSY.get_dynamic_injector(device) - _, I_R, I_I = compute_output_current(res, dyn_device, V_R, V_I, dt) + if isnothing(dyn_device) + _, I_R, I_I = compute_output_current(res, device, V_R, V_I, dt) + else + _, I_R, I_I = compute_output_current(res, dyn_device, V_R, V_I, dt) + end return ts, V_R, V_I, I_R, I_I end diff --git a/src/post_processing/post_proc_loads.jl b/src/post_processing/post_proc_loads.jl index 7c3bf99f7..934a259f3 100644 --- a/src/post_processing/post_proc_loads.jl +++ b/src/post_processing/post_proc_loads.jl @@ -102,3 +102,85 @@ function compute_output_current( return ts, I_R, I_I end + +""" +Function to obtain the output current time series of a PowerLoad model. + +""" +function compute_output_current( + res::SimulationResults, + device::PSY.PowerLoad, + V_R::Vector{Float64}, + V_I::Vector{Float64}, + dt::Union{Nothing, Float64}, +) + #TODO: We should dispatch this using the ZipLoad model that we have, but that would + # require to properly have access to it in the SimResults. + #TODO: Load is assumed to be connected. We need proper ways of keep tracking when + # something is disconnected + solution = res.solution + if dt === nothing + ix_t = unique(i -> solution.t[i], eachindex(solution.t)) + ts = solution.t[ix_t] + else + ts = range(0, stop = solution.t[end], step = dt) + end + + V0 = sqrt(V_R[1]^2 + V_I[1]^2) + V_mag = sqrt.(V_R .^ 2 + V_I .^ 2) + P = PSY.get_active_power(device) + Q = PSY.get_reactive_power(device) + I_R = similar(V_mag) + I_I = similar(V_mag) + + if PSY.get_model(device) == PSY.LoadModels.ConstantImpedance + I_R = (1.0 / V0)^2 .* (P .* V_R + Q .* V_I) + I_I = (1.0 / V0)^2 .* (P .* V_I - Q .* V_R) + elseif PSY.get_model(device) == PSY.LoadModels.ConstantCurrent + I_R = (1.0 / V0) .* (P .* V_R + Q .* V_I) ./ V_mag + I_I = (1.0 / V0) .* (P .* V_I - Q .* V_R) ./ V_mag + elseif PSY.get_model(device) == PSY.LoadModels.ConstantPower + I_R = (P .* V_R + Q .* V_I) ./ V_mag .^ 2 + I_I = (P .* V_I - Q .* V_R) ./ V_mag .^ 2 + else + @error("Load Model not supported. Returning zeros") + end + return ts, I_R, I_I +end + +""" +Function to obtain the output current time series of a ExponentialLoad model. + +""" +function compute_output_current( + res::SimulationResults, + device::PSY.ExponentialLoad, + V_R::Vector{Float64}, + V_I::Vector{Float64}, + dt::Union{Nothing, Float64}, +) + #TODO: We should dispatch this using the ZipLoad model that we have, but that would + # require to properly have access to it in the SimResults. + #TODO: Load is assumed to be connected. We need proper ways of keep tracking when + # something is disconnected + solution = res.solution + if dt === nothing + ix_t = unique(i -> solution.t[i], eachindex(solution.t)) + ts = solution.t[ix_t] + else + ts = range(0, stop = solution.t[end], step = dt) + end + + V0 = sqrt(V_R[1]^2 + V_I[1]^2) + V_mag = sqrt.(V_R .^ 2 + V_I .^ 2) + P = PSY.get_active_power(device) + Q = PSY.get_reactive_power(device) + α = PSY.get_active_power_coefficient(device) + β = PSY.get_reactive_power_coefficient(device) + + I_R = + P .* V_R .* (V_mag .^ (α - 2.0) ./ V0^α) + Q .* V_I .* (V_mag .^ (β - 2.0) ./ V0^β) + I_I = + P .* V_I .* (V_mag .^ (α - 2.0) ./ V0^α) - Q .* V_R .* (V_mag .^ (β - 2.0) ./ V0^β) + return ts, I_R, I_I +end From 2f7d323dfd7f6bd730f0a005d57e71f16c8b5b0d Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:14:57 -0700 Subject: [PATCH 05/12] add sauer pai output current post proc --- src/post_processing/post_proc_generator.jl | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/post_processing/post_proc_generator.jl b/src/post_processing/post_proc_generator.jl index 7f0f34ad0..8a13c1675 100644 --- a/src/post_processing/post_proc_generator.jl +++ b/src/post_processing/post_proc_generator.jl @@ -235,6 +235,48 @@ function _machine_current( return ts, I_R, I_I end +""" +Function to obtain the output current time series of a SauerPaiMachine model out of the DAE Solution. It is dispatched via the machine type. +""" +function _machine_current( + machine::PSY.SauerPaiMachine, + name::String, + ::Vector{Float64}, + ::Vector{Float64}, + base_power_ratio::Float64, + res::SimulationResults, + dt::Union{Nothing, Float64}, +) + ts, δ = post_proc_state_series(res, (name, :δ), dt) + _, eq_p = post_proc_state_series(res, (name, :eq_p), dt) + _, ed_p = post_proc_state_series(res, (name, :ed_p), dt) + _, ψd = post_proc_state_series(res, (name, :ψd), dt) + _, ψq = post_proc_state_series(res, (name, :ψq), dt) + _, ψd_pp = post_proc_state_series(res, (name, :ψd_pp), dt) + _, ψq_pp = post_proc_state_series(res, (name, :ψq_pp), dt) + + #Get parameters + Xd_pp = PSY.get_Xd_pp(machine) + Xq_pp = PSY.get_Xq_pp(machine) + γ_d1 = PSY.get_γ_d1(machine) + γ_q1 = PSY.get_γ_q1(machine) + + i_dq = Vector{Float64}(undef, 2) + I_R = similar(δ, Float64) + I_I = similar(δ, Float64) + + for ix in 1:length(δ) + v = δ[ix] + + #Obtain electric current + i_dq[1] = (1.0 / Xd_pp) * (γ_d1 * eq_p[ix] - ψd[ix] + (1 - γ_d1) * ψd_pp[ix]) #15.15 + i_dq[2] = (1.0 / Xq_pp) * (-γ_q1 * ed_p[ix] - ψq[ix] + (1 - γ_q1) * ψq_pp[ix]) #15.15 + + I_R[ix], I_I[ix] = base_power_ratio * dq_ri(v) * i_dq + end + return ts, I_R, I_I +end + """ Function to obtain the output current time series of a GENROU/GENROE model out of the DAE Solution. It is dispatched via the machine type. """ From 5b5881b315652aa82e3f9f373a8045db2d4806f8 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:15:12 -0700 Subject: [PATCH 06/12] formatting --- .../generator_components/init_machine.jl | 6 ++++-- src/models/generator_models/machine_models.jl | 16 ++++++++-------- test/runtests.jl | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/initialization/generator_components/init_machine.jl b/src/initialization/generator_components/init_machine.jl index 3ebffed14..9654ce04f 100644 --- a/src/initialization/generator_components/init_machine.jl +++ b/src/initialization/generator_components/init_machine.jl @@ -213,8 +213,10 @@ function initialize_mach_shaft!( out[3] = Q0 - (V_dq[2] * i_d - V_dq[1] * i_q) #Output Reactive Power out[4] = R * i_q - ω0 * ψd + V_dq[2] #15.9 ψq out[5] = R * i_d + ω0 * ψq + V_dq[1] #15.9 ψd - out[6] = -eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 -γ_d1) * i_d + γ_d2 * eq_p) + Vf0 #15.13 - out[7] = -ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 -γ_q1) * i_q - γ_d2 * ed_p) #15.13 + out[6] = + -eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 - γ_d1) * i_d + γ_d2 * eq_p) + + Vf0 #15.13 + out[7] = -ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 - γ_q1) * i_q - γ_d2 * ed_p) #15.13 out[8] = -ψd_pp + eq_p - (Xd_p - Xl) * i_d #15.13 out[9] = -ψq_pp - ed_p - (Xq_p - Xl) * i_q #15.13 end diff --git a/src/models/generator_models/machine_models.jl b/src/models/generator_models/machine_models.jl index 775052b6e..c8cac83e3 100644 --- a/src/models/generator_models/machine_models.jl +++ b/src/models/generator_models/machine_models.jl @@ -178,7 +178,7 @@ function mdl_machine_ode!( γ_d2 = PSY.get_γ_d2(machine) γ_q2 = PSY.get_γ_q2(machine) basepower = PSY.get_base_power(dynamic_device) -`` + `` #RI to dq transformation V_dq = ri_dq(δ) * [V_tR; V_tI] @@ -191,13 +191,13 @@ function mdl_machine_ode!( output_ode[local_ix[1]] = 2 * π * f0 * (R * i_q - ω * ψd + V_dq[2]) #15.9 ψq output_ode[local_ix[2]] = 2 * π * f0 * (R * i_d + ω * ψq + V_dq[1]) #15.9 ψd output_ode[local_ix[3]] = - (1.0 / Td0_p) * (-eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 -γ_d1) * i_d + γ_d2 * eq_p) + Vf) #15.13 eq_p - output_ode[local_ix[4]] = - (1.0 / Tq0_p) * (-ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 -γ_q1) * i_q - γ_d2 * ed_p)) #15.13 ed_p - output_ode[local_ix[5]] = - (1.0 / Td0_pp) * (-ψd_pp + eq_p - (Xd_p - Xl) * i_d) #15.13 ψd_pp - output_ode[local_ix[6]] = - (1.0 / Tq0_pp) * (-ψq_pp - ed_p - (Xq_p - Xl) * i_q) #15.13 ψq_pp + (1.0 / Td0_p) * + (-eq_p - (Xd - Xd_p) * (i_d - γ_d2 * ψd_pp - (1 - γ_d1) * i_d + γ_d2 * eq_p) + Vf) #15.13 eq_p + output_ode[local_ix[4]] = + (1.0 / Tq0_p) * + (-ed_p + (Xq - Xq_p) * (i_q - γ_q2 * ψq_pp - (1 - γ_q1) * i_q - γ_d2 * ed_p)) #15.13 ed_p + output_ode[local_ix[5]] = (1.0 / Td0_pp) * (-ψd_pp + eq_p - (Xd_p - Xl) * i_d) #15.13 ψd_pp + output_ode[local_ix[6]] = (1.0 / Tq0_pp) * (-ψq_pp - ed_p - (Xq_p - Xl) * i_q) #15.13 ψq_pp #Update inner_vars inner_vars[τe_var] = τ_e diff --git a/test/runtests.jl b/test/runtests.jl index 9cb689352..2ed530b66 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,4 @@ -using Revise +using Revise using Plots using PowerSimulationsDynamics using PowerSystems From 7589330d79659b287b6b853fe042d0d2df45da6e Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:15:28 -0700 Subject: [PATCH 07/12] add TODO test for power load --- test/test_case33_zip_load.jl | 3 +++ test/test_case34_exp_load.jl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/test/test_case33_zip_load.jl b/test/test_case33_zip_load.jl index 7f2053f16..5584f31ff 100644 --- a/test/test_case33_zip_load.jl +++ b/test/test_case33_zip_load.jl @@ -73,6 +73,9 @@ function test_zipload_implicit(csv_file, eigs_value, load_model) v2_psse = M[:, 2] v3_psse = M[:, 4] + #TODO: Test for LoadPower + p = get_activepower_series(results, "load1031") + # Test Transient Simulation Results @test LinearAlgebra.norm(v2_psid - v2_psse, Inf) <= 5e-2 @test LinearAlgebra.norm(v3_psid - v3_psse, Inf) <= 5e-2 diff --git a/test/test_case34_exp_load.jl b/test/test_case34_exp_load.jl index d6b79cb6a..3de9e32c4 100644 --- a/test/test_case34_exp_load.jl +++ b/test/test_case34_exp_load.jl @@ -80,6 +80,9 @@ end _, v103_power = get_voltage_magnitude_series(results_power, 103) _, v103_exp = get_voltage_magnitude_series(results_exp, 103) + #TODO: Test for LoadPower + p = get_activepower_series(results_exp, "load1031") + # Test Transient Simulation Results @test LinearAlgebra.norm(v102_power - v102_exp, Inf) <= 1e-3 @test LinearAlgebra.norm(v103_power - v103_exp, Inf) <= 1e-3 From 632a52f70b7a752d57f02050708bfbc57a2e62a7 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:15:34 -0700 Subject: [PATCH 08/12] more format --- test/data_tests/test45.jl | 8 ++++---- test/x_test_case45_sauerpai.jl | 24 +++++++++++------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/test/data_tests/test45.jl b/test/data_tests/test45.jl index 160317101..6ac4f193e 100644 --- a/test/data_tests/test45.jl +++ b/test/data_tests/test45.jl @@ -6,7 +6,7 @@ const PSY = PowerSystems include(joinpath(dirname(@__FILE__), "dynamic_test_data.jl")) include(joinpath(dirname(@__FILE__), "data_utils.jl")) ############### Data Network ######################## -threebus_file_dir = joinpath(dirname(@__FILE__), "ThreeBusPSCAD.raw") +threebus_file_dir = joinpath(dirname(@__FILE__), "ThreeBusPSCAD.raw") threebus_sys = System(threebus_file_dir, runchecks = false) function dyn_gen_sauerpai(generator) @@ -64,6 +64,6 @@ end for b in get_components(Line, threebus_sys) if get_name(b) != "BUS 1-BUS 2-i_1" dyn_branch = PowerSystems.DynamicBranch(b) - add_component!(threebus_sys, dyn_branch) - end -end + add_component!(threebus_sys, dyn_branch) + end +end diff --git a/test/x_test_case45_sauerpai.jl b/test/x_test_case45_sauerpai.jl index 86fe6ff84..813595486 100644 --- a/test/x_test_case45_sauerpai.jl +++ b/test/x_test_case45_sauerpai.jl @@ -17,7 +17,7 @@ include(joinpath(TEST_FILES_DIR, "data_tests/test45.jl")) # Define Fault: Line trip PSY.show_components(threebus_sys, Line) -perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") +perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") @testset "Test 45 SauerPai ResidualModel" begin path = (joinpath(pwd(), "test-45")) @@ -36,13 +36,13 @@ perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") for g in get_components(DynamicGenerator, threebus_sys) display("Power setpoints") display(get_P_ref(g)) - end + end # Test Initial Condition diff_val = [0.0] -#= res = get_init_values_for_comparison(sim) - for (k, v) in test45_x0_init - diff_val[1] += LinearAlgebra.norm(res[k] - v) - end =# + #= res = get_init_values_for_comparison(sim) + for (k, v) in test45_x0_init + diff_val[1] += LinearAlgebra.norm(res[k] - v) + end =# #@test (diff_val[1] < 1e-3) @@ -63,18 +63,18 @@ perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") series = get_voltage_magnitude_series(results, 101) t = series[1] V101 = series[2] - display(plot(t,V101)) - + display(plot(t, V101)) + # Should return zeros and a warning series3 = get_field_current_series(results, "generator-102-1") - + # Obtain PSAT benchmark data psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") t_psat, δ_psat = get_csv_delta(psat_csv) # Test Transient Simulation Results @test LinearAlgebra.norm(t - t_psat) == 0.0 - # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 power = PSID.get_activepower_series(results, "generator-102-1") rpower = PSID.get_reactivepower_series(results, "generator-102-1") @@ -128,8 +128,7 @@ end # Should return zeros and a warning series3 = get_field_current_series(results, "generator-102-1") - - + # Obtain PSAT benchmark data psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") t_psat, δ_psat = get_csv_delta(psat_csv) @@ -147,5 +146,4 @@ end @info("removing test files") rm(path, force = true, recursive = true) end - end From 6d90dc696e281f943fd42aa3f5372aeed60d35c4 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:37:10 -0700 Subject: [PATCH 09/12] delete wrong file --- debug/dyn_data.dyr | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 debug/dyn_data.dyr diff --git a/debug/dyn_data.dyr b/debug/dyn_data.dyr deleted file mode 100644 index df058528a..000000000 --- a/debug/dyn_data.dyr +++ /dev/null @@ -1,37 +0,0 @@ - 1 'GENROU' 1 7.4000 0.30000E-01 0.85000 0.33000E-01 - 5.1480 2.0000 0.89790 0.64600 0.30000 - 0.64600 0.23000 0.22000 0.10000E-01 1.0000 / - 1 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 - 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 - 1.0000 0.20000 0.38000 1.0000 3.1400 - 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / - 1 'GAST' 1 0.50000E-01 0.20000 0.20000 2.0000 - 1.0000 2.5000 1.1000 0.10000E-01 0.0000 / - 2 'GENROU' 1 6.1000 0.40000E-01 0.30000 0.99000E-01 - 6.5400 2.0000 1.0500 0.98000 0.18500 - 0.36000 0.13000 0.0000 0.10000E-01 1.0000 / - 2 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 - 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 - 1.0000 0.20000 0.38000 1.0000 3.1400 - 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / - 3 'GENROU' 1 6.1000 0.40000E-01 0.30000 0.99000E-01 - 6.5400 2.0000 1.0500 0.98000 0.18500 - 0.36000 0.13000 0.0000 0.10000 0.40000 / - 3 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 - 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 - 1.0000 0.20000 0.38000 1.0000 3.1400 - 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / - 6 'GENROU' 1 4.7500 0.60000E-01 1.5000 0.19000 - 5.0600 2.0000 1.2500 1.2200 0.23200 - 0.71500 0.12000 0.11000 0.10000 0.40000 / - 6 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 - 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 - 1.0000 0.20000 0.38000 1.0000 3.1400 - 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / - 8 'GENROU' 1 4.7500 0.60000E-01 1.5000 0.19000 - 5.0600 2.0000 1.2500 1.2200 0.23200 - 0.71500 0.12000 0.11000 0.10000 0.40000 / - 8 'ESAC1A' 1 0.10000E-02 0.20000 0.10000E-02 400.00 - 0.20000E-01 10.000 -10.000 0.80000 0.30000E-01 - 1.0000 0.20000 0.38000 1.0000 3.1400 - 0.30000E-01 4.1800 0.10000 7.3200 -7.3200 / From 962360e082fcc857456ec872cb15efe24236b8ae Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:38:55 -0700 Subject: [PATCH 10/12] remove plot from test toml --- test/Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Project.toml b/test/Project.toml index f4b5b8a2d..1bedd44ad 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -9,7 +9,6 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PowerFlows = "94fada2c-fd9a-4e89-8d82-81405f5cb4f6" PowerSimulationsDynamics = "398b2ede-47ed-4edc-b52e-69e4a48b4336" PowerSystems = "bcd98974-b02a-5e2f-9ee0-a103f5c450dd" From 727c17c53b15b090fe1e6490f29f35c37c6a2442 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Tue, 4 Oct 2022 17:52:54 -0700 Subject: [PATCH 11/12] rm using Plots --- test/runtests.jl | 1 - test/x_test_case45_sauerpai.jl | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 2ed530b66..9dedfa350 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,5 +1,4 @@ using Revise -using Plots using PowerSimulationsDynamics using PowerSystems using Test diff --git a/test/x_test_case45_sauerpai.jl b/test/x_test_case45_sauerpai.jl index 813595486..ff5bdddae 100644 --- a/test/x_test_case45_sauerpai.jl +++ b/test/x_test_case45_sauerpai.jl @@ -63,7 +63,7 @@ perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") series = get_voltage_magnitude_series(results, 101) t = series[1] V101 = series[2] - display(plot(t, V101)) + #display(plot(t, V101)) # Should return zeros and a warning series3 = get_field_current_series(results, "generator-102-1") From debe168a41d5b3e438e0519e9b8877765d62ad40 Mon Sep 17 00:00:00 2001 From: Rodrigo Henriquez Date: Wed, 5 Oct 2022 16:05:34 -0700 Subject: [PATCH 12/12] add test45 init model --- ...45_sauerpai.jl => test_case45_sauerpai.jl} | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) rename test/{x_test_case45_sauerpai.jl => test_case45_sauerpai.jl} (74%) diff --git a/test/x_test_case45_sauerpai.jl b/test/test_case45_sauerpai.jl similarity index 74% rename from test/x_test_case45_sauerpai.jl rename to test/test_case45_sauerpai.jl index ff5bdddae..4a21d6edb 100644 --- a/test/x_test_case45_sauerpai.jl +++ b/test/test_case45_sauerpai.jl @@ -16,7 +16,7 @@ include(joinpath(TEST_FILES_DIR, "data_tests/test45.jl")) ################################################## # Define Fault: Line trip -PSY.show_components(threebus_sys, Line) +#PSY.show_components(threebus_sys, Line) perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") @testset "Test 45 SauerPai ResidualModel" begin @@ -33,10 +33,10 @@ perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") ) #initial guess dict_setpoints = get_setpoints(sim) - for g in get_components(DynamicGenerator, threebus_sys) - display("Power setpoints") - display(get_P_ref(g)) - end + #for g in get_components(DynamicGenerator, threebus_sys) + # display("Power setpoints") + # display(get_P_ref(g)) + #end # Test Initial Condition diff_val = [0.0] #= res = get_init_values_for_comparison(sim) @@ -63,23 +63,23 @@ perturbation = BranchTrip(1.0, Line, "BUS 1-BUS 2-i_1") series = get_voltage_magnitude_series(results, 101) t = series[1] V101 = series[2] - #display(plot(t, V101)) # Should return zeros and a warning - series3 = get_field_current_series(results, "generator-102-1") + series3 = get_field_current_series(results, "generator-101-1") + # TODO Testing: # Obtain PSAT benchmark data - psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") - t_psat, δ_psat = get_csv_delta(psat_csv) + #psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + #t_psat, δ_psat = get_csv_delta(psat_csv) # Test Transient Simulation Results - @test LinearAlgebra.norm(t - t_psat) == 0.0 + #@test LinearAlgebra.norm(t - t_psat) == 0.0 # @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 - power = PSID.get_activepower_series(results, "generator-102-1") - rpower = PSID.get_reactivepower_series(results, "generator-102-1") - @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) - @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + power = PSID.get_activepower_series(results, "generator-101-1") + rpower = PSID.get_reactivepower_series(results, "generator-101-1") + #@test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + #@test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) finally @info("removing test files") rm(path, force = true, recursive = true) @@ -101,12 +101,12 @@ end # Test Initial Condition diff_val = [0.0] - res = get_init_values_for_comparison(sim) - for (k, v) in test45_x0_init - diff_val[1] += LinearAlgebra.norm(res[k] - v) - end + #res = get_init_values_for_comparison(sim) + #for (k, v) in test45_x0_init + # diff_val[1] += LinearAlgebra.norm(res[k] - v) + #end - @test (diff_val[1] < 1e-3) + #@test (diff_val[1] < 1e-3) # Obtain small signal results for initial conditions small_sig = small_signal_analysis(sim) @@ -114,7 +114,7 @@ end @test small_sig.stable # Test Eigenvalues - @test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 + #@test LinearAlgebra.norm(eigs - test45_eigvals) < 1e-3 # Solve problem @test execute!(sim, Rodas4(), dtmax = 0.005, saveat = 0.005) == @@ -122,25 +122,25 @@ end results = read_results(sim) # Obtain data for angles - series = get_state_series(results, ("generator-102-1", :δ)) + series = get_state_series(results, ("generator-101-1", :δ)) t = series[1] δ = series[2] # Should return zeros and a warning - series3 = get_field_current_series(results, "generator-102-1") + series3 = get_field_current_series(results, "generator-101-1") # Obtain PSAT benchmark data - psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") - t_psat, δ_psat = get_csv_delta(psat_csv) + #psat_csv = joinpath(TEST_FILES_DIR, "benchmarks/psat/Test45/Test45_delta.csv") + #t_psat, δ_psat = get_csv_delta(psat_csv) # Test Transient Simulation Results - @test LinearAlgebra.norm(t - t_psat) == 0.0 - @test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 + #@test LinearAlgebra.norm(t - t_psat) == 0.0 + #@test LinearAlgebra.norm(δ - δ_psat, Inf) <= 1e-3 - power = PSID.get_activepower_series(results, "generator-102-1") - rpower = PSID.get_reactivepower_series(results, "generator-102-1") - @test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) - @test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) + power = PSID.get_activepower_series(results, "generator-101-1") + rpower = PSID.get_reactivepower_series(results, "generator-101-1") + #@test isa(power, Tuple{Vector{Float64}, Vector{Float64}}) + #@test isa(rpower, Tuple{Vector{Float64}, Vector{Float64}}) finally @info("removing test files")