From 860af604797d5272bcbf30b0f0d65f68aef28097 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Wed, 23 Sep 2026 03:40:56 -0500 Subject: [PATCH 01/10] Initial OPF implementation --- CHANGELOG.md | 2 + .../AutomaticDifferentiation/CMakeLists.txt | 1 + .../Enzyme/CooEntries.hpp | 38 + .../Enzyme/D2LDx2.hpp | 132 + .../AutomaticDifferentiation/Enzyme/DfDx.hpp | 52 + .../AutomaticDifferentiation/Enzyme/DgDx.hpp | 82 + .../Enzyme/EnzymeDefinitions.hpp | 9 + .../Enzyme/LowerSparseStorage.hpp | 134 + .../Enzyme/ModelWrappers.hpp | 44 +- GridKit/Model/CMakeLists.txt | 11 + .../Model/OptimalPowerFlow/Branch/Branch.hpp | 74 + .../OptimalPowerFlow/Branch/BranchData.hpp | 46 + .../Branch/BranchDependencyTracking.cpp | 18 + .../OptimalPowerFlow/Branch/BranchEnzyme.cpp | 20 + .../OptimalPowerFlow/Branch/BranchImpl.hpp | 149 + .../OptimalPowerFlow/Branch/CMakeLists.txt | 29 + .../Model/OptimalPowerFlow/Branch/README.md | 101 + GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp | 69 + .../Model/OptimalPowerFlow/Bus/BusData.hpp | 45 + .../Bus/BusDependencyTracking.cpp | 18 + .../Model/OptimalPowerFlow/Bus/BusEnzyme.cpp | 20 + .../Model/OptimalPowerFlow/Bus/BusImpl.hpp | 126 + .../Model/OptimalPowerFlow/Bus/CMakeLists.txt | 29 + GridKit/Model/OptimalPowerFlow/Bus/README.md | 66 + GridKit/Model/OptimalPowerFlow/CMakeLists.txt | 60 + GridKit/Model/OptimalPowerFlow/Component.hpp | 215 + .../Model/OptimalPowerFlow/ComponentData.hpp | 88 + .../Model/OptimalPowerFlow/ComponentModel.hpp | 60 + .../OptimalPowerFlow/ComponentModelImpl.hpp | 179 + .../OptimalPowerFlow/Generator/CMakeLists.txt | 29 + .../OptimalPowerFlow/Generator/Generator.hpp | 60 + .../Generator/GeneratorData.hpp | 43 + .../Generator/GeneratorDependencyTracking.cpp | 18 + .../Generator/GeneratorEnzyme.cpp | 20 + .../Generator/GeneratorImpl.hpp | 109 + .../OptimalPowerFlow/Generator/README.md | 92 + .../OptimalPowerFlow/Load/CMakeLists.txt | 21 + GridKit/Model/OptimalPowerFlow/Load/Load.cpp | 17 + GridKit/Model/OptimalPowerFlow/Load/Load.hpp | 52 + .../Model/OptimalPowerFlow/Load/LoadData.hpp | 36 + .../Load/LoadDependencyTracking.cpp | 18 + .../Model/OptimalPowerFlow/Load/LoadImpl.hpp | 67 + GridKit/Model/OptimalPowerFlow/Load/README.md | 52 + .../Model/OptimalPowerFlow/MatpowerData.cpp | 93 + .../Model/OptimalPowerFlow/MatpowerData.hpp | 61 + GridKit/Model/OptimalPowerFlow/README.md | 86 + .../OptimalPowerFlow/Shunt/CMakeLists.txt | 29 + .../Model/OptimalPowerFlow/Shunt/README.md | 60 + .../Model/OptimalPowerFlow/Shunt/Shunt.hpp | 55 + .../OptimalPowerFlow/Shunt/ShuntData.hpp | 38 + .../Shunt/ShuntDependencyTracking.cpp | 18 + .../OptimalPowerFlow/Shunt/ShuntEnzyme.cpp | 20 + .../OptimalPowerFlow/Shunt/ShuntImpl.hpp | 70 + .../Model/OptimalPowerFlow/SystemModel.hpp | 97 + .../OptimalPowerFlow/SystemModelData.cpp | 201 + .../OptimalPowerFlow/SystemModelData.hpp | 57 + .../SystemModelDependencyTracking.cpp | 93 + .../OptimalPowerFlow/SystemModelEnzyme.cpp | 184 + .../OptimalPowerFlow/SystemModelImpl.hpp | 290 + GridKit/Model/OptimizationEvaluator.hpp | 128 + GridKit/Model/PhasorDynamics/CMakeLists.txt | 2 + .../Model/PhasorDynamics/ComponentData.hpp | 41 + .../Model/PhasorDynamics/SystemModelData.cpp | 188 +- .../Model/PhasorDynamics/SystemModelData.hpp | 23 +- GridKit/Model/STATE.md | 109 + GridKit/Model/StateData.cpp | 254 + GridKit/Model/StateData.hpp | 97 + GridKit/Solver/CMakeLists.txt | 7 +- GridKit/Solver/Optimization/CMakeLists.txt | 22 +- .../Optimization/OptimizationProblem.cpp | 230 + .../Optimization/OptimizationProblem.hpp | 107 + .../PhasorDynamics/AnalysisUtilities.hpp | 42 +- application/PhasorDynamics/CMakeLists.txt | 18 + .../PhasorDynamics/ContingencyAnalysis.cpp | 5 + .../PhasorDynamics/DynamicSimulation.cpp | 5 + .../PhasorDynamics/OptimalDispatch.cpp | 193 + application/PhasorDynamics/README.md | 36 +- .../PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m | 9460 +++++++++++++++++ cases/PhasorDynamics/ACTIVSg2000/README.md | 3 + cases/PhasorDynamics/Hawaii/Hawaii.m | 375 + cases/PhasorDynamics/Hawaii/README.md | 3 + cases/PhasorDynamics/IEEE39/IEEE39.m | 205 + cases/PhasorDynamics/IEEE39/README.md | 3 + examples/PhasorDynamics/CMakeLists.txt | 4 + .../ACTIVSg2000/ACTIVSg2000.solver.json | 8 + .../ACTIVSg2000/CMakeLists.txt | 2 + .../OptimalDispatch/CMakeLists.txt | 34 + .../OptimalDispatch/Hawaii/CMakeLists.txt | 2 + .../OptimalDispatch/Hawaii/Hawaii.solver.json | 8 + .../OptimalDispatch/IEEE39/CMakeLists.txt | 2 + .../OptimalDispatch/IEEE39/IEEE39.solver.json | 8 + .../PhasorDynamics/OptimalDispatch/README.md | 50 + examples/PhasorDynamics/README.md | 1 + tests/IntegrationTests/CMakeLists.txt | 6 + .../OptimalPowerFlow/CMakeLists.txt | 6 + .../OptimalPowerFlow/runSteadyStartTests.cpp | 96 + tests/UnitTests/CMakeLists.txt | 4 + tests/UnitTests/Model/CMakeLists.txt | 8 + tests/UnitTests/Model/StateDataTests.hpp | 131 + tests/UnitTests/Model/runStateDataTests.cpp | 14 + .../UnitTests/OptimalPowerFlow/CMakeLists.txt | 22 + .../OptimalPowerFlow/ComponentTests.hpp | 690 ++ .../OptimalPowerFlow/SystemTests.hpp | 528 + .../OptimalPowerFlow/runComponentTests.cpp | 19 + .../OptimalPowerFlow/runSystemTests.cpp | 19 + tests/UnitTests/PhasorDynamics/CMakeLists.txt | 6 + tests/UnitTests/PhasorDynamics/StateTests.hpp | 150 + .../PhasorDynamics/runStateTests.cpp | 13 + 108 files changed, 17373 insertions(+), 17 deletions(-) create mode 100644 GridKit/AutomaticDifferentiation/Enzyme/CooEntries.hpp create mode 100644 GridKit/AutomaticDifferentiation/Enzyme/D2LDx2.hpp create mode 100644 GridKit/AutomaticDifferentiation/Enzyme/DfDx.hpp create mode 100644 GridKit/AutomaticDifferentiation/Enzyme/DgDx.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/BranchDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/BranchEnzyme.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Branch/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/BusDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/BusEnzyme.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Bus/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Component.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/ComponentData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/ComponentModel.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/GeneratorData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/GeneratorDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/GeneratorEnzyme.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Generator/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/Load/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Load/Load.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Load/Load.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Load/LoadDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Load/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/MatpowerData.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/MatpowerData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/CMakeLists.txt create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/README.md create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/ShuntData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/ShuntDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/ShuntEnzyme.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModel.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModelData.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModelData.hpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModelDependencyTracking.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModelEnzyme.cpp create mode 100644 GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp create mode 100644 GridKit/Model/OptimizationEvaluator.hpp create mode 100644 GridKit/Model/STATE.md create mode 100644 GridKit/Model/StateData.cpp create mode 100644 GridKit/Model/StateData.hpp create mode 100644 GridKit/Solver/Optimization/OptimizationProblem.cpp create mode 100644 GridKit/Solver/Optimization/OptimizationProblem.hpp create mode 100644 application/PhasorDynamics/OptimalDispatch.cpp create mode 100644 cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m create mode 100644 cases/PhasorDynamics/Hawaii/Hawaii.m create mode 100644 cases/PhasorDynamics/IEEE39/IEEE39.m create mode 100644 examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json create mode 100644 examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt create mode 100644 examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt create mode 100644 examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt create mode 100644 examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json create mode 100644 examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt create mode 100644 examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json create mode 100644 examples/PhasorDynamics/OptimalDispatch/README.md create mode 100644 tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt create mode 100644 tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp create mode 100644 tests/UnitTests/Model/CMakeLists.txt create mode 100644 tests/UnitTests/Model/StateDataTests.hpp create mode 100644 tests/UnitTests/Model/runStateDataTests.cpp create mode 100644 tests/UnitTests/OptimalPowerFlow/CMakeLists.txt create mode 100644 tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp create mode 100644 tests/UnitTests/OptimalPowerFlow/SystemTests.hpp create mode 100644 tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp create mode 100644 tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp create mode 100644 tests/UnitTests/PhasorDynamics/StateTests.hpp create mode 100644 tests/UnitTests/PhasorDynamics/runStateTests.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ffbbeba06..4bc35affe3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,6 +99,8 @@ - Added `GridKit_ENABLE_DEVELOPER_MODE` CMake option; in developer mode the Logger defaults to `EVERYTHING` verbosity. - Added `Logger::raiseVerbosity()`, which raises the verbosity without lowering a higher level. - Changed most of the core library code outputs to use the Logger instead of `std::cout`/`std::cerr`. +- Added the `StateData` reader and writer for the state file format, with `applyState` and `extractState` for PhasorDynamics and a `state_file` option in phasor dynamics solver JSON files. +- Added the `OptimalPowerFlow` model family and the `OptimalDispatch` application, with sparse Enzyme Jacobians and Hessians and an Ipopt interface, to initialize PhasorDynamics at an optimal operating point with the limits and costs of a MATPOWER case. ## v0.1 diff --git a/GridKit/AutomaticDifferentiation/CMakeLists.txt b/GridKit/AutomaticDifferentiation/CMakeLists.txt index f54431ca86..4138942049 100644 --- a/GridKit/AutomaticDifferentiation/CMakeLists.txt +++ b/GridKit/AutomaticDifferentiation/CMakeLists.txt @@ -1,3 +1,4 @@ install(FILES DependencyTracking/Variable.hpp DependencyTracking/VariableImplementation.hpp DependencyTracking/VariableOperators.hpp DESTINATION include/GridKit/AutomaticDifferentiation/DependencyTracking) +install(FILES Enzyme/CooEntries.hpp DESTINATION include/GridKit/AutomaticDifferentiation/Enzyme) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/CooEntries.hpp b/GridKit/AutomaticDifferentiation/Enzyme/CooEntries.hpp new file mode 100644 index 0000000000..492c5b786a --- /dev/null +++ b/GridKit/AutomaticDifferentiation/Enzyme/CooEntries.hpp @@ -0,0 +1,38 @@ +/** + * @file CooEntries.hpp + * @brief Coordinate entries filled by Enzyme sparse stores. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + /** + * @brief Coordinate entries in global indices + * + * Filled by `mapped_store` and `lower_store`. Assembly sums duplicate + * coordinates. + */ + struct CooEntries + { + std::vector rows; + std::vector cols; + std::vector values; + + void clear() + { + rows.clear(); + cols.clear(); + values.clear(); + } + }; + } // namespace Sparse + } // namespace Enzyme +} // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/D2LDx2.hpp b/GridKit/AutomaticDifferentiation/Enzyme/D2LDx2.hpp new file mode 100644 index 0000000000..93eaed4a4f --- /dev/null +++ b/GridKit/AutomaticDifferentiation/Enzyme/D2LDx2.hpp @@ -0,0 +1,132 @@ +/** + * @file D2LDx2.hpp + * @brief Enzyme sparse Hessian of an optimization Lagrangian. + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + /** + * @brief Enzyme automatic differentiation Hessian evaluator: Lagrangian Hessian, d2L/dx2 + * + * Lower triangle of the Hessian of + * \f$L = \sigma f(x) + \lambda^T g(x)\f$ by one forward sweep per local + * variable over the reverse-mode gradient of \f$L\f$. Only structural + * entries are stored, in global indices. + * + * @tparam ModelT - model type with `VARIABLE_SIZE` local variables and + * `CONSTRAINT_SIZE` local constraints + */ + template + struct D2LDx2 + { + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + + static_assert(std::is_same_v && std::is_same_v, + "D2LDx2 supports double values and size_t indices"); + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] n_var - Number of local variables + * @param[in] variable_indices - Global index of each local variable + * @param[in] x - Local variables + * @param[in] sigma - Objective factor + * @param[in] lambda - Local constraint multipliers + * @param[in,out] entries - Hessian entries + */ + static void eval(const ModelT* model, + const size_t n_var, + const IdxT* variable_indices, + const ScalarT* x, + const RealT sigma, + const RealT* lambda, + CooEntries* entries) + { + std::array gradient{}; + for (size_t var_i = 0; var_i < n_var; ++var_i) + { + // Sparse storage. @see LowerSparseStorage.hpp + ScalarT* seed = __enzyme_todense((void*) ident_load, + (void*) ident_store, + var_i); + ScalarT* dgradient = __enzyme_todense((void*) mapped_load, + (void*) lower_store, + var_i, + variable_indices, + variable_indices, + entries); + + __enzyme_fwddiff((void*) lagrangianGradient, + enzyme_const, + model, + enzyme_dup, + x, + seed, + enzyme_dupnoneed, + gradient.data(), + dgradient, + enzyme_const, + sigma, + enzyme_const, + lambda); + } + } + + private: + __attribute__((always_inline)) inline static ScalarT lagrangian(const ModelT* model, + const ScalarT* x, + const RealT sigma, + const RealT* lambda) + { + std::array g{}; + ModelWrapper::eval(model, x, g.data()); + + ScalarT value = sigma * ModelWrapper::eval(model, x); + for (size_t i = 0; i < ModelT::CONSTRAINT_SIZE; ++i) + { + value += lambda[i] * g[i]; + } + return value; + } + + /** + * @brief Add the gradient of the Lagrangian to `gradient` + * + * Only the tangent of `gradient` is used, so it is not reset. + */ + __attribute__((always_inline)) inline static void lagrangianGradient(const ModelT* model, + const ScalarT* x, + ScalarT* gradient, + const RealT sigma, + const RealT* lambda) + { + __enzyme_autodiff((void*) lagrangian, + enzyme_const, + model, + enzyme_dup, + x, + gradient, + enzyme_const, + sigma, + enzyme_const, + lambda); + } + }; + } // namespace Sparse + } // namespace Enzyme +} // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDx.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDx.hpp new file mode 100644 index 0000000000..7c84be7f6d --- /dev/null +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDx.hpp @@ -0,0 +1,52 @@ +/** + * @file DfDx.hpp + * @brief Enzyme gradient of an optimization objective. + */ + +#pragma once + +#include +#include + +#include +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + /** + * @brief Enzyme automatic differentiation gradient evaluator: objective gradient, df/dx + * + * One reverse sweep. + * + * @tparam ModelT - model type with `VARIABLE_SIZE` local variables + */ + template + struct DfDx + { + using ScalarT = typename ModelT::ScalarT; + using RealT = typename ModelT::RealT; + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] x - Local variables + * @param[out] gradient - Gradient with respect to the local variables + */ + static void eval(const ModelT* model, const ScalarT* x, RealT* gradient) + { + std::fill_n(gradient, ModelT::VARIABLE_SIZE, 0.0); + + __enzyme_autodiff((void*) ModelWrapper::eval, + enzyme_const, + model, + enzyme_dup, + x, + gradient); + } + }; + } // namespace Sparse + } // namespace Enzyme +} // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DgDx.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DgDx.hpp new file mode 100644 index 0000000000..97ec3e04ec --- /dev/null +++ b/GridKit/AutomaticDifferentiation/Enzyme/DgDx.hpp @@ -0,0 +1,82 @@ +/** + * @file DgDx.hpp + * @brief Enzyme sparse Jacobian of optimization constraints. + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + /** + * @brief Enzyme automatic differentiation Jacobian evaluator: constraint Jacobian, dg/dx + * + * One forward sweep per local variable. Only structural entries are + * stored, in global indices. + * + * @tparam ModelT - model type with `CONSTRAINT_SIZE` local constraints + */ + template + struct DgDx + { + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + + static_assert(std::is_same_v && std::is_same_v, + "DgDx supports double values and size_t indices"); + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] n_var - Number of local variables + * @param[in] constraint_indices - Global row of each local constraint + * @param[in] variable_indices - Global column of each local variable + * @param[in] x - Local variables + * @param[in,out] entries - Jacobian entries + */ + static void eval(const ModelT* model, + const size_t n_var, + const IdxT* constraint_indices, + const IdxT* variable_indices, + const ScalarT* x, + CooEntries* entries) + { + std::array g{}; + for (size_t var_i = 0; var_i < n_var; ++var_i) + { + // Sparse storage. @see LowerSparseStorage.hpp + ScalarT* seed = __enzyme_todense((void*) ident_load, + (void*) ident_store, + var_i); + ScalarT* dg = __enzyme_todense((void*) mapped_load, + (void*) mapped_store, + var_i, + constraint_indices, + variable_indices, + entries); + + __enzyme_fwddiff((void*) ModelWrapper::eval, + enzyme_const, + model, + enzyme_dup, + x, + seed, + enzyme_dupnoneed, + g.data(), + dg); + } + } + }; + } // namespace Sparse + } // namespace Enzyme +} // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/EnzymeDefinitions.hpp b/GridKit/AutomaticDifferentiation/Enzyme/EnzymeDefinitions.hpp index 3d1bbd6fc6..af9ca16504 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/EnzymeDefinitions.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/EnzymeDefinitions.hpp @@ -48,6 +48,15 @@ namespace GridKit */ template extern T __enzyme_fwddiff(void*, model_type...) noexcept; + + /** + * @brief Enzyme reverse-mode template for GridKit models + * + * @tparam T - return type + * @tparam model_type - model type + */ + template + extern T __enzyme_autodiff(void*, model_type...) noexcept; } // namespace Sparse } // namespace Enzyme } // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp index 6714a28a77..d660b00632 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp @@ -9,8 +9,10 @@ #pragma once +#include #include +#include #include namespace GridKit @@ -280,6 +282,138 @@ namespace GridKit row /= sizeof(ScalarT); return (ScalarT) (row == col); } + + /** + * @brief Append an entry whose row and column have global indices + * + * @note __attribute__((enzyme_sparse_accumulate)) does not support templates yet + * + * @param[in] row - local row + * @param[in] col - local column + * @param[in] val - value to be stored + * @param[in] row_indices - Global row of each local row + * @param[in] col_indices - Global column of each local column + * @param[in,out] entries - Entries in global indices + */ + [[maybe_unused]] __attribute__((enzyme_sparse_accumulate)) static void inner_mapped_store_double_size_t( + size_t row, + size_t col, + double val, + const size_t* row_indices, + const size_t* col_indices, + CooEntries* entries) + { + const size_t row_mapped = row_indices[row]; + const size_t col_mapped = col_indices[col]; + if (row_mapped != INVALID_INDEX && col_mapped != INVALID_INDEX) + { + entries->rows.push_back(row_mapped); + entries->cols.push_back(col_mapped); + entries->values.push_back(val); + } + } + + /** + * @brief Append a lower-triangle entry whose row and column have global indices + * + * @note __attribute__((enzyme_sparse_accumulate)) does not support templates yet + * + * @param[in] row - local row + * @param[in] col - local column + * @param[in] val - value to be stored + * @param[in] row_indices - Global row of each local row + * @param[in] col_indices - Global column of each local column + * @param[in,out] entries - Entries in global indices + */ + [[maybe_unused]] __attribute__((enzyme_sparse_accumulate)) static void inner_lower_store_double_size_t( + size_t row, + size_t col, + double val, + const size_t* row_indices, + const size_t* col_indices, + CooEntries* entries) + { + const size_t row_mapped = row_indices[row]; + const size_t col_mapped = col_indices[col]; + if (row_mapped != INVALID_INDEX && col_mapped != INVALID_INDEX && row_mapped >= col_mapped) + { + entries->rows.push_back(row_mapped); + entries->cols.push_back(col_mapped); + entries->values.push_back(val); + } + } + + /** + * @brief Enzyme sparse store into `CooEntries` + * + * Drops rows and columns without a global index. The zero test marks + * the store for Enzyme's sparsity analysis, which replaces the test by + * the structural index set. Numerical zeros are therefore stored, and + * the entries do not depend on values. + * + * @param[in] val - value to be stored + * @param[in] row - row offset in bytes + * @param[in] col - local column + * @param[in] row_indices - Global row of each local row + * @param[in] col_indices - Global column of each local column + * @param[in,out] entries - Entries in global indices + */ + [[maybe_unused]] __attribute__((always_inline)) static void mapped_store(double val, + size_t row, + size_t col, + const size_t* row_indices, + const size_t* col_indices, + CooEntries* entries) + { + if (val == 0.0) + { + return; + } + + row /= sizeof(double); + inner_mapped_store_double_size_t(row, col, val, row_indices, col_indices, entries); + } + + /** + * @brief `mapped_store` restricted to the global lower triangle + * + * @param[in] val - value to be stored + * @param[in] row - row offset in bytes + * @param[in] col - local column + * @param[in] row_indices - Global row of each local row + * @param[in] col_indices - Global column of each local column + * @param[in,out] entries - Entries in global indices + */ + [[maybe_unused]] __attribute__((always_inline)) static void lower_store(double val, + size_t row, + size_t col, + const size_t* row_indices, + const size_t* col_indices, + CooEntries* entries) + { + if (val == 0.0) + { + return; + } + + row /= sizeof(double); + inner_lower_store_double_size_t(row, col, val, row_indices, col_indices, entries); + } + + /** + * @brief Enzyme load for `mapped_store` and `lower_store` views + * + * Returns zero, so an accumulation stores its increment as a separate + * entry. + */ + [[maybe_unused]] __attribute__((always_inline)) static double mapped_load(size_t, + size_t, + const size_t*, + const size_t*, + CooEntries*) + { + return 0.0; + } } // namespace Sparse } // namespace Enzyme } // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp index d53a653e65..bbd6a1e793 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp @@ -26,7 +26,9 @@ namespace GridKit BusResidual11, //< Special case for branches that are connected to two buses BusResidual12, //< Special case for branches that are connected to two buses BusResidual21, //< Special case for branches that are connected to two buses - BusResidual22 //< Special case for branches that are connected to two buses + BusResidual22, //< Special case for branches that are connected to two buses + Objective, //< Optimization objective, `objective(x)` + Constraints //< Optimization constraints, `constraints(x, g)` }; /** @@ -225,6 +227,46 @@ namespace GridKit model->evaluateBusResidual22(y, yp, wb, h); } }; + + /** + * @brief Wrapper partial template specialization for an optimization objective + * + */ + template + struct ModelWrapper + { + using ScalarT = typename ModelT::ScalarT; + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] x - Local variables + * @return Objective contribution + */ + __attribute__((always_inline)) inline static ScalarT eval(const ModelT* model, const ScalarT* x) + { + return model->objective(x); + } + }; + + /** + * @brief Wrapper partial template specialization for optimization constraints + * + */ + template + struct ModelWrapper + { + using ScalarT = typename ModelT::ScalarT; + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] x - Local variables + * @param[out] g - Local constraints + */ + __attribute__((always_inline)) inline static void eval(const ModelT* model, const ScalarT* x, ScalarT* g) + { + model->constraints(x, g); + } + }; } // namespace Sparse } // namespace Enzyme } // namespace GridKit diff --git a/GridKit/Model/CMakeLists.txt b/GridKit/Model/CMakeLists.txt index a28d08def9..c6f176d8f5 100644 --- a/GridKit/Model/CMakeLists.txt +++ b/GridKit/Model/CMakeLists.txt @@ -5,13 +5,24 @@ # - Cameron Rutherford #]] +gridkit_add_library( + model_state_data + SOURCES StateData.cpp + HEADERS StateData.hpp + INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) + add_subdirectory(PhasorDynamics) add_subdirectory(PowerFlow) add_subdirectory(PowerElectronics) +if(GRIDKIT_ENABLE_ENZYME) + add_subdirectory(OptimalPowerFlow) +endif() + install( FILES ConfigurationChecks.hpp Evaluator.hpp + OptimizationEvaluator.hpp ParameterReader.hpp VariableMonitor.hpp VariableMonitorController.hpp diff --git a/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp b/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp new file mode 100644 index 0000000000..7ae1006e56 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp @@ -0,0 +1,74 @@ +/** + * @file Branch.hpp + * @brief Declaration of an optimal power flow branch. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Line or off-nominal transformer between two buses + * + * Uses the admittance of `PhasorDynamics::Branch`. Power is positive + * into the buses. + */ + template + class Branch : public ComponentModel, scalar_type, index_type> + { + using ComponentModelT = ComponentModel, scalar_type, index_type>; + + using ComponentModelT::constraint_upper_; + using ComponentModelT::id_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ComponentModelT::RealT; + using ModelDataT = BranchData; + + /// Local variables: real and imaginary voltage at bus 1, then at bus 2 + static constexpr IdxT VARIABLE_SIZE = 4; + /// Local constraints: squared apparent power at bus 1 and bus 2, then power into bus 1 and bus 2 + static constexpr IdxT CONSTRAINT_SIZE = 6; + static constexpr IdxT INTERNAL_SIZE = 0; + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 2; + static constexpr bool CONSTANT = false; + + explicit Branch(const ModelDataT& data); + + int verify() const override; + int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + + __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; + __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; + + private: + void setDerivedParameters(RealT tap, RealT phase, RealT status); + + RealT R_{0.0}; + RealT X_{0.0}; + RealT G_{0.0}; + RealT B_{0.0}; + RealT Gmag_{0.0}; + RealT Bmag_{0.0}; + RealT tap_{1.0}; + RealT phase_{0.0}; + RealT Smax_{0.0}; + + RealT g11_{0.0}; + RealT b11_{0.0}; + RealT g12_{0.0}; + RealT b12_{0.0}; + RealT g21_{0.0}; + RealT b21_{0.0}; + RealT g22_{0.0}; + RealT b22_{0.0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp new file mode 100644 index 0000000000..84f2b78ab5 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp @@ -0,0 +1,46 @@ +/** + * @file BranchData.hpp + * @brief Modeling data for optimal power flow branches. + */ + +#pragma once + +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Parameters for a branch + enum class BranchParameters : size_t + { + R, ///< \f$R\f$ Branch series resistance [p.u.] + X, ///< \f$X\f$ Branch series reactance [p.u.] + G, ///< \f$G\f$ Total line shunt conductance, split equally between the two terminals [p.u.] + B, ///< \f$B\f$ Total line shunt susceptance, split equally between the two terminals [p.u.] + Gmag, ///< \f$G_{\mathrm{mag}}\f$ Magnetizing shunt conductance at bus 1, the tapped side [p.u.] + Bmag, ///< \f$B_{\mathrm{mag}}\f$ Magnetizing shunt susceptance at bus 1, the tapped side [p.u.] + tap, ///< \f$\tau\f$ Off-nominal tap magnitude on the bus-1 side [p.u.] + phase, ///< \f$\theta\f$ Off-nominal phase-shift angle [rad] + Smax, ///< \f$S^{\max}\f$ Apparent power limit at each terminal [p.u.] + }; + + /// Buses for a branch + enum class BranchBuses : size_t + { + bus1, ///< Bus-1 terminal, the tapped side + bus2, ///< Bus-2 terminal + }; + + /** + * @brief Contains modeling data for a Branch + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + */ + template + using BranchData = ComponentData; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchDependencyTracking.cpp new file mode 100644 index 0000000000..ad8f04aa34 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchDependencyTracking.cpp @@ -0,0 +1,18 @@ +/** + * @file BranchDependencyTracking.cpp + * @brief Optimal power flow branch instantiation for `DependencyTracking::Variable`. + */ + +#include + +#include "BranchImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, DependencyTracking::Variable, size_t>; + template class Branch; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchEnzyme.cpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchEnzyme.cpp new file mode 100644 index 0000000000..b05c5173a6 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchEnzyme.cpp @@ -0,0 +1,20 @@ +/** + * @file BranchEnzyme.cpp + * @brief Optimal power flow branch instantiation with Enzyme derivatives. + */ + +#include +#include +#include + +#include "BranchImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, double, size_t>; + template class Branch; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp new file mode 100644 index 0000000000..0515b97176 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp @@ -0,0 +1,149 @@ +/** + * @file BranchImpl.hpp + * @brief Definition of an optimal power flow branch. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Construct a branch from data + * + * A terminal apparent power row exists only with a rating `Smax`. + */ + template + Branch::Branch(const ModelDataT& data) + : ComponentModelT(data.id, busNumbers(data)), + R_(parameter(data, BranchParameters::R, ZERO)), + X_(parameter(data, BranchParameters::X, ZERO)), + G_(parameter(data, BranchParameters::G, ZERO)), + B_(parameter(data, BranchParameters::B, ZERO)), + Gmag_(parameter(data, BranchParameters::Gmag, ZERO)), + Bmag_(parameter(data, BranchParameters::Bmag, ZERO)), + tap_(parameter(data, BranchParameters::tap, ONE)), + phase_(parameter(data, BranchParameters::phase, ZERO)), + Smax_(parameter(data, BranchParameters::Smax, UNBOUNDED)) + { + constraint_upper_ = {Smax_ * Smax_, Smax_ * Smax_}; + } + + template + int Branch::verify() const + { + return this->check(std::isfinite(R_), "R must be finite") + + this->check(std::isfinite(X_), "X must be finite") + + this->check(std::isfinite(G_), "G must be finite") + + this->check(std::isfinite(B_), "B must be finite") + + this->check(std::isfinite(Gmag_), "Gmag must be finite") + + this->check(std::isfinite(Bmag_), "Bmag must be finite") + + this->check(std::isfinite(tap_), "tap must be finite") + + this->check(std::isfinite(phase_), "phase must be finite") + + this->check(R_ * R_ + X_ * X_ > ZERO, "R and X cannot both be zero") + + this->check(tap_ > ZERO, "tap must be positive") + + this->check(Smax_ > ZERO, "Smax must be positive"); + } + + /** + * @brief Apply the state settings `open`, `tap` and `phase` + */ + template + int Branch::initialize(const Model::StateData& state, + [[maybe_unused]] ScalarT* x, + [[maybe_unused]] RealT* x_lower, + [[maybe_unused]] RealT* x_upper) + { + RealT tap = tap_; + RealT phase = phase_; + RealT status = ONE; + + const Model::StateRecord* record = state.device(id_); + if (record != nullptr) + { + tap = record->value("tap", tap); + phase = record->value("phase", phase); + if (record->flag("open", false)) + { + status = ZERO; + } + } + + setDerivedParameters(tap, phase, status); + return this->check(tap > ZERO, "state tap must be positive"); + } + + template + __attribute__((always_inline)) inline typename Branch::ScalarT + Branch::objective([[maybe_unused]] const ScalarT* x) const + { + return ScalarT{ZERO}; + } + + /** + * @brief Squared apparent power and power into each bus + * + * Terminal currents are those of `PhasorDynamics::Branch`, and the power + * into bus k is \f$V_k I_k^*\f$. + */ + template + __attribute__((always_inline)) inline void + Branch::constraints(const ScalarT* x, ScalarT* g) const + { + const ScalarT vr1 = x[0]; + const ScalarT vi1 = x[1]; + const ScalarT vr2 = x[2]; + const ScalarT vi2 = x[3]; + + const ScalarT ir1 = g11_ * vr1 - b11_ * vi1 + g12_ * vr2 - b12_ * vi2; + const ScalarT ii1 = b11_ * vr1 + g11_ * vi1 + b12_ * vr2 + g12_ * vi2; + const ScalarT ir2 = g21_ * vr1 - b21_ * vi1 + g22_ * vr2 - b22_ * vi2; + const ScalarT ii2 = b21_ * vr1 + g21_ * vi1 + b22_ * vr2 + g22_ * vi2; + + const ScalarT p1 = vr1 * ir1 + vi1 * ii1; + const ScalarT q1 = vi1 * ir1 - vr1 * ii1; + const ScalarT p2 = vr2 * ir2 + vi2 * ii2; + const ScalarT q2 = vi2 * ir2 - vr2 * ii2; + + g[0] = p1 * p1 + q1 * q1; + g[1] = p2 * p2 + q2 * q2; + g[2] = p1; + g[3] = q1; + g[4] = p2; + g[5] = q2; + } + + /** + * @brief Admittance of `PhasorDynamics::Branch`, scaled by the branch status + */ + template + void Branch::setDerivedParameters(RealT tap, RealT phase, RealT status) + { + const RealT denom = R_ * R_ + X_ * X_; + const RealT g_br = R_ / denom; + const RealT b_br = -X_ / denom; + const RealT inv_tap = ONE / tap; + const RealT cos_ph = std::cos(phase); + const RealT sin_ph = std::sin(phase); + + g11_ = status * (-g_br * inv_tap * inv_tap - HALF * G_ - Gmag_); + b11_ = status * (-b_br * inv_tap * inv_tap - HALF * B_ - Bmag_); + + g12_ = status * (g_br * cos_ph - b_br * sin_ph) * inv_tap; + b12_ = status * (b_br * cos_ph + g_br * sin_ph) * inv_tap; + + g21_ = status * (g_br * cos_ph + b_br * sin_ph) * inv_tap; + b21_ = status * (b_br * cos_ph - g_br * sin_ph) * inv_tap; + + g22_ = status * (-g_br - HALF * G_); + b22_ = status * (-b_br - HALF * B_); + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/Branch/CMakeLists.txt new file mode 100644 index 0000000000..cc896b15f3 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/CMakeLists.txt @@ -0,0 +1,29 @@ +set(_install_headers Branch.hpp BranchData.hpp) + +gridkit_add_library( + optimal_power_flow_branch + SOURCES BranchEnzyme.cpp + HEADERS ${_install_headers} + LINK_LIBRARIES + PRIVATE + ClangEnzymeFlags + PUBLIC + GridKit::optimal_power_flow_core + COMPILE_OPTIONS + PRIVATE + -mllvm + -enzyme-auto-sparsity=1 + -fno-math-errno) + +gridkit_add_library( + optimal_power_flow_branch_dependency_tracking + SOURCES BranchDependencyTracking.cpp + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +# Link to interface target for all components +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_branch) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_branch_dependency_tracking) diff --git a/GridKit/Model/OptimalPowerFlow/Branch/README.md b/GridKit/Model/OptimalPowerFlow/Branch/README.md new file mode 100644 index 0000000000..2ce5234ce0 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Branch/README.md @@ -0,0 +1,101 @@ +# Branch + +Line or off-nominal transformer between two buses, with the admittance of the +PhasorDynamics [Branch](../../PhasorDynamics/Branch/README.md). + +## Model Parameters + +Symbol | Units | JSON | Description | Typical Value | Note +----------------------|--------|---------|-----------------------------------------------------------|---------------|----- +$R$ | [p.u.] | `R` | Series resistance | | From the case +$X$ | [p.u.] | `X` | Series reactance | | From the case +$G$ | [p.u.] | `G` | Total line shunt conductance, split between the terminals | | From the case +$B$ | [p.u.] | `B` | Total line shunt susceptance, split between the terminals | | From the case +$G_\mathrm{mag}$ | [p.u.] | `Gmag` | Magnetizing conductance at bus 1 | 0 | From the case +$B_\mathrm{mag}$ | [p.u.] | `Bmag` | Magnetizing susceptance at bus 1 | 0 | From the case +$\tau$ | [p.u.] | `tap` | Off-nominal tap magnitude on the bus-1 side | 1 | From the case +$\phi$ | [rad] | `phase` | Phase-shift angle | 0 | From the case +$S^{\max}$ | [p.u.] | `Smax` | Apparent power limit at each terminal | | MATPOWER `RATE_A`, default unbounded + +### Parameter Validation + +- All parameters are finite, except $S^{\max}$ +- $R^2 + X^2 > 0$ +- $\tau > 0$ +- $S^{\max} > 0$ + +### Model Derived Parameters + +The state settings `tap` and `phase` replace $\tau$ and $\phi$. The status $s$ +is zero if the state marks the branch `open` and one otherwise. + +```math +\begin{aligned} +g &= \dfrac{R}{R^2 + X^2}, \quad b = -\dfrac{X}{R^2 + X^2} \\ +g_{11} &= s \left(-g / \tau^2 - G/2 - G_\mathrm{mag}\right), \quad b_{11} = s \left(-b / \tau^2 - B/2 - B_\mathrm{mag}\right) \\ +g_{12} &= s (g \cos\phi - b \sin\phi) / \tau, \quad b_{12} = s (b \cos\phi + g \sin\phi) / \tau \\ +g_{21} &= s (g \cos\phi + b \sin\phi) / \tau, \quad b_{21} = s (b \cos\phi - g \sin\phi) / \tau \\ +g_{22} &= s (-g - G/2), \quad b_{22} = s (-b - B/2) +\end{aligned} +``` + +## Model Ports + +Name | Port | Init | Description +-------|------|-------|------------ +`bus1` | Bus | Known | Bus-1 terminal, the tapped side +`bus2` | Bus | Known | Bus-2 terminal + +## Model Variables + +### Internal Variables + +None. + +### External Variables + +Symbol | Units | Description | Note +--------------------|--------|-----------------------|----- +$V_{\mathrm{r}1}$ | [p.u.] | Bus-1 real voltage | Owned by bus 1 +$V_{\mathrm{i}1}$ | [p.u.] | Bus-1 imaginary voltage | Owned by bus 1 +$V_{\mathrm{r}2}$ | [p.u.] | Bus-2 real voltage | Owned by bus 2 +$V_{\mathrm{i}2}$ | [p.u.] | Bus-2 imaginary voltage | Owned by bus 2 + +## Model Equations + +Terminal currents into the buses, and the power into bus $k$: + +```math +\begin{aligned} +I_{\mathrm{r}1} &= g_{11} V_{\mathrm{r}1} - b_{11} V_{\mathrm{i}1} + g_{12} V_{\mathrm{r}2} - b_{12} V_{\mathrm{i}2} \\ +I_{\mathrm{i}1} &= b_{11} V_{\mathrm{r}1} + g_{11} V_{\mathrm{i}1} + b_{12} V_{\mathrm{r}2} + g_{12} V_{\mathrm{i}2} \\ +I_{\mathrm{r}2} &= g_{21} V_{\mathrm{r}1} - b_{21} V_{\mathrm{i}1} + g_{22} V_{\mathrm{r}2} - b_{22} V_{\mathrm{i}2} \\ +I_{\mathrm{i}2} &= b_{21} V_{\mathrm{r}1} + g_{21} V_{\mathrm{i}1} + b_{22} V_{\mathrm{r}2} + g_{22} V_{\mathrm{i}2} \\ +P_k &= V_{\mathrm{r}k} I_{\mathrm{r}k} + V_{\mathrm{i}k} I_{\mathrm{i}k}, \quad Q_k = V_{\mathrm{i}k} I_{\mathrm{r}k} - V_{\mathrm{r}k} I_{\mathrm{i}k} +\end{aligned} +``` + +### Objective + +None. + +### Internal Constraints + +A row exists only when $S^{\max}$ is set: + +```math +P_k^2 + Q_k^2 \le \left(S^{\max}\right)^2, \quad k = 1, 2 +``` + +### External Constraints + +```math +\begin{aligned} +\Delta P_k^\mathrm{bus} &\mathrel{+}= P_k \\ +\Delta Q_k^\mathrm{bus} &\mathrel{+}= Q_k +\end{aligned} +``` + +## Initialization + +The state settings `open`, `tap`, and `phase` set the derived admittance. diff --git a/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp b/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp new file mode 100644 index 0000000000..2d81020f44 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp @@ -0,0 +1,69 @@ +/** + * @file Bus.hpp + * @brief Declaration of an optimal power flow bus. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Bus voltage in Cartesian coordinates and power balance + * + * The bus owns the balance rows. Devices add the power they inject into + * the bus, so the bus contributes zero. + */ + template + class Bus : public ComponentModel, scalar_type, index_type> + { + using ComponentModelT = ComponentModel, scalar_type, index_type>; + + using ComponentModelT::constraint_lower_; + using ComponentModelT::constraint_upper_; + using ComponentModelT::variable_indices_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ComponentModelT::RealT; + using ModelDataT = BusData; + + /// Local variables: real and imaginary voltage + static constexpr IdxT VARIABLE_SIZE = 2; + /// Local constraints: active and reactive power balance, squared voltage magnitude, and angle reference + static constexpr IdxT CONSTRAINT_SIZE = 4; + static constexpr IdxT INTERNAL_SIZE = 2; + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 4; + static constexpr bool CONSTANT = false; + + explicit Bus(const ModelDataT& data); + + int verify() const override; + int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + + /// Keep the state angle, which sets the angle reference + void setReference(); + + bool infinite() const + { + return infinite_; + } + + __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; + __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; + + private: + IdxT number_{0}; + bool infinite_{false}; + RealT Vmin_{0.0}; + RealT Vmax_{0.0}; + RealT vr_ref_{1.0}; + RealT vi_ref_{0.0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp b/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp new file mode 100644 index 0000000000..c173fc5670 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp @@ -0,0 +1,45 @@ +/** + * @file BusData.hpp + * @brief Modeling data for optimal power flow buses. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Parameters for a bus + enum class BusParameters : size_t + { + Vmin, ///< \f$V^{\min}\f$ Voltage magnitude lower limit [p.u.] + Vmax, ///< \f$V^{\max}\f$ Voltage magnitude upper limit [p.u.] + }; + + /** + * @brief Contains modeling data for a Bus + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + */ + template + struct BusData + { + using RealT = real_type; + using IdxT = index_type; + using Parameters = BusParameters; + + /// Bus number + IdxT number{0}; + + /// Voltage fixed at its state value, as for `BusInfinite` + bool infinite{false}; + + /// Mapping of parameters to parameter values + std::map parameters; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/Bus/BusDependencyTracking.cpp new file mode 100644 index 0000000000..3fef7236ec --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusDependencyTracking.cpp @@ -0,0 +1,18 @@ +/** + * @file BusDependencyTracking.cpp + * @brief Optimal power flow bus instantiation for `DependencyTracking::Variable`. + */ + +#include + +#include "BusImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, DependencyTracking::Variable, size_t>; + template class Bus; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusEnzyme.cpp b/GridKit/Model/OptimalPowerFlow/Bus/BusEnzyme.cpp new file mode 100644 index 0000000000..6296df9930 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusEnzyme.cpp @@ -0,0 +1,20 @@ +/** + * @file BusEnzyme.cpp + * @brief Optimal power flow bus instantiation with Enzyme derivatives. + */ + +#include +#include +#include + +#include "BusImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, double, size_t>; + template class Bus; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp b/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp new file mode 100644 index 0000000000..f19bee38b8 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp @@ -0,0 +1,126 @@ +/** + * @file BusImpl.hpp + * @brief Definition of an optimal power flow bus. + */ + +#pragma once + +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Construct a bus from data + * + * Balance rows are equalities, and the voltage magnitude row exists with a + * limit. An infinite bus has neither. + */ + template + Bus::Bus(const ModelDataT& data) + : ComponentModelT(Model::busKey(data.number), {}), + number_(data.number), + infinite_(data.infinite), + Vmin_(parameter(data, BusParameters::Vmin, ZERO)), + Vmax_(parameter(data, BusParameters::Vmax, UNBOUNDED)) + { + if (!infinite_) + { + constraint_lower_[0] = ZERO; + constraint_upper_[0] = ZERO; + constraint_lower_[1] = ZERO; + constraint_upper_[1] = ZERO; + constraint_upper_[2] = Vmax_ * Vmax_; + if (Vmin_ > ZERO) + { + constraint_lower_[2] = Vmin_ * Vmin_; + } + } + } + + template + int Bus::verify() const + { + return this->check(Vmin_ >= ZERO, "Vmin must be nonnegative") + + this->check(Vmax_ >= Vmin_, "Vmax must not be less than Vmin"); + } + + /** + * @brief Start from the state voltage, or a flat start without one + * + * The state voltage sets the angle reference. An infinite bus keeps its + * state voltage. + */ + template + int Bus::initialize(const Model::StateData& state, + ScalarT* x, + RealT* x_lower, + RealT* x_upper) + { + vr_ref_ = ONE; + vi_ref_ = ZERO; + + const Model::StateRecord* record = state.bus(number_); + if (record != nullptr) + { + vr_ref_ = record->value("vr", vr_ref_); + vi_ref_ = record->value("vi", vi_ref_); + } + + const IdxT vr_index = variable_indices_[0]; + const IdxT vi_index = variable_indices_[1]; + + x[vr_index] = vr_ref_; + x[vi_index] = vi_ref_; + x_lower[vr_index] = -UNBOUNDED; + x_upper[vr_index] = UNBOUNDED; + x_lower[vi_index] = -UNBOUNDED; + x_upper[vi_index] = UNBOUNDED; + + if (infinite_) + { + x_lower[vr_index] = vr_ref_; + x_upper[vr_index] = vr_ref_; + x_lower[vi_index] = vi_ref_; + x_upper[vi_index] = vi_ref_; + } + + return 0; + } + + template + void Bus::setReference() + { + constraint_lower_[3] = ZERO; + constraint_upper_[3] = ZERO; + } + + template + __attribute__((always_inline)) inline typename Bus::ScalarT + Bus::objective([[maybe_unused]] const ScalarT* x) const + { + return ScalarT{ZERO}; + } + + /** + * @brief Squared voltage magnitude and the voltage component normal to + * the state voltage + * + * Devices add their injections to the balance rows, which the bus leaves + * at zero. + */ + template + __attribute__((always_inline)) inline void + Bus::constraints(const ScalarT* x, ScalarT* g) const + { + const ScalarT vr = x[0]; + const ScalarT vi = x[1]; + + g[2] = vr * vr + vi * vi; + g[3] = vr_ref_ * vi - vi_ref_ * vr; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/Bus/CMakeLists.txt new file mode 100644 index 0000000000..c655cbd506 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/CMakeLists.txt @@ -0,0 +1,29 @@ +set(_install_headers Bus.hpp BusData.hpp) + +gridkit_add_library( + optimal_power_flow_bus + SOURCES BusEnzyme.cpp + HEADERS ${_install_headers} + LINK_LIBRARIES + PRIVATE + ClangEnzymeFlags + PUBLIC + GridKit::optimal_power_flow_core + COMPILE_OPTIONS + PRIVATE + -mllvm + -enzyme-auto-sparsity=1 + -fno-math-errno) + +gridkit_add_library( + optimal_power_flow_bus_dependency_tracking + SOURCES BusDependencyTracking.cpp + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +# Link to interface target for all components +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_bus) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_bus_dependency_tracking) diff --git a/GridKit/Model/OptimalPowerFlow/Bus/README.md b/GridKit/Model/OptimalPowerFlow/Bus/README.md new file mode 100644 index 0000000000..6198c98cd2 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Bus/README.md @@ -0,0 +1,66 @@ +# Bus + +Bus voltage in Cartesian coordinates and the power balance of the bus. Devices +add the power they inject into the bus to its balance rows. + +## Model Parameters + +Symbol | Units | JSON | Description | Typical Value | Note +-----------|--------|--------|-------------------------------|---------------|----- +$V^{\min}$ | [p.u.] | `Vmin` | Voltage magnitude lower limit | 0.95 | Default 0 +$V^{\max}$ | [p.u.] | `Vmax` | Voltage magnitude upper limit | 1.05 | Default unbounded + +A `BusInfinite` in the case makes the bus infinite. + +### Parameter Validation + +- $V^{\min} \ge 0$ +- $V^{\max} \ge V^{\min}$ + +### Model Derived Parameters + +None. + +## Model Ports + +None. Devices connect to the bus by its number. + +## Model Variables + +### Internal Variables + +Symbol | Units | Description | Note +---------------|--------|-------------------|----- +$V_\mathrm{r}$ | [p.u.] | Real voltage | +$V_\mathrm{i}$ | [p.u.] | Imaginary voltage | + +### External Variables + +None. + +## Model Equations + +### Objective + +None. + +### Internal Constraints + +```math +\begin{aligned} +0 &= \sum_{c \to k} P_{c,k} \\ +0 &= \sum_{c \to k} Q_{c,k} \\ +\left(V^{\min}\right)^2 &\le V_\mathrm{r}^2 + V_\mathrm{i}^2 \le \left(V^{\max}\right)^2 \\ +0 &= V_\mathrm{r}^\mathrm{state} V_\mathrm{i} - V_\mathrm{i}^\mathrm{state} V_\mathrm{r} +\end{aligned} +``` + +The bus contributes zero to the balance rows. The magnitude row exists with a +limit, and the reference row only at the reference bus, where it keeps the +state angle. An infinite bus keeps its state voltage and has no rows. + +## Initialization + +The state entry `bus_id_N` gives the starting voltage, $V_\mathrm{r}^\mathrm{state}$ +and $V_\mathrm{i}^\mathrm{state}$. Without an entry, the bus starts at +$V_\mathrm{r} = 1$ and $V_\mathrm{i} = 0$. diff --git a/GridKit/Model/OptimalPowerFlow/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/CMakeLists.txt new file mode 100644 index 0000000000..f95cc0186a --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/CMakeLists.txt @@ -0,0 +1,60 @@ +add_library(optimal_power_flow_components INTERFACE) +add_library(optimal_power_flow_components_dependency_tracking INTERFACE) + +gridkit_add_library( + optimal_power_flow_core + INTERFACE_TARGET + HEADERS Component.hpp ComponentData.hpp ComponentModel.hpp + LINK_LIBRARIES + INTERFACE + GridKit::definitions + INTERFACE + GridKit::Utilities + INTERFACE + GridKit::utilities_logger + INTERFACE + GridKit::model_state_data) + +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_core) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_core) + +add_subdirectory(Branch) +add_subdirectory(Bus) +add_subdirectory(Generator) +add_subdirectory(Load) +add_subdirectory(Shunt) + +add_library(GridKit::optimal_power_flow_components ALIAS optimal_power_flow_components) +add_library(GridKit::optimal_power_flow_components_dependency_tracking ALIAS + optimal_power_flow_components_dependency_tracking) + +gridkit_add_library( + optimal_power_flow_systemmodel + SOURCES SystemModelEnzyme.cpp SystemModelData.cpp MatpowerData.cpp + HEADERS SystemModel.hpp SystemModelData.hpp MatpowerData.hpp + LINK_LIBRARIES + PUBLIC + GridKit::optimal_power_flow_components + PUBLIC + GridKit::dense_vector + PUBLIC + GridKit::sparse_matrix) + +gridkit_add_library( + optimal_power_flow_systemmodel_dependency_tracking + SOURCES SystemModelDependencyTracking.cpp + HEADERS SystemModel.hpp + LINK_LIBRARIES + PUBLIC + GridKit::optimal_power_flow_components_dependency_tracking + PUBLIC + GridKit::dense_vector + PUBLIC + GridKit::sparse_matrix) + +install(TARGETS optimal_power_flow_components optimal_power_flow_components_dependency_tracking + EXPORT gridkit-targets) diff --git a/GridKit/Model/OptimalPowerFlow/Component.hpp b/GridKit/Model/OptimalPowerFlow/Component.hpp new file mode 100644 index 0000000000..52989aa2e3 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Component.hpp @@ -0,0 +1,215 @@ +/** + * @file Component.hpp + * @brief Base class of optimal power flow components. + */ + +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + using Log = ::GridKit::Utilities::Logger; + + /// Bound of a variable or constraint without a limit + template + inline constexpr RealT UNBOUNDED = std::numeric_limits::infinity(); + + /** + * @brief Optimal power flow component + * + * Local variables are the internal variables followed by the real and + * imaginary voltage of each terminal bus. Local constraints are the + * internal constraints followed by the active and reactive power into + * each terminal bus. The system model maps local indices to global ones. + */ + template + class Component + { + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ScalarTraits::RealT; + using CooEntriesT = Enzyme::Sparse::CooEntries; + + /// Local variables and constraints per terminal + static constexpr IdxT TERMINAL_SIZE = 2; + + virtual ~Component() = default; + + virtual int verify() const = 0; + + /** + * @brief Set initial values and bounds of the internal variables + * + * @param[in] state - Operating state + * @param[out] x - Variables + * @param[out] x_lower - Variable lower bounds + * @param[out] x_upper - Variable upper bounds + */ + virtual int initialize(const Model::StateData& state, + ScalarT* x, + RealT* x_lower, + RealT* x_upper) = 0; + + /// Add the objective contribution at `x` to `f` + virtual int evaluateObjective(const ScalarT* x, ScalarT& f) = 0; + + /// Add the objective gradient at `x` to `gradient` + virtual int evaluateGradient(const ScalarT* x, RealT* gradient) = 0; + + /// Add the constraint contributions at `x` to `g` + virtual int evaluateConstraints(const ScalarT* x, ScalarT* g) = 0; + + /// Evaluate the constraint Jacobian entries at `x` into `jacobian()` + virtual int evaluateJacobian(const ScalarT* x) = 0; + + /// Evaluate the lower Lagrangian Hessian entries at `x` into `hessian()` + virtual int evaluateHessian(const ScalarT* x, RealT sigma, const RealT* lambda) = 0; + + /// Active and reactive power into each terminal bus at `x` + virtual int evaluateTerminalPower(const ScalarT* x, ScalarT* power) = 0; + + IdxT size() const + { + return static_cast(variable_indices_.size()); + } + + IdxT sizeConstraints() const + { + return static_cast(constraint_indices_.size()); + } + + IdxT sizeInternal() const + { + return size_internal_; + } + + IdxT sizeInternalConstraints() const + { + return static_cast(constraint_lower_.size()); + } + + const std::string& id() const + { + return id_; + } + + /// Bus number of each terminal + const std::vector& terminals() const + { + return terminals_; + } + + /// Lower bounds of the internal constraints + const std::vector& constraintLower() const + { + return constraint_lower_; + } + + /// Upper bounds of the internal constraints + const std::vector& constraintUpper() const + { + return constraint_upper_; + } + + std::vector& variableIndices() + { + return variable_indices_; + } + + const std::vector& variableIndices() const + { + return variable_indices_; + } + + std::vector& constraintIndices() + { + return constraint_indices_; + } + + const std::vector& constraintIndices() const + { + return constraint_indices_; + } + + const CooEntriesT& jacobian() const + { + return jacobian_; + } + + const CooEntriesT& hessian() const + { + return hessian_; + } + + protected: + /** + * @param[in] id - Case device `id` + * @param[in] terminals - Bus number of each terminal + * @param[in] size_internal - Number of internal variables + * @param[in] size_internal_constraints - Number of internal constraints + */ + Component(std::string id, + std::vector terminals, + IdxT size_internal, + IdxT size_internal_constraints) + : id_(std::move(id)), + terminals_(std::move(terminals)), + size_internal_(size_internal), + constraint_lower_(size_internal_constraints, -UNBOUNDED), + constraint_upper_(size_internal_constraints, UNBOUNDED), + variable_indices_(size_internal + TERMINAL_SIZE * terminals_.size(), INVALID_INDEX), + constraint_indices_(size_internal_constraints + TERMINAL_SIZE * terminals_.size(), INVALID_INDEX) + { + } + + /** + * @brief Log `message` for this component if `condition` fails + * + * @return 0 if `condition` holds, 1 otherwise + */ + int check(bool condition, const char* message) const + { + if (condition) + { + return 0; + } + Log::error() << id_ << ": " << message << "\n"; + return 1; + } + + /** + * @brief Power into the bus at `terminal` given by the state + * + * @return false if the state has no current for the terminal or no + * voltage for its bus + */ + bool statePower(const Model::StateData& state, IdxT terminal, RealT& p, RealT& q) const + { + return Model::terminalPower(state, id_, terminals_[terminal], terminal, terminals_.size(), p, q); + } + + std::string id_; + std::vector terminals_; + IdxT size_internal_{0}; + std::vector constraint_lower_; + std::vector constraint_upper_; + std::vector variable_indices_; + std::vector constraint_indices_; + CooEntriesT jacobian_; + CooEntriesT hessian_; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/ComponentData.hpp b/GridKit/Model/OptimalPowerFlow/ComponentData.hpp new file mode 100644 index 0000000000..edf449d6e7 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/ComponentData.hpp @@ -0,0 +1,88 @@ +/** + * @file ComponentData.hpp + * @brief Data of optimal power flow components. + */ + +#pragma once + +#include +#include +#include +#include + +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Unified interface for `Component` data containers + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + * @tparam parameters_enum Enumeration over parameters + * @tparam buses_enum Enumeration over terminal buses + */ + template + requires std::is_enum_v && std::is_enum_v + struct ComponentData + { + using RealT = real_type; + using IdxT = index_type; + using Parameters = parameters_enum; + using Buses = buses_enum; + + /// Case device `id` + std::string id; + + /// Mapping of parameters to parameter values + std::map parameters; + + /// Mapping of terminals to bus numbers + std::map buses; + }; + + /** + * @brief Value of parameter `key`, or `fallback` if it is not set + */ + template + typename DataT::RealT parameter(const DataT& data, + typename DataT::Parameters key, + typename DataT::RealT fallback) + { + const auto entry = data.parameters.find(key); + if (entry == data.parameters.end()) + { + return fallback; + } + return entry->second; + } + + /** + * @brief Bus number of each terminal in `Buses` order + * + * A terminal without a bus gets `INVALID_INDEX`. + */ + template + std::vector busNumbers(const DataT& data) + { + using IdxT = typename DataT::IdxT; + + std::vector numbers; + for (const auto terminal : magic_enum::enum_values()) + { + IdxT number = INVALID_INDEX; + const auto entry = data.buses.find(terminal); + if (entry != data.buses.end()) + { + number = entry->second; + } + numbers.push_back(number); + } + return numbers; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp b/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp new file mode 100644 index 0000000000..54c509feea --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp @@ -0,0 +1,60 @@ +/** + * @file ComponentModel.hpp + * @brief Evaluation of an optimal power flow component from its kernels. + */ + +#pragma once + +#include +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Component evaluated from the kernels of `model_type` + * + * `model_type` provides `objective(x)` and `constraints(x, g)` over its + * local variables, the sizes `VARIABLE_SIZE`, `CONSTRAINT_SIZE`, + * `INTERNAL_SIZE` and `INTERNAL_CONSTRAINT_SIZE`, and `CONSTANT`, which is + * true when neither kernel depends on the variables. `g` starts at zero, + * so a kernel writes only the rows it contributes to. Derivatives come + * from Enzyme for double scalars and from the system dependencies for + * `DependencyTracking::Variable`. + * + * @tparam model_type - Derived component model + */ + template + class ComponentModel : public Component + { + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename Component::RealT; + + int evaluateObjective(const ScalarT* x, ScalarT& f) override; + int evaluateGradient(const ScalarT* x, RealT* gradient) override; + int evaluateConstraints(const ScalarT* x, ScalarT* g) override; + int evaluateJacobian(const ScalarT* x) override; + int evaluateHessian(const ScalarT* x, RealT sigma, const RealT* lambda) override; + int evaluateTerminalPower(const ScalarT* x, ScalarT* power) override; + + protected: + /** + * @param[in] id - Case device `id` + * @param[in] terminals - Bus number of each terminal + */ + ComponentModel(std::string id, std::vector terminals); + + private: + static constexpr bool hasEnzymeDerivatives(); + + const model_type& model() const; + + auto gather(const ScalarT* x) const; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp b/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp new file mode 100644 index 0000000000..cddb7cff0b --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp @@ -0,0 +1,179 @@ +/** + * @file ComponentModelImpl.hpp + * @brief Definition of `ComponentModel`, included by model translation units. + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + // Defined in the Enzyme drivers, which only Enzyme translation units include + template + struct DfDx; + + template + struct DgDx; + + template + struct D2LDx2; + } // namespace Sparse + } // namespace Enzyme + + namespace OptimalPowerFlow + { + /** + * @brief Enzyme derivatives exist for double scalars of models that + * depend on the variables + */ + template + constexpr bool ComponentModel::hasEnzymeDerivatives() + { + return std::is_same_v && !model_type::CONSTANT; + } + + template + const model_type& ComponentModel::model() const + { + return static_cast(*this); + } + + /** + * @brief Local variables gathered from the system variables + */ + template + auto ComponentModel::gather(const ScalarT* x) const + { + std::array local{}; + for (IdxT j = 0; j < model_type::VARIABLE_SIZE; ++j) + { + local[j] = x[this->variable_indices_[j]]; + } + return local; + } + + template + ComponentModel::ComponentModel(std::string id, + std::vector terminals) + : Component(std::move(id), + std::move(terminals), + model_type::INTERNAL_SIZE, + model_type::INTERNAL_CONSTRAINT_SIZE) + { + assert(this->size() == model_type::VARIABLE_SIZE); + assert(this->sizeConstraints() == model_type::CONSTRAINT_SIZE); + } + + template + int ComponentModel::evaluateObjective(const ScalarT* x, ScalarT& f) + { + const auto local = gather(x); + f += model().objective(local.data()); + return 0; + } + + template + int ComponentModel::evaluateGradient(const ScalarT* x, RealT* gradient) + { + if constexpr (hasEnzymeDerivatives()) + { + const auto local = gather(x); + std::array local_gradient{}; + Enzyme::Sparse::DfDx::eval(&model(), local.data(), local_gradient.data()); + + for (IdxT j = 0; j < model_type::VARIABLE_SIZE; ++j) + { + gradient[this->variable_indices_[j]] += local_gradient[j]; + } + } + return 0; + } + + template + int ComponentModel::evaluateConstraints(const ScalarT* x, ScalarT* g) + { + const auto local = gather(x); + std::array local_g{}; + model().constraints(local.data(), local_g.data()); + + for (IdxT i = 0; i < model_type::CONSTRAINT_SIZE; ++i) + { + const IdxT row = this->constraint_indices_[i]; + if (row != INVALID_INDEX) + { + g[row] += local_g[i]; + } + } + return 0; + } + + template + int ComponentModel::evaluateJacobian(const ScalarT* x) + { + this->jacobian_.clear(); + if constexpr (hasEnzymeDerivatives()) + { + const auto local = gather(x); + Enzyme::Sparse::DgDx::eval(&model(), + this->variable_indices_.size(), + this->constraint_indices_.data(), + this->variable_indices_.data(), + local.data(), + &this->jacobian_); + } + return 0; + } + + template + int ComponentModel::evaluateHessian(const ScalarT* x, + RealT sigma, + const RealT* lambda) + { + this->hessian_.clear(); + if constexpr (hasEnzymeDerivatives()) + { + const auto local = gather(x); + std::array multipliers{}; + for (IdxT i = 0; i < model_type::CONSTRAINT_SIZE; ++i) + { + const IdxT row = this->constraint_indices_[i]; + if (row != INVALID_INDEX) + { + multipliers[i] = lambda[row]; + } + } + + Enzyme::Sparse::D2LDx2::eval(&model(), + this->variable_indices_.size(), + this->variable_indices_.data(), + local.data(), + sigma, + multipliers.data(), + &this->hessian_); + } + return 0; + } + + template + int ComponentModel::evaluateTerminalPower(const ScalarT* x, ScalarT* power) + { + const auto local = gather(x); + std::array local_g{}; + model().constraints(local.data(), local_g.data()); + + std::copy(local_g.begin() + model_type::INTERNAL_CONSTRAINT_SIZE, local_g.end(), power); + return 0; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/Generator/CMakeLists.txt new file mode 100644 index 0000000000..c3beab7195 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/CMakeLists.txt @@ -0,0 +1,29 @@ +set(_install_headers Generator.hpp GeneratorData.hpp) + +gridkit_add_library( + optimal_power_flow_generator + SOURCES GeneratorEnzyme.cpp + HEADERS ${_install_headers} + LINK_LIBRARIES + PRIVATE + ClangEnzymeFlags + PUBLIC + GridKit::optimal_power_flow_core + COMPILE_OPTIONS + PRIVATE + -mllvm + -enzyme-auto-sparsity=1 + -fno-math-errno) + +gridkit_add_library( + optimal_power_flow_generator_dependency_tracking + SOURCES GeneratorDependencyTracking.cpp + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +# Link to interface target for all components +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_generator) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_generator_dependency_tracking) diff --git a/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp b/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp new file mode 100644 index 0000000000..5cb4d3f1e2 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp @@ -0,0 +1,60 @@ +/** + * @file Generator.hpp + * @brief Declaration of an optimal power flow generator. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Dispatchable active and reactive power injection with a + * quadratic cost + */ + template + class Generator : public ComponentModel, scalar_type, index_type> + { + using ComponentModelT = ComponentModel, scalar_type, index_type>; + + using ComponentModelT::id_; + using ComponentModelT::variable_indices_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ComponentModelT::RealT; + using ModelDataT = GeneratorData; + + /// Local variables: active and reactive power, then terminal real and imaginary voltage + static constexpr IdxT VARIABLE_SIZE = 4; + /// Local constraints: power into the bus + static constexpr IdxT CONSTRAINT_SIZE = 2; + static constexpr IdxT INTERNAL_SIZE = 2; + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; + static constexpr bool CONSTANT = false; + + explicit Generator(const ModelDataT& data); + + int verify() const override; + int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + + __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; + __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; + + private: + RealT Pmin_{0.0}; + RealT Pmax_{0.0}; + RealT Qmin_{0.0}; + RealT Qmax_{0.0}; + RealT c0_{0.0}; + RealT c1_{0.0}; + RealT c2_{0.0}; + RealT online_{1.0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorData.hpp b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorData.hpp new file mode 100644 index 0000000000..f17fa51c25 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorData.hpp @@ -0,0 +1,43 @@ +/** + * @file GeneratorData.hpp + * @brief Modeling data for optimal power flow generators. + */ + +#pragma once + +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Parameters for a generator + enum class GeneratorParameters : size_t + { + Pmin, ///< \f$P^{\min}\f$ Active power lower limit [p.u.] + Pmax, ///< \f$P^{\max}\f$ Active power upper limit [p.u.] + Qmin, ///< \f$Q^{\min}\f$ Reactive power lower limit [p.u.] + Qmax, ///< \f$Q^{\max}\f$ Reactive power upper limit [p.u.] + c0, ///< \f$c_0\f$ Constant cost coefficient + c1, ///< \f$c_1\f$ Linear cost coefficient + c2, ///< \f$c_2\f$ Quadratic cost coefficient + }; + + /// Buses for a generator + enum class GeneratorBuses : size_t + { + bus, ///< Terminal bus + }; + + /** + * @brief Contains modeling data for a Generator + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + */ + template + using GeneratorData = ComponentData; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorDependencyTracking.cpp new file mode 100644 index 0000000000..b7dc76f147 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorDependencyTracking.cpp @@ -0,0 +1,18 @@ +/** + * @file GeneratorDependencyTracking.cpp + * @brief Optimal power flow generator instantiation for `DependencyTracking::Variable`. + */ + +#include + +#include "GeneratorImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, DependencyTracking::Variable, size_t>; + template class Generator; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorEnzyme.cpp b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorEnzyme.cpp new file mode 100644 index 0000000000..4b0245ef84 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorEnzyme.cpp @@ -0,0 +1,20 @@ +/** + * @file GeneratorEnzyme.cpp + * @brief Optimal power flow generator instantiation with Enzyme derivatives. + */ + +#include +#include +#include + +#include "GeneratorImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, double, size_t>; + template class Generator; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp new file mode 100644 index 0000000000..192473a05e --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp @@ -0,0 +1,109 @@ +/** + * @file GeneratorImpl.hpp + * @brief Definition of an optimal power flow generator. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + template + Generator::Generator(const ModelDataT& data) + : ComponentModelT(data.id, busNumbers(data)), + Pmin_(parameter(data, GeneratorParameters::Pmin, -UNBOUNDED)), + Pmax_(parameter(data, GeneratorParameters::Pmax, UNBOUNDED)), + Qmin_(parameter(data, GeneratorParameters::Qmin, -UNBOUNDED)), + Qmax_(parameter(data, GeneratorParameters::Qmax, UNBOUNDED)), + c0_(parameter(data, GeneratorParameters::c0, ZERO)), + c1_(parameter(data, GeneratorParameters::c1, ZERO)), + c2_(parameter(data, GeneratorParameters::c2, ZERO)) + { + } + + template + int Generator::verify() const + { + return this->check(Pmin_ <= Pmax_, "Pmin must not exceed Pmax") + + this->check(Qmin_ <= Qmax_, "Qmin must not exceed Qmax") + + this->check(std::isfinite(c0_), "c0 must be finite") + + this->check(std::isfinite(c1_), "c1 must be finite") + + this->check(std::isfinite(c2_), "c2 must be finite"); + } + + /** + * @brief Start from the state injection and bound it by the limits + * + * An offline generator injects no power and has no cost. + */ + template + int Generator::initialize(const Model::StateData& state, + ScalarT* x, + RealT* x_lower, + RealT* x_upper) + { + bool online = true; + const Model::StateRecord* record = state.device(id_); + if (record != nullptr) + { + online = record->flag("online", true); + } + + RealT p = ZERO; + RealT q = ZERO; + this->statePower(state, 0, p, q); + + RealT p_lower = Pmin_; + RealT p_upper = Pmax_; + RealT q_lower = Qmin_; + RealT q_upper = Qmax_; + + online_ = ONE; + if (!online) + { + online_ = ZERO; + p = ZERO; + q = ZERO; + p_lower = ZERO; + p_upper = ZERO; + q_lower = ZERO; + q_upper = ZERO; + } + + const IdxT p_index = variable_indices_[0]; + const IdxT q_index = variable_indices_[1]; + + x[p_index] = p; + x[q_index] = q; + x_lower[p_index] = p_lower; + x_upper[p_index] = p_upper; + x_lower[q_index] = q_lower; + x_upper[q_index] = q_upper; + + return 0; + } + + template + __attribute__((always_inline)) inline typename Generator::ScalarT + Generator::objective(const ScalarT* x) const + { + const ScalarT p = x[0]; + return online_ * (c0_ + c1_ * p + c2_ * p * p); + } + + template + __attribute__((always_inline)) inline void + Generator::constraints(const ScalarT* x, ScalarT* g) const + { + g[0] = x[0]; + g[1] = x[1]; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/README.md b/GridKit/Model/OptimalPowerFlow/Generator/README.md new file mode 100644 index 0000000000..2c23071623 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Generator/README.md @@ -0,0 +1,92 @@ +# Generator + +Dispatchable active and reactive power injection with a quadratic cost. The +`OptimalDispatch` application makes one for every GENROU, GENSAL, +GenClassical, and REGCA device in the case, with limits and costs from the +MATPOWER case on the system base. + +## Model Parameters + +Symbol | Units | JSON | Description | Typical Value | Note +---------------------|--------|--------|-------------------------------|---------------|----- +$P^{\min}$ | [p.u.] | `Pmin` | Active power lower limit | 0 | Default unbounded +$P^{\max}$ | [p.u.] | `Pmax` | Active power upper limit | 1 | Default unbounded +$Q^{\min}$ | [p.u.] | `Qmin` | Reactive power lower limit | -0.5 | Default unbounded +$Q^{\max}$ | [p.u.] | `Qmax` | Reactive power upper limit | 0.5 | Default unbounded +$c_0$ | | `c0` | Constant cost coefficient | 0 | Default 0 +$c_1$ | | `c1` | Linear cost coefficient | 1000 | Default 0 +$c_2$ | | `c2` | Quadratic cost coefficient | 100 | Default 0 + +Values are on the system base. + +### Parameter Validation + +- $P^{\min} \le P^{\max}$ +- $Q^{\min} \le Q^{\max}$ +- $c_0$, $c_1$, and $c_2$ are finite + +### Model Derived Parameters + +None. + +## Model Ports + +Name | Port | Init | Description +------|------|-------|------------ +`bus` | Bus | Known | Terminal bus + +## Model Variables + +### Internal Variables + +Symbol | Units | Description | Note +-------|--------|--------------------------------|----- +$P$ | [p.u.] | Active power into the bus | System base +$Q$ | [p.u.] | Reactive power into the bus | System base + +### External Variables + +Symbol | Units | Description | Note +-----------------|--------|------------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus + +## Model Equations + +### Objective + +```math +a \left(c_0 + c_1 P + c_2 P^2\right) +``` + +### External Constraints + +```math +\begin{aligned} +\Delta P^\mathrm{bus} &\mathrel{+}= P \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= Q +\end{aligned} +``` + +### Bounds + +```math +\begin{aligned} +P^{\min} &\le P \le P^{\max} \\ +Q^{\min} &\le Q \le Q^{\max} +\end{aligned} +``` + +An offline generator has $P = Q = 0$. + +## Initialization + +The state terminal current and bus voltage give the starting point, which is +zero without them: + +```math +P + jQ \leftarrow V_\mathrm{bus} I^* +``` + +$a \leftarrow 0$ if the state marks the device `online` as false, and $a +\leftarrow 1$ otherwise. diff --git a/GridKit/Model/OptimalPowerFlow/Load/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/Load/CMakeLists.txt new file mode 100644 index 0000000000..45d58b4a51 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/CMakeLists.txt @@ -0,0 +1,21 @@ +set(_install_headers Load.hpp LoadData.hpp) + +# Constant kernels have no derivatives, so no Enzyme is needed +gridkit_add_library( + optimal_power_flow_load + SOURCES Load.cpp + HEADERS ${_install_headers} + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +gridkit_add_library( + optimal_power_flow_load_dependency_tracking + SOURCES LoadDependencyTracking.cpp + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +# Link to interface target for all components +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_load) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_load_dependency_tracking) diff --git a/GridKit/Model/OptimalPowerFlow/Load/Load.cpp b/GridKit/Model/OptimalPowerFlow/Load/Load.cpp new file mode 100644 index 0000000000..4b86d69c1c --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/Load.cpp @@ -0,0 +1,17 @@ +/** + * @file Load.cpp + * @brief Optimal power flow load instantiation. Its kernels are constant, so + * no Enzyme is needed. + */ + +#include "LoadImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, double, size_t>; + template class Load; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/Load.hpp b/GridKit/Model/OptimalPowerFlow/Load/Load.hpp new file mode 100644 index 0000000000..404f85c5ac --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/Load.hpp @@ -0,0 +1,52 @@ +/** + * @file Load.hpp + * @brief Declaration of an optimal power flow load. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Fixed power demand given by the state + */ + template + class Load : public ComponentModel, scalar_type, index_type> + { + using ComponentModelT = ComponentModel, scalar_type, index_type>; + + using ComponentModelT::id_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ComponentModelT::RealT; + using ModelDataT = LoadData; + + /// Local variables: terminal real and imaginary voltage + static constexpr IdxT VARIABLE_SIZE = 2; + /// Local constraints: power into the bus + static constexpr IdxT CONSTRAINT_SIZE = 2; + static constexpr IdxT INTERNAL_SIZE = 0; + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; + static constexpr bool CONSTANT = true; + + explicit Load(const ModelDataT& data); + + int verify() const override; + int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + + __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; + __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; + + private: + RealT p_{0.0}; + RealT q_{0.0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp b/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp new file mode 100644 index 0000000000..8b4ee0f741 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp @@ -0,0 +1,36 @@ +/** + * @file LoadData.hpp + * @brief Modeling data for optimal power flow loads. + */ + +#pragma once + +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Parameters for a load, whose demand comes from the state + enum class LoadParameters : size_t + { + }; + + /// Buses for a load + enum class LoadBuses : size_t + { + bus, ///< Terminal bus + }; + + /** + * @brief Contains modeling data for a Load + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + */ + template + using LoadData = ComponentData; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/LoadDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/Load/LoadDependencyTracking.cpp new file mode 100644 index 0000000000..aa8b596c0b --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/LoadDependencyTracking.cpp @@ -0,0 +1,18 @@ +/** + * @file LoadDependencyTracking.cpp + * @brief Optimal power flow load instantiation for `DependencyTracking::Variable`. + */ + +#include + +#include "LoadImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, DependencyTracking::Variable, size_t>; + template class Load; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp b/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp new file mode 100644 index 0000000000..78cd65b2c7 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp @@ -0,0 +1,67 @@ +/** + * @file LoadImpl.hpp + * @brief Definition of an optimal power flow load. + */ + +#pragma once + +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + template + Load::Load(const ModelDataT& data) + : ComponentModelT(data.id, busNumbers(data)) + { + } + + template + int Load::verify() const + { + return 0; + } + + /** + * @brief Take the demand from the state injection + * + * An offline load draws no power. + */ + template + int Load::initialize(const Model::StateData& state, + [[maybe_unused]] ScalarT* x, + [[maybe_unused]] RealT* x_lower, + [[maybe_unused]] RealT* x_upper) + { + const bool has_power = this->statePower(state, 0, p_, q_); + + const Model::StateRecord* record = state.device(id_); + if (record != nullptr && !record->flag("online", true)) + { + p_ = ZERO; + q_ = ZERO; + return 0; + } + + return this->check(has_power, "state has no current for the load or no voltage for its bus"); + } + + template + __attribute__((always_inline)) inline typename Load::ScalarT + Load::objective([[maybe_unused]] const ScalarT* x) const + { + return ScalarT{ZERO}; + } + + template + __attribute__((always_inline)) inline void + Load::constraints([[maybe_unused]] const ScalarT* x, ScalarT* g) const + { + g[0] = p_; + g[1] = q_; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/README.md b/GridKit/Model/OptimalPowerFlow/Load/README.md new file mode 100644 index 0000000000..9eb95f6c2f --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Load/README.md @@ -0,0 +1,52 @@ +# Load + +Fixed power demand given by the state. The `OptimalDispatch` application makes +one for every LoadZIP device in the case. + +## Model Parameters + +None. + +## Model Ports + +Name | Port | Init | Description +------|------|-------|------------ +`bus` | Bus | Known | Terminal bus + +## Model Variables + +### Internal Variables + +None. + +### External Variables + +Symbol | Units | Description | Note +-----------------|--------|------------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus + +## Model Equations + +### Objective + +None. + +### External Constraints + +```math +\begin{aligned} +\Delta P^\mathrm{bus} &\mathrel{+}= P^\mathrm{state} \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= Q^\mathrm{state} +\end{aligned} +``` + +## Initialization + +The state terminal current and bus voltage give the injection: + +```math +P^\mathrm{state} + jQ^\mathrm{state} \leftarrow V_\mathrm{bus} I^* +``` + +An offline load injects zero. A load without a state current is an error. diff --git a/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp b/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp new file mode 100644 index 0000000000..c081b3f975 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp @@ -0,0 +1,93 @@ +/** + * @file MatpowerData.cpp + * @brief MATPOWER case file input. + */ + +#include +#include +#include +#include +#include +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + const MatpowerMatrix& MatpowerData::matrix(const std::string& name) const + { + const auto entry = matrices.find(name); + if (entry == matrices.end()) + { + throw std::invalid_argument("MATPOWER case has no mpc." + name); + } + return entry->second; + } + + MatpowerData parseMatpowerData(std::istream& stream) + { + static const std::regex matrix_start(R"(\s*mpc\.(\w+)\s*=\s*\[(.*))"); + + MatpowerData data; + MatpowerMatrix* matrix = nullptr; + for (std::string line; std::getline(stream, line);) + { + std::string text = line.substr(0, line.find('%')); + + std::smatch match; + if (matrix == nullptr) + { + if (!std::regex_match(text, match, matrix_start)) + { + continue; + } + matrix = &data.matrices[match[1]]; + text = match[2]; + } + + // Rows end at `;` or at the end of the line, and `]` ends the matrix + const size_t end = text.find(']'); + text = text.substr(0, end); + std::replace(text.begin(), text.end(), ';', '\n'); + + std::istringstream rows(text); + for (std::string row; std::getline(rows, row);) + { + std::istringstream values(row); + std::vector numbers{std::istream_iterator(values), std::istream_iterator()}; + if (!values.eof()) + { + throw std::invalid_argument("MATPOWER matrix row is not numeric: " + row); + } + if (!numbers.empty()) + { + matrix->push_back(std::move(numbers)); + } + } + + if (end != std::string::npos) + { + matrix = nullptr; + } + } + + if (matrix != nullptr) + { + throw std::invalid_argument("MATPOWER matrix is not closed by ]"); + } + return data; + } + + MatpowerData parseMatpowerData(const std::filesystem::path& file) + { + std::ifstream stream(file); + if (!stream) + { + throw std::runtime_error("Could not open MATPOWER case file " + file.string()); + } + return parseMatpowerData(stream); + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp b/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp new file mode 100644 index 0000000000..11ec207247 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp @@ -0,0 +1,61 @@ +/** + * @file MatpowerData.hpp + * @brief Numeric data of a MATPOWER case file. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Rows of a MATPOWER matrix + using MatpowerMatrix = std::vector>; + + /** + * @brief Numeric matrices of a MATPOWER case file by field name + * + * Holds every `mpc. = [ ... ];` matrix. Rows end at `;` or at the + * end of a line and may have any number of columns. Scalars and cell + * arrays such as `mpc.bus_name` are skipped. + */ + struct MatpowerData + { + std::map matrices; + + /// Matrix `mpc.` + const MatpowerMatrix& matrix(const std::string& name) const; + }; + + /// Zero-based columns of MATPOWER `idx_bus`, `idx_brch`, `idx_gen`, and `idx_cost` + namespace MatpowerColumns + { + inline constexpr size_t BUS_I = 0; + inline constexpr size_t VMAX = 11; + inline constexpr size_t VMIN = 12; + inline constexpr size_t F_BUS = 0; + inline constexpr size_t T_BUS = 1; + inline constexpr size_t RATE_A = 5; + inline constexpr size_t BR_STATUS = 10; + inline constexpr size_t GEN_BUS = 0; + inline constexpr size_t QMAX = 3; + inline constexpr size_t QMIN = 4; + inline constexpr size_t GEN_STATUS = 7; + inline constexpr size_t PMAX = 8; + inline constexpr size_t PMIN = 9; + inline constexpr size_t MODEL = 0; + inline constexpr size_t NCOST = 3; + inline constexpr size_t COST = 4; + } // namespace MatpowerColumns + + MatpowerData parseMatpowerData(std::istream& stream); + MatpowerData parseMatpowerData(const std::filesystem::path& file); + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/README.md b/GridKit/Model/OptimalPowerFlow/README.md new file mode 100644 index 0000000000..2d6ea3f860 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/README.md @@ -0,0 +1,86 @@ +# Optimal Power Flow + +AC optimal power flow in Cartesian coordinates. It finds the least-cost +operating point within the component limits and writes it as a +[state](../STATE.md) that PhasorDynamics starts from. + +## Formulation + +```math +\begin{aligned} +\min_x \quad & \sum_g a_g \left(c_{0,g} + c_{1,g} P_g + c_{2,g} P_g^2\right) \\ +\text{s.t.} \quad & \sum_{c \to k} P_{c,k}(x) = 0, \quad \sum_{c \to k} Q_{c,k}(x) = 0 && \text{each bus } k \text{ that is not infinite} \\ +& P_{\ell,k}^2 + Q_{\ell,k}^2 \le \left(S_\ell^{\max}\right)^2 && \text{each terminal } k \text{ of a rated branch } \ell \\ +& \left(V_k^{\min}\right)^2 \le V_{\mathrm{r}k}^2 + V_{\mathrm{i}k}^2 \le \left(V_k^{\max}\right)^2 \\ +& P_g^{\min} \le P_g \le P_g^{\max}, \quad Q_g^{\min} \le Q_g \le Q_g^{\max} \\ +& V_{\mathrm{r}}^\mathrm{state} V_{\mathrm{i}} - V_{\mathrm{i}}^\mathrm{state} V_{\mathrm{r}} = 0 && \text{reference bus} +\end{aligned} +``` + +- $P_{c,k}$ and $Q_{c,k}$ are the power component $c$ injects into bus $k$. + Every sign in this family is positive into the bus. +- $a_g$ is one for an online generator and zero for an offline one. +- The reference bus is the lowest-numbered bus. With an infinite bus there is + no reference bus. An infinite bus keeps its state voltage, has no balance + rows, and supplies any mismatch. +- A constraint without a finite bound gets no row. + +## Components + +Component | Variables | Constraints | Kernels +------------|----------------------|----------------------------------|---------- +`Bus` | $V_\mathrm{r}$, $V_\mathrm{i}$ | Power balance, $\lvert V \rvert^2$, and angle reference | Quadratic +`Branch` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | $\lvert S_1 \rvert^2$, $\lvert S_2 \rvert^2$ and power into both buses | Quartic +`Generator` | $P$, $Q$ and terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus | Quadratic cost +`Load` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus, fixed by the state | Constant +`Shunt` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus | Quadratic + +Local variables are the internal variables followed by $V_\mathrm{r}$ and +$V_\mathrm{i}$ of each terminal bus. Local constraints are the internal +constraints followed by $P$ and $Q$ into each terminal bus. `SystemModel` maps both to global indices, so a +device adds its injection to the balance rows of its buses. + +## Derivatives + +Each model supplies two kernels over its local variables, `objective(x)` and +`constraints(x, g)`. `ComponentModel` differentiates them with Enzyme: + +Driver | Derivative | Mode +---------|------------------------------------------------------|--------------------- +`DfDx` | Objective gradient | Reverse +`DgDx` | Constraint Jacobian | Forward, one sweep per local variable +`D2LDx2` | Lower triangle of the Hessian of $\sigma f + \lambda^T g$ | Forward over reverse + +The Jacobian and Hessian stores are sparse. Enzyme's sparsity analysis stores +every structural entry, numerical zeros included, so the patterns set in +`allocate()` hold at every point and for every multiplier. `Load` has a +constant kernel and no entries. + +The `DependencyTracking::Variable` instantiations give the same Jacobian and +objective gradient from dependencies. Tests compare the two. + +## Data + +`SystemModelData` holds the network. The `OptimalDispatch` application builds +it from a PhasorDynamics case, and `applyMatpowerData` adds limits and costs +from a [MATPOWER case](https://matpower.org/docs/ref/matpower/caseformat.html) +of the same network: + +- Buses match by number and take `VMIN` and `VMAX`. +- The in-service branches between two buses match the branches between them + in order and take a nonzero `RATE_A`. +- The in-service generators at a bus match the generators at that bus in + order and take `PMIN`, `PMAX`, `QMIN`, `QMAX`, and their polynomial cost of + at most second order. MATPOWER generators at a bus without generators are + static injections that the loads already carry. +- Values in MW, Mvar, and MVA and costs in P [MW] become system base values. + +`parseMatpowerData` reads every numeric `mpc.` matrix. Rows end at `;` or +at the end of a line, so both MATPOWER and PowerWorld exports read. + +## State + +`SystemModel` reads the starting point, the load demand, and the device settings +`online`, `open`, `tap`, and `phase` from a state. `solutionState()` returns +that state with the solved bus voltages and the terminal currents of every +device, computed from the power into each terminal bus. diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/Shunt/CMakeLists.txt new file mode 100644 index 0000000000..a4f91d47fe --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/CMakeLists.txt @@ -0,0 +1,29 @@ +set(_install_headers Shunt.hpp ShuntData.hpp) + +gridkit_add_library( + optimal_power_flow_shunt + SOURCES ShuntEnzyme.cpp + HEADERS ${_install_headers} + LINK_LIBRARIES + PRIVATE + ClangEnzymeFlags + PUBLIC + GridKit::optimal_power_flow_core + COMPILE_OPTIONS + PRIVATE + -mllvm + -enzyme-auto-sparsity=1 + -fno-math-errno) + +gridkit_add_library( + optimal_power_flow_shunt_dependency_tracking + SOURCES ShuntDependencyTracking.cpp + LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_core) + +# Link to interface target for all components +target_link_libraries( + optimal_power_flow_components + INTERFACE GridKit::optimal_power_flow_shunt) +target_link_libraries( + optimal_power_flow_components_dependency_tracking + INTERFACE GridKit::optimal_power_flow_shunt_dependency_tracking) diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/README.md b/GridKit/Model/OptimalPowerFlow/Shunt/README.md new file mode 100644 index 0000000000..4d145bed01 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/README.md @@ -0,0 +1,60 @@ +# Shunt + +Constant admittance $Y = G + jB$ to ground. The `OptimalDispatch` application +makes one for every LoadZ device in the case. + +## Model Parameters + +Symbol | Units | JSON | Description | Typical Value | Note +-------|--------|------|-------------------|---------------|----- +$G$ | [p.u.] | `G` | Shunt conductance | | $R / (R^2 + X^2)$ of the LoadZ +$B$ | [p.u.] | `B` | Shunt susceptance | | $-X / (R^2 + X^2)$ of the LoadZ + +### Parameter Validation + +- $G$ and $B$ are finite + +### Model Derived Parameters + +None. + +## Model Ports + +Name | Port | Init | Description +------|------|-------|------------ +`bus` | Bus | Known | Terminal bus + +## Model Variables + +### Internal Variables + +None. + +### External Variables + +Symbol | Units | Description | Note +-----------------|--------|------------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus + +## Model Equations + +### Objective + +None. + +### External Constraints + +Power into the bus is $-Y^* \lvert V \rvert^2$: + +```math +\begin{aligned} +\Delta P^\mathrm{bus} &\mathrel{+}= -a G \left(V_\mathrm{r}^2 + V_\mathrm{i}^2\right) \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= a B \left(V_\mathrm{r}^2 + V_\mathrm{i}^2\right) +\end{aligned} +``` + +## Initialization + +$a \leftarrow 0$ if the state marks the device `online` as false, and $a +\leftarrow 1$ otherwise. diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp b/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp new file mode 100644 index 0000000000..517c22a3e8 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp @@ -0,0 +1,55 @@ +/** + * @file Shunt.hpp + * @brief Declaration of an optimal power flow shunt. + */ + +#pragma once + +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Constant admittance \f$Y = G + jB\f$ to ground + * + * Power into the bus is \f$-Y^* V^2\f$. + */ + template + class Shunt : public ComponentModel, scalar_type, index_type> + { + using ComponentModelT = ComponentModel, scalar_type, index_type>; + + using ComponentModelT::id_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ComponentModelT::RealT; + using ModelDataT = ShuntData; + + /// Local variables: terminal real and imaginary voltage + static constexpr IdxT VARIABLE_SIZE = 2; + /// Local constraints: power into the bus + static constexpr IdxT CONSTRAINT_SIZE = 2; + static constexpr IdxT INTERNAL_SIZE = 0; + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; + static constexpr bool CONSTANT = false; + + explicit Shunt(const ModelDataT& data); + + int verify() const override; + int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + + __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; + __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; + + private: + RealT G_{0.0}; + RealT B_{0.0}; + RealT online_{1.0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntData.hpp b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntData.hpp new file mode 100644 index 0000000000..d309557727 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntData.hpp @@ -0,0 +1,38 @@ +/** + * @file ShuntData.hpp + * @brief Modeling data for optimal power flow shunts. + */ + +#pragma once + +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /// Parameters for a shunt + enum class ShuntParameters : size_t + { + G, ///< \f$G\f$ Shunt conductance [p.u.] + B, ///< \f$B\f$ Shunt susceptance [p.u.] + }; + + /// Buses for a shunt + enum class ShuntBuses : size_t + { + bus, ///< Terminal bus + }; + + /** + * @brief Contains modeling data for a Shunt + * + * @tparam real_type Real parameter data type + * @tparam index_type Integer data type + */ + template + using ShuntData = ComponentData; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntDependencyTracking.cpp new file mode 100644 index 0000000000..95b79f6cfa --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntDependencyTracking.cpp @@ -0,0 +1,18 @@ +/** + * @file ShuntDependencyTracking.cpp + * @brief Optimal power flow shunt instantiation for `DependencyTracking::Variable`. + */ + +#include + +#include "ShuntImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, DependencyTracking::Variable, size_t>; + template class Shunt; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntEnzyme.cpp b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntEnzyme.cpp new file mode 100644 index 0000000000..6aead93885 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntEnzyme.cpp @@ -0,0 +1,20 @@ +/** + * @file ShuntEnzyme.cpp + * @brief Optimal power flow shunt instantiation with Enzyme derivatives. + */ + +#include +#include +#include + +#include "ShuntImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + // Available template instantiations + template class ComponentModel, double, size_t>; + template class Shunt; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp new file mode 100644 index 0000000000..38fb4807be --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp @@ -0,0 +1,70 @@ +/** + * @file ShuntImpl.hpp + * @brief Definition of an optimal power flow shunt. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + template + Shunt::Shunt(const ModelDataT& data) + : ComponentModelT(data.id, busNumbers(data)), + G_(parameter(data, ShuntParameters::G, ZERO)), + B_(parameter(data, ShuntParameters::B, ZERO)) + { + } + + template + int Shunt::verify() const + { + return this->check(std::isfinite(G_), "G must be finite") + + this->check(std::isfinite(B_), "B must be finite"); + } + + /** + * @brief An offline shunt draws no power + */ + template + int Shunt::initialize(const Model::StateData& state, + [[maybe_unused]] ScalarT* x, + [[maybe_unused]] RealT* x_lower, + [[maybe_unused]] RealT* x_upper) + { + online_ = ONE; + + const Model::StateRecord* record = state.device(id_); + if (record != nullptr && !record->flag("online", true)) + { + online_ = ZERO; + } + + return 0; + } + + template + __attribute__((always_inline)) inline typename Shunt::ScalarT + Shunt::objective([[maybe_unused]] const ScalarT* x) const + { + return ScalarT{ZERO}; + } + + template + __attribute__((always_inline)) inline void + Shunt::constraints(const ScalarT* x, ScalarT* g) const + { + const ScalarT v2 = x[0] * x[0] + x[1] * x[1]; + + g[0] = -online_ * G_ * v2; + g[1] = online_ * B_ * v2; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModel.hpp b/GridKit/Model/OptimalPowerFlow/SystemModel.hpp new file mode 100644 index 0000000000..a2cf8ffb1c --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModel.hpp @@ -0,0 +1,97 @@ +/** + * @file SystemModel.hpp + * @brief Optimal power flow system model. + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + template + class Bus; + + /** + * @brief AC optimal power flow in Cartesian coordinates + * + * Minimizes the generation cost subject to the power balance at every + * bus that is not infinite and the bounds of the components. The state + * gives the starting point, the fixed demand, and the device settings. + * The reference bus is the lowest-numbered bus unless an infinite bus + * sets the angle reference. + */ + template + class SystemModel : public Model::OptimizationEvaluator + { + using EvaluatorT = Model::OptimizationEvaluator; + + using EvaluatorT::f_; + using EvaluatorT::g_; + using EvaluatorT::g_lower_; + using EvaluatorT::g_upper_; + using EvaluatorT::gradient_; + using EvaluatorT::hessian_; + using EvaluatorT::jacobian_; + using EvaluatorT::x_; + using EvaluatorT::x_lower_; + using EvaluatorT::x_upper_; + + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename EvaluatorT::RealT; + using CsrMatrixT = typename EvaluatorT::CsrMatrixT; + using ComponentT = Component; + using BusT = Bus; + using CooEntriesT = typename ComponentT::CooEntriesT; + + SystemModel(const SystemModelData& data, const Model::StateData& state); + + int allocate() override; + int initialize() override; + + int evaluateObjective() override; + int evaluateGradient() override; + int evaluateConstraints() override; + int evaluateJacobian() override; + int evaluateHessian(RealT sigma, const RealT* lambda) override; + + /// Input state with the bus voltages and device currents at `x()` + Model::StateData solutionState() const; + + private: + using EntriesT = const CooEntriesT& (ComponentT::*) () const; + + int verify() const; + int connect(ComponentT& component); + int allocateDerivatives(); + + std::unique_ptr assemble(IdxT rows, IdxT cols, EntriesT entries, std::vector& map_to_csr) const; + int refill(CsrMatrixT& matrix, EntriesT entries, const std::vector& map_to_csr) const; + + Model::StateData state_; + + /// Buses first, then devices + std::vector> components_; + + /// Buses by number + std::map buses_; + + /// Map from component entries to CSR entries + std::vector jacobian_map_; + std::vector hessian_map_; + + int data_errors_{0}; + }; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp new file mode 100644 index 0000000000..7f7265365d --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp @@ -0,0 +1,201 @@ +/** + * @file SystemModelData.cpp + * @brief Optimal power flow limits and costs from a MATPOWER case. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + namespace + { + namespace Column = MatpowerColumns; + + using SystemModelDataT = SystemModelData; + using BusPair = std::pair; + + /// MATPOWER polynomial cost model + constexpr double POLYNOMIAL = 2.0; + + /// Buses of a branch in increasing order + BusPair busPair(size_t bus1, size_t bus2) + { + return {std::min(bus1, bus2), std::max(bus1, bus2)}; + } + + std::string name(const BusPair& buses) + { + return "Branch " + std::to_string(buses.first) + "-" + std::to_string(buses.second); + } + + /// Voltage limits of the buses, matched by number + void applyBuses(SystemModelDataT& data, const MatpowerMatrix& rows) + { + std::map buses; + for (auto& bus : data.bus) + { + buses[bus.number] = &bus; + } + + for (const auto& row : rows) + { + const auto number = static_cast(row.at(Column::BUS_I)); + const auto bus = buses.find(number); + if (bus == buses.end()) + { + throw std::invalid_argument("MATPOWER bus " + std::to_string(number) + " is not in the case"); + } + bus->second->parameters[BusParameters::Vmin] = row.at(Column::VMIN); + bus->second->parameters[BusParameters::Vmax] = row.at(Column::VMAX); + } + + if (rows.size() != data.bus.size()) + { + throw std::invalid_argument("MATPOWER case has " + std::to_string(rows.size()) + " buses, but the case has " + + std::to_string(data.bus.size())); + } + } + + /// Ratings of the branches, matched in order by their buses + void applyBranches(SystemModelDataT& data, const MatpowerMatrix& rows, double mva_base) + { + std::map> branches; + for (auto& branch : data.branch) + { + branches[busPair(branch.buses.at(BranchBuses::bus1), branch.buses.at(BranchBuses::bus2))].push_back(&branch); + } + + std::map matched; + for (const auto& row : rows) + { + if (row.at(Column::BR_STATUS) <= 0.0) + { + continue; + } + + const BusPair buses = busPair(static_cast(row.at(Column::F_BUS)), static_cast(row.at(Column::T_BUS))); + size_t& count = matched[buses]; + if (count == branches[buses].size()) + { + throw std::invalid_argument(name(buses) + " has more in-service MATPOWER branches than the case"); + } + + // A zero rating is unlimited + auto& branch = *branches[buses][count++]; + if (row.at(Column::RATE_A) > 0.0) + { + branch.parameters[BranchParameters::Smax] = row.at(Column::RATE_A) / mva_base; + } + } + + for (const auto& [buses, list] : branches) + { + if (matched[buses] != list.size()) + { + throw std::invalid_argument(name(buses) + " has fewer in-service MATPOWER branches than the case"); + } + } + } + + /** + * @brief Costs from a MATPOWER polynomial in P [MW], whose coefficients + * run from the highest order down + */ + void setCost(SystemModelDataT::GeneratorDataT& generator, const std::vector& cost, double mva_base) + { + if (cost.at(Column::MODEL) != POLYNOMIAL) + { + throw std::invalid_argument(generator.id + ": only polynomial MATPOWER costs are supported"); + } + + const auto n = static_cast(cost.at(Column::NCOST)); + std::array coefficients{}; + double scale = 1.0; + for (size_t k = 0; k < n; ++k) + { + const double coefficient = cost.at(Column::COST + n - 1 - k) * scale; + if (k < coefficients.size()) + { + coefficients[k] = coefficient; + } + else if (coefficient != 0.0) + { + throw std::invalid_argument(generator.id + ": MATPOWER cost is above quadratic"); + } + scale *= mva_base; + } + + generator.parameters[GeneratorParameters::c0] = coefficients[0]; + generator.parameters[GeneratorParameters::c1] = coefficients[1]; + generator.parameters[GeneratorParameters::c2] = coefficients[2]; + } + + /** + * @brief Limits and costs of the generators, matched in order by bus + * + * MATPOWER generators at a bus without generators are skipped. + */ + void applyGenerators(SystemModelDataT& data, const MatpowerMatrix& rows, const MatpowerMatrix& costs, double mva_base) + { + std::map> generators; + for (auto& generator : data.generator) + { + generators[generator.buses.at(GeneratorBuses::bus)].push_back(&generator); + } + + std::map matched; + for (size_t i = 0; i < rows.size(); ++i) + { + const auto& row = rows[i]; + const auto number = static_cast(row.at(Column::GEN_BUS)); + const auto entry = generators.find(number); + if (row.at(Column::GEN_STATUS) <= 0.0 || entry == generators.end()) + { + continue; + } + + size_t& count = matched[number]; + if (count == entry->second.size()) + { + throw std::invalid_argument("Bus " + std::to_string(number) + " has more in-service MATPOWER generators than the case"); + } + + auto& generator = *entry->second[count++]; + generator.parameters[GeneratorParameters::Pmin] = row.at(Column::PMIN) / mva_base; + generator.parameters[GeneratorParameters::Pmax] = row.at(Column::PMAX) / mva_base; + generator.parameters[GeneratorParameters::Qmin] = row.at(Column::QMIN) / mva_base; + generator.parameters[GeneratorParameters::Qmax] = row.at(Column::QMAX) / mva_base; + setCost(generator, costs.at(i), mva_base); + } + + for (const auto& [number, list] : generators) + { + if (matched[number] != list.size()) + { + throw std::invalid_argument("Bus " + std::to_string(number) + " has fewer in-service MATPOWER generators than the case"); + } + } + } + } // namespace + + void applyMatpowerData(SystemModelData& data, const MatpowerData& matpower) + { + const double mva_base = data.va_base / std::mega::num; + + applyBuses(data, matpower.matrix("bus")); + applyBranches(data, matpower.matrix("branch"), mva_base); + applyGenerators(data, matpower.matrix("gen"), matpower.matrix("gencost"), mva_base); + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp b/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp new file mode 100644 index 0000000000..2832963edc --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp @@ -0,0 +1,57 @@ +/** + * @file SystemModelData.hpp + * @brief Data of an optimal power flow system model. + */ + +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief All data needed to build an optimal power flow system model + */ + template + struct SystemModelData + { + using RealT = real_type; + using IdxT = index_type; + using BusDataT = BusData; + using BranchDataT = BranchData; + using GeneratorDataT = GeneratorData; + using LoadDataT = LoadData; + using ShuntDataT = ShuntData; + + RealT va_base{100.0e6}; ///< System power base in VA + + std::vector bus; ///< Buses within the model + std::vector branch; ///< Branches within the model + std::vector generator; ///< Generators within the model + std::vector load; ///< Loads within the model + std::vector shunt; ///< Shunts within the model + }; + + /** + * @brief Set bus voltage limits, branch ratings, and generator limits and + * costs from a MATPOWER case of the same network + * + * Buses match by number. In-service MATPOWER branches match the branches + * between the same buses in order, and in-service MATPOWER generators the + * generators at the same bus. MATPOWER generators at a bus without + * generators are static injections that the loads carry, and are skipped. + * Values in MW, Mvar, and MVA become system base values. + */ + void applyMatpowerData(SystemModelData& data, const MatpowerData& matpower); + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelDependencyTracking.cpp b/GridKit/Model/OptimalPowerFlow/SystemModelDependencyTracking.cpp new file mode 100644 index 0000000000..3ded0fbdf7 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModelDependencyTracking.cpp @@ -0,0 +1,93 @@ +/** + * @file SystemModelDependencyTracking.cpp + * @brief Optimal power flow system derivatives from `DependencyTracking::Variable`. + * + * @note Used for testing the Enzyme derivatives. + */ + +#include "SystemModelImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Derivatives are built from dependencies on each evaluation + */ + template + int SystemModel::allocateDerivatives() + { + return 0; + } + + /** + * @brief Gradient from the objective dependencies + * + * @pre `evaluateObjective()` at the current variables + */ + template + int SystemModel::evaluateGradient() + { + gradient_.setToZero(); + RealT* gradient = gradient_.getData(); + for (const auto& [variable, derivative] : f_.getDependencies()) + { + gradient[variable] = derivative; + } + gradient_.setDataUpdated(); + + return 0; + } + + /** + * @brief Jacobian from the constraint dependencies + * + * @pre `evaluateConstraints()` at the current variables + */ + template + int SystemModel::evaluateJacobian() + { + const IdxT m = g_.getSize(); + const ScalarT* g = g_.getData(); + + IdxT* row_ptrs = new IdxT[m + 1]; + row_ptrs[0] = 0; + for (IdxT row = 0; row < m; ++row) + { + row_ptrs[row + 1] = row_ptrs[row] + g[row].getDependencies().size(); + } + + IdxT* cols = new IdxT[row_ptrs[m]]; + RealT* vals = new RealT[row_ptrs[m]]; + + IdxT counter = 0; + for (IdxT row = 0; row < m; ++row) + { + for (const auto& [col, value] : g[row].getDependencies()) + { + cols[counter] = col; + vals[counter] = value; + ++counter; + } + } + + jacobian_ = std::make_unique(m, x_.getSize(), row_ptrs[m], &row_ptrs, &cols, &vals); + + return 0; + } + + /** + * @brief Not available, because dependencies hold first derivatives only + */ + template + int SystemModel::evaluateHessian([[maybe_unused]] RealT sigma, + [[maybe_unused]] const RealT* lambda) + { + Log::error() << "OptimalPowerFlow::SystemModel: no Hessian for DependencyTracking::Variable\n"; + return 1; + } + + // Available template instantiations + template class SystemModel; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelEnzyme.cpp b/GridKit/Model/OptimalPowerFlow/SystemModelEnzyme.cpp new file mode 100644 index 0000000000..a8daeb78c0 --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModelEnzyme.cpp @@ -0,0 +1,184 @@ +/** + * @file SystemModelEnzyme.cpp + * @brief Optimal power flow system derivatives from component Enzyme entries. + */ + +#include + +#include + +#include "SystemModelImpl.hpp" + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @brief Construct the CSR patterns from the component entries at the + * starting point + * + * Component entries are structural, so the patterns hold at every point + * and every multiplier, including zero. + */ + template + int SystemModel::allocateDerivatives() + { + const ScalarT* x = x_.getData(); + const std::vector lambda(g_.getSize(), ZERO); + for (auto& component : components_) + { + component->evaluateJacobian(x); + component->evaluateHessian(x, ONE, lambda.data()); + } + + jacobian_ = assemble(g_.getSize(), x_.getSize(), &ComponentT::jacobian, jacobian_map_); + hessian_ = assemble(x_.getSize(), x_.getSize(), &ComponentT::hessian, hessian_map_); + + return 0; + } + + template + int SystemModel::evaluateGradient() + { + const ScalarT* x = x_.getData(); + + gradient_.setToZero(); + RealT* gradient = gradient_.getData(); + for (auto& component : components_) + { + component->evaluateGradient(x, gradient); + } + gradient_.setDataUpdated(); + + return 0; + } + + template + int SystemModel::evaluateJacobian() + { + const ScalarT* x = x_.getData(); + for (auto& component : components_) + { + component->evaluateJacobian(x); + } + + return refill(*jacobian_, &ComponentT::jacobian, jacobian_map_); + } + + /** + * @brief Lower triangle of the Hessian of \f$\sigma f + \lambda^T g\f$ + */ + template + int SystemModel::evaluateHessian(RealT sigma, const RealT* lambda) + { + const ScalarT* x = x_.getData(); + for (auto& component : components_) + { + component->evaluateHessian(x, sigma, lambda); + } + + return refill(*hessian_, &ComponentT::hessian, hessian_map_); + } + + /** + * @brief Sort and deduplicate the component entries into a CSR matrix + * + * @param[in] rows - Number of rows + * @param[in] cols - Number of columns + * @param[in] entries - Component entries to assemble + * @param[out] map_to_csr - CSR index of each component entry + */ + template + std::unique_ptr::CsrMatrixT> + SystemModel::assemble(IdxT rows, + IdxT cols, + EntriesT entries, + std::vector& map_to_csr) const + { + IdxT nnz_dup = 0; + for (const auto& component : components_) + { + nnz_dup += ((*component).*entries)().values.size(); + } + + // COO triplet arrays, handed off to the COO matrix + IdxT* rows_dup = new IdxT[nnz_dup]; + IdxT* cols_dup = new IdxT[nnz_dup]; + RealT* vals_dup = new RealT[nnz_dup]; + + IdxT counter = 0; + for (const auto& component : components_) + { + const CooEntriesT& coo = ((*component).*entries)(); + std::copy(coo.rows.begin(), coo.rows.end(), rows_dup + counter); + std::copy(coo.cols.begin(), coo.cols.end(), cols_dup + counter); + std::copy(coo.values.begin(), coo.values.end(), vals_dup + counter); + counter += coo.values.size(); + } + + LinearAlgebra::CooMatrix coo(rows, cols, nnz_dup, &rows_dup, &cols_dup, &vals_dup); + + // Populate CSR data with sort and deduplicate + IdxT* row_ptrs = coo.getCsrRowData(); + const IdxT nnz = coo.getNnz(); + + IdxT* csr_cols = new IdxT[nnz]; + RealT* csr_vals = new RealT[nnz]; + std::copy(coo.getColData(), coo.getColData() + nnz, csr_cols); + std::copy(coo.getValues(), coo.getValues() + nnz, csr_vals); + + const IdxT* map_to_sorted = coo.getMapToSorted(); + const IdxT* map_to_dedup = coo.getMapToDeduplicated(); + + map_to_csr.resize(nnz_dup); + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr[map_to_sorted[i]] = map_to_dedup[i]; + } + + return std::make_unique(rows, cols, nnz, &row_ptrs, &csr_cols, &csr_vals); + } + + /** + * @brief Sum the component entries into the CSR values + * + * @return 1 if the number of component entries changed since assembly + */ + template + int SystemModel::refill(CsrMatrixT& matrix, + EntriesT entries, + const std::vector& map_to_csr) const + { + IdxT nnz_dup = 0; + for (const auto& component : components_) + { + nnz_dup += ((*component).*entries)().values.size(); + } + + if (nnz_dup != map_to_csr.size()) + { + Log::error() << "OptimalPowerFlow::SystemModel: " << nnz_dup << " derivative entries, but " + << map_to_csr.size() << " at assembly\n"; + return 1; + } + + RealT* values = matrix.getValues(); + std::fill_n(values, matrix.getNnz(), ZERO); + + IdxT counter = 0; + for (const auto& component : components_) + { + for (const RealT value : ((*component).*entries)().values) + { + values[map_to_csr[counter]] += value; + ++counter; + } + } + + return 0; + } + + // Available template instantiations + template class SystemModel; + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp new file mode 100644 index 0000000000..6e7c4bc03c --- /dev/null +++ b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp @@ -0,0 +1,290 @@ +/** + * @file SystemModelImpl.hpp + * @brief Definition of the optimal power flow system model. + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace OptimalPowerFlow + { + /** + * @param[in] data - Network, limits, and costs + * @param[in] state - Starting point, fixed demand, and device settings + */ + template + SystemModel::SystemModel(const SystemModelData& data, + const Model::StateData& state) + : state_(state) + { + for (const auto& bus_data : data.bus) + { + auto bus = std::make_unique(bus_data); + if (!buses_.emplace(bus_data.number, bus.get()).second) + { + Log::error() << "OptimalPowerFlow::SystemModel: duplicate bus " << bus_data.number << "\n"; + ++data_errors_; + } + components_.push_back(std::move(bus)); + } + + for (const auto& branch : data.branch) + { + components_.push_back(std::make_unique>(branch)); + } + + for (const auto& generator : data.generator) + { + components_.push_back(std::make_unique>(generator)); + } + + for (const auto& load : data.load) + { + components_.push_back(std::make_unique>(load)); + } + + for (const auto& shunt : data.shunt) + { + components_.push_back(std::make_unique>(shunt)); + } + } + + /** + * @brief Number the variables and the bounded constraints, connect the + * terminals, and set the starting point and the derivative patterns + * + * A constraint without a finite bound gets no row. + */ + template + int SystemModel::allocate() + { + if (verify() != 0) + { + Log::error() << "OptimalPowerFlow::SystemModel: invalid model data\n"; + return 1; + } + + bool has_infinite_bus = false; + for (const auto& [number, bus] : buses_) + { + has_infinite_bus = has_infinite_bus || bus->infinite(); + } + if (!has_infinite_bus && !buses_.empty()) + { + buses_.begin()->second->setReference(); + } + + IdxT n = 0; + IdxT m = 0; + for (auto& component : components_) + { + auto& variables = component->variableIndices(); + for (IdxT j = 0; j < component->sizeInternal(); ++j) + { + variables[j] = n++; + } + + auto& rows = component->constraintIndices(); + for (IdxT i = 0; i < component->sizeInternalConstraints(); ++i) + { + rows[i] = INVALID_INDEX; + if (std::isfinite(component->constraintLower()[i]) || std::isfinite(component->constraintUpper()[i])) + { + rows[i] = m++; + } + } + } + + for (auto& component : components_) + { + if (connect(*component) != 0) + { + return 1; + } + } + + x_.resize(n); + x_lower_.resize(n); + x_upper_.resize(n); + gradient_.resize(n); + g_.resize(m); + g_lower_.resize(m); + g_upper_.resize(m); + + RealT* g_lower = g_lower_.getData(); + RealT* g_upper = g_upper_.getData(); + for (const auto& component : components_) + { + const auto& rows = component->constraintIndices(); + for (IdxT i = 0; i < component->sizeInternalConstraints(); ++i) + { + if (rows[i] != INVALID_INDEX) + { + g_lower[rows[i]] = component->constraintLower()[i]; + g_upper[rows[i]] = component->constraintUpper()[i]; + } + } + } + g_lower_.setDataUpdated(); + g_upper_.setDataUpdated(); + + if (initialize() != 0) + { + Log::error() << "OptimalPowerFlow::SystemModel: initialization from the state failed\n"; + return 1; + } + + return allocateDerivatives(); + } + + /** + * @brief Starting point and variable bounds from the state + */ + template + int SystemModel::initialize() + { + ScalarT* x = x_.getData(); + RealT* x_lower = x_lower_.getData(); + RealT* x_upper = x_upper_.getData(); + + int ret = 0; + for (auto& component : components_) + { + ret += component->initialize(state_, x, x_lower, x_upper); + } + + // For DependencyTracking::Variable, set variable numbers + if constexpr (std::is_same_v) + { + for (IdxT j = 0; j < x_.getSize(); ++j) + { + x[j].setVariableNumber(j); + } + } + + x_.setDataUpdated(); + x_lower_.setDataUpdated(); + x_upper_.setDataUpdated(); + + return ret; + } + + template + int SystemModel::evaluateObjective() + { + const ScalarT* x = x_.getData(); + + f_ = ZERO; + for (auto& component : components_) + { + component->evaluateObjective(x, f_); + } + + return 0; + } + + template + int SystemModel::evaluateConstraints() + { + const ScalarT* x = x_.getData(); + + g_.setToZero(); + ScalarT* g = g_.getData(); + for (auto& component : components_) + { + component->evaluateConstraints(x, g); + } + g_.setDataUpdated(); + + return 0; + } + + /** + * @brief Device currents follow from the power into each terminal bus + */ + template + Model::StateData SystemModel::solutionState() const + { + Model::StateData state = state_; + const ScalarT* x = x_.getData(); + + for (const auto& [number, bus] : buses_) + { + auto& voltage = state.buses[Model::busKey(number)].values; + voltage["vr"] = static_cast(x[bus->variableIndices()[0]]); + voltage["vi"] = static_cast(x[bus->variableIndices()[1]]); + } + + for (const auto& component : components_) + { + const auto& terminals = component->terminals(); + std::vector power(ComponentT::TERMINAL_SIZE * terminals.size()); + component->evaluateTerminalPower(x, power.data()); + + for (IdxT t = 0; t < terminals.size(); ++t) + { + Model::setTerminalCurrent(state, + component->id(), + terminals[t], + t, + terminals.size(), + static_cast(power[ComponentT::TERMINAL_SIZE * t]), + static_cast(power[ComponentT::TERMINAL_SIZE * t + 1])); + } + } + + return state; + } + + template + int SystemModel::verify() const + { + int ret = data_errors_; + for (const auto& component : components_) + { + ret += component->verify(); + } + return ret; + } + + /** + * @brief Terminal slots take the voltage and balance rows of their bus + */ + template + int SystemModel::connect(ComponentT& component) + { + const auto& terminals = component.terminals(); + for (IdxT t = 0; t < terminals.size(); ++t) + { + const auto bus = buses_.find(terminals[t]); + if (bus == buses_.end()) + { + Log::error() << component.id() << ": terminal " << t << " has no bus\n"; + return 1; + } + + const IdxT variable = component.sizeInternal() + ComponentT::TERMINAL_SIZE * t; + const IdxT constraint = component.sizeInternalConstraints() + ComponentT::TERMINAL_SIZE * t; + for (IdxT k = 0; k < ComponentT::TERMINAL_SIZE; ++k) + { + component.variableIndices()[variable + k] = bus->second->variableIndices()[k]; + component.constraintIndices()[constraint + k] = bus->second->constraintIndices()[k]; + } + } + return 0; + } + } // namespace OptimalPowerFlow +} // namespace GridKit diff --git a/GridKit/Model/OptimizationEvaluator.hpp b/GridKit/Model/OptimizationEvaluator.hpp new file mode 100644 index 0000000000..b23a97a004 --- /dev/null +++ b/GridKit/Model/OptimizationEvaluator.hpp @@ -0,0 +1,128 @@ +/** + * @file OptimizationEvaluator.hpp + * @brief Abstract nonlinear program with exact sparse derivatives. + */ + +#pragma once + +#include + +#include +#include +#include + +namespace GridKit +{ + namespace Model + { + /** + * @brief Abstract class describing a nonlinear program + * + * Minimize \f$f(x)\f$ subject to \f$g_l \le g(x) \le g_u\f$ and + * \f$x_l \le x \le x_u\f$. The constraint Jacobian and the lower triangle + * of the Lagrangian Hessian keep the sparsity pattern set by `allocate()`. + */ + template + class OptimizationEvaluator + { + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename ScalarTraits::RealT; + using VectorT = LinearAlgebra::Vector; + using RealVectorT = LinearAlgebra::Vector; + using CsrMatrixT = LinearAlgebra::CsrMatrix; + + virtual ~OptimizationEvaluator() = default; + + virtual int allocate() = 0; + virtual int initialize() = 0; + + virtual int evaluateObjective() = 0; + virtual int evaluateGradient() = 0; + virtual int evaluateConstraints() = 0; + virtual int evaluateJacobian() = 0; + + /// Evaluate the Hessian of \f$\sigma f(x) + \lambda^T g(x)\f$ + virtual int evaluateHessian(RealT sigma, const RealT* lambda) = 0; + + IdxT size() const + { + return x_.getSize(); + } + + IdxT sizeConstraints() const + { + return g_.getSize(); + } + + const ScalarT& objective() const + { + return f_; + } + + VectorT& x() + { + return x_; + } + + const VectorT& x() const + { + return x_; + } + + const RealVectorT& xLower() const + { + return x_lower_; + } + + const RealVectorT& xUpper() const + { + return x_upper_; + } + + const RealVectorT& gradient() const + { + return gradient_; + } + + const VectorT& g() const + { + return g_; + } + + const RealVectorT& gLower() const + { + return g_lower_; + } + + const RealVectorT& gUpper() const + { + return g_upper_; + } + + CsrMatrixT* getCsrJacobian() const + { + return jacobian_.get(); + } + + CsrMatrixT* getCsrHessian() const + { + return hessian_.get(); + } + + protected: + ScalarT f_{}; + VectorT x_; + RealVectorT x_lower_; + RealVectorT x_upper_; + RealVectorT gradient_; + VectorT g_; + RealVectorT g_lower_; + RealVectorT g_upper_; + + std::unique_ptr jacobian_; + std::unique_ptr hessian_; + }; + } // namespace Model +} // namespace GridKit diff --git a/GridKit/Model/PhasorDynamics/CMakeLists.txt b/GridKit/Model/PhasorDynamics/CMakeLists.txt index 378e1e96cb..7fbd1fa976 100644 --- a/GridKit/Model/PhasorDynamics/CMakeLists.txt +++ b/GridKit/Model/PhasorDynamics/CMakeLists.txt @@ -69,6 +69,8 @@ gridkit_add_library( GridKit::phasor_dynamics_core PUBLIC GridKit::phasor_dynamics_components + PUBLIC + GridKit::model_state_data INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) gridkit_add_library( diff --git a/GridKit/Model/PhasorDynamics/ComponentData.hpp b/GridKit/Model/PhasorDynamics/ComponentData.hpp index be06bf8282..ce6a0098a3 100644 --- a/GridKit/Model/PhasorDynamics/ComponentData.hpp +++ b/GridKit/Model/PhasorDynamics/ComponentData.hpp @@ -3,10 +3,13 @@ #include #include #include +#include #include #include #include +#include + namespace GridKit { namespace PhasorDynamics @@ -73,5 +76,43 @@ namespace GridKit /// Disambiguation string for this device std::string disambiguation_string; }; + + /** + * @brief Numeric parameter `key` of `data` + * + * @throws std::invalid_argument if the parameter is missing or Boolean + */ + template + typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key) + { + const std::string name = data.disambiguation_string + ": parameter " + std::string(magic_enum::enum_name(key)); + const auto entry = data.parameters.find(key); + if (entry == data.parameters.end()) + { + throw std::invalid_argument(name + " is required"); + } + if (const auto* real_value = std::get_if(&entry->second)) + { + return *real_value; + } + if (const auto* integer_value = std::get_if(&entry->second)) + { + return static_cast(*integer_value); + } + throw std::invalid_argument(name + " must be numeric"); + } + + /** + * @brief Numeric parameter `key` of `data`, or `fallback` if it is not set + */ + template + typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key, typename DataT::RealT fallback) + { + if (!data.parameters.contains(key)) + { + return fallback; + } + return realParameter(data, key); + } } // namespace PhasorDynamics } // namespace GridKit diff --git a/GridKit/Model/PhasorDynamics/SystemModelData.cpp b/GridKit/Model/PhasorDynamics/SystemModelData.cpp index 0dcada8a8f..13fc106038 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelData.cpp +++ b/GridKit/Model/PhasorDynamics/SystemModelData.cpp @@ -1,6 +1,9 @@ #include "SystemModelData.hpp" #include +#include +#include +#include #include @@ -8,6 +11,78 @@ namespace GridKit { namespace PhasorDynamics { + namespace + { + /// Whether the state sets `flag` of device `id` to `value` + bool hasFlag(const Model::StateData& state, const std::string& id, const std::string& flag, bool value) + { + const Model::StateRecord* record = state.device(id); + return record != nullptr && record->flags.contains(flag) && record->flags.at(flag) == value; + } + + /// Remove the devices whose `flag` the state sets to `value` + template + void removeDevices(std::vector& devices, + const Model::StateData& state, + const std::string& flag, + bool value) + { + std::vector kept; + for (auto& device : devices) + { + if (!hasFlag(state, device.disambiguation_string, flag, value)) + { + kept.push_back(std::move(device)); + } + } + devices = std::move(kept); + } + + /// Machine `p0` and `q0` from the power the state injects + template + void applyInjections(std::vector& machines, const Model::StateData& state) + { + using Parameters = typename MachineDataT::Parameters; + using Buses = typename MachineDataT::Buses; + + for (auto& machine : machines) + { + const auto& id = machine.disambiguation_string; + if (hasFlag(state, id, "online", false)) + { + throw std::invalid_argument("Offline machine " + id + " is not supported yet"); + } + + double p = 0.0; + double q = 0.0; + if (Model::terminalPower(state, id, machine.buses.at(Buses::bus), 0, 1, p, q)) + { + machine.parameters[Parameters::p0] = p; + machine.parameters[Parameters::q0] = q; + } + } + } + + /// Machine currents that inject `p0` and `q0` + template + void extractInjections(Model::StateData& state, const std::vector& machines) + { + using Parameters = typename MachineDataT::Parameters; + using Buses = typename MachineDataT::Buses; + + for (const auto& machine : machines) + { + Model::setTerminalCurrent(state, + machine.disambiguation_string, + machine.buses.at(Buses::bus), + 0, + 1, + realParameter(machine, Parameters::p0, 0.0), + realParameter(machine, Parameters::q0, 0.0)); + } + } + } // namespace + SystemModelData parseSystemModelData(std::istream& stream) { SystemModelData data(json::parse(stream)); @@ -32,5 +107,114 @@ namespace GridKit } return parseSystemModelData(stream); } - } // namespace PhasorDynamics -} // namespace GridKit + + void applyState(SystemModelData& data, const Model::StateData& state) + { + for (auto& bus : data.bus) + { + const Model::StateRecord* record = state.bus(bus.bus_id); + if (record != nullptr) + { + bus.Vr0 = record->value("vr", bus.Vr0); + bus.Vi0 = record->value("vi", bus.Vi0); + } + } + + applyInjections(data.genrou, state); + applyInjections(data.gensal, state); + applyInjections(data.genclassical, state); + applyInjections(data.regca, state); + + // LoadZIP anchors at its initial voltage, so it draws Pnom + jQnom at t = 0 + for (auto& load : data.loadzip) + { + const auto& id = load.disambiguation_string; + + double p = 0.0; + double q = 0.0; + bool has_power = Model::terminalPower(state, id, load.buses.at(LoadZIPBuses::bus), 0, 1, p, q); + if (hasFlag(state, id, "online", false)) + { + p = 0.0; + q = 0.0; + has_power = true; + } + + if (has_power) + { + load.parameters[LoadZIPParameters::Pnom] = -p; + load.parameters[LoadZIPParameters::Qnom] = -q; + } + } + + removeDevices(data.loadz, state, "online", false); + removeDevices(data.branch, state, "open", true); + + for (auto& branch : data.branch) + { + const Model::StateRecord* record = state.device(branch.disambiguation_string); + if (record != nullptr) + { + if (record->values.contains("tap")) + { + branch.parameters[BranchParameters::tap] = record->values.at("tap"); + } + if (record->values.contains("phase")) + { + branch.parameters[BranchParameters::phase] = record->values.at("phase"); + } + } + } + } + + Model::StateData extractState(const SystemModelData& data) + { + Model::StateData state; + + for (const auto& bus : data.bus) + { + auto& voltage = state.buses[Model::busKey(bus.bus_id)].values; + voltage["vr"] = bus.Vr0; + voltage["vi"] = bus.Vi0; + } + + extractInjections(state, data.genrou); + extractInjections(state, data.gensal); + extractInjections(state, data.genclassical); + extractInjections(state, data.regca); + + for (const auto& load : data.loadzip) + { + Model::setTerminalCurrent(state, + load.disambiguation_string, + load.buses.at(LoadZIPBuses::bus), + 0, + 1, + -realParameter(load, LoadZIPParameters::Pnom, 0.0), + -realParameter(load, LoadZIPParameters::Qnom, 0.0)); + } + + // Power into the bus is -conj(Y) V^2 with Y = 1 / (R + jX) + for (const auto& load : data.loadz) + { + const size_t number = load.buses.at(LoadZBuses::bus); + const double r = realParameter(load, LoadZParameters::R); + const double x = realParameter(load, LoadZParameters::X); + const double g = r / (r * r + x * x); + const double b = -x / (r * r + x * x); + + const auto& voltage = state.buses.at(Model::busKey(number)).values; + const double v2 = voltage.at("vr") * voltage.at("vr") + voltage.at("vi") * voltage.at("vi"); + + Model::setTerminalCurrent(state, load.disambiguation_string, number, 0, 1, -g * v2, b * v2); + } + + for (const auto& branch : data.branch) + { + auto& settings = state.devices[branch.disambiguation_string].values; + settings["tap"] = realParameter(branch, BranchParameters::tap, 1.0); + settings["phase"] = realParameter(branch, BranchParameters::phase, 0.0); + } + + return state; + } diff --git a/GridKit/Model/PhasorDynamics/SystemModelData.hpp b/GridKit/Model/PhasorDynamics/SystemModelData.hpp index a197f082c6..44c2aa8802 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelData.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelData.hpp @@ -26,6 +26,7 @@ #include #include #include +#include #include namespace GridKit @@ -132,5 +133,23 @@ namespace GridKit SystemModelData parseSystemModelData(std::istream& stream); SystemModelData parseSystemModelData(std::istream&& stream); SystemModelData parseSystemModelData(const std::filesystem::path& filePath); - } // namespace PhasorDynamics -} // namespace GridKit + + /** + * @brief Write a state into system model data. See `STATE.md`. + * + * Sets bus `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and + * branch `tap`/`phase`. Removes open branches and offline `LoadZ` + * devices. An offline `LoadZIP` draws no power. + * + * @throws std::invalid_argument for an offline machine, which the + * machine models cannot represent yet + */ + void applyState(SystemModelData& data, const Model::StateData& state); + + /** + * @brief Operating state stored in system model data + * + * Gives bus voltages, machine and load currents, and branch `tap` and + * `phase`. + */ + Model::StateData extractState(const SystemModelData& data); diff --git a/GridKit/Model/STATE.md b/GridKit/Model/STATE.md new file mode 100644 index 0000000000..438a2a7520 --- /dev/null +++ b/GridKit/Model/STATE.md @@ -0,0 +1,109 @@ +# State Input Format + +A state file separates the model definition from its initial state. + +This also separates the case from the dispatch. One canonical `texas.case.json` can have multiple operating points in `examples/`: + +- `texas-summer2025.state.json` +- `texas-winter2025.state.json` +- `texas-summer2026.state.json` + +For example `texas-summer2025.state.json` might be structured as: + +```json +"header":{ + ... +}, +"buses":{ + ... +}, +"devices":{ + ... +} +``` + +Each entry gives initial outputs and operating settings. Models use these values and connected inputs to initialize their own state. + +Buses own their voltage and shunt outputs. Devices own their terminal current outputs. These values support initialization across PowerFlow, OPF, PhasorDynamics, and EMT. + +## Bus + +### RMS State (PowerFlow & PhasorDynamics) + +RMS voltages use real and imaginary parts: + +```json +"bus_id_2533":{ + "vr": 0.9289638822595822, + "vi": -0.39534548980249884 +} +``` + +### ABC State (EMT) + +EMT bus entries give instantaneous phase voltages. Device entries give currents. Each model defines any other initial states or history it needs. + +```json +"bus_id_2533":{ + "va": 0.9289638822595822, + "vb": -0.39534548980249884, + "vc": -0.39534548980249884 +} +``` + +## Devices + +Device entries give initial outputs and settings such as `online`, `open`, `tap`, and `phase`. + +Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple terminals. Numbers follow the model's terminal numbering. Currents are positive into each connected bus. Phasor currents use the system base. EMT uses the model's phase output names and units. + +> At nonzero voltage, convert terminal power to initial current with `I = conj((P + jQ) / V)`. + +```json +"gen_id_2":{ + "online": true, + "ir": 0.8, + "ii": -0.2 +}, +"br_id_2":{ + "open": false, + "tap": 1, + "phase": 0 +} +``` + +# Migration + +- Initialize components from output values and connected inputs. +- Derive missing values and check the initialization equations. + +`Bus`: + +- Treat buses as components with `vr` and `vi` output ports. +- Move voltage initialization from the case to the state file. + +`Branch`: + +- Expose `ir1`, `ii1`, `ir2`, and `ii2` as output ports. +- Make `tap`, `phase`, and `open` input ports. + +`REGCA`, `LoadZ`, `LoadZIP`, `GENROU`, `GENSAL`, `GenClassical`: + +- Expose `ir` and `ii` as output ports. +- Initialize from terminal voltage and current. +- Remove generator and converter `p0`/`q0` parameters. +- Make `online` an input port. + +# Readers and Writers + +`GridKit/Model/StateData.hpp` reads and writes this format. Device keys are the +case `id`. Bus keys are `bus_id_` followed by the bus number. + +- `PhasorDynamics::applyState` writes a state into parsed case data: bus + `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and branch `tap` + and `phase`. Open branches and offline `LoadZ` devices are removed, and an + offline `LoadZIP` draws no power. Offline machines are rejected. +- `PhasorDynamics::extractState` returns the operating point stored in a case: + bus voltages, machine and load currents, and branch `tap` and `phase`. +- `OptimalDispatch` reads a state as its starting point and writes the solved + bus voltages and device currents. diff --git a/GridKit/Model/StateData.cpp b/GridKit/Model/StateData.cpp new file mode 100644 index 0000000000..ffbcdb5c7b --- /dev/null +++ b/GridKit/Model/StateData.cpp @@ -0,0 +1,254 @@ +/** + * @file StateData.cpp + * @brief JSON input and output for `StateData`. + */ + +#include +#include + +#include + +#include + +namespace GridKit +{ + namespace Model + { + namespace + { + using json = nlohmann::json; + + StateRecord readRecord(const std::string& id, const json& object) + { + StateRecord record; + for (const auto& [key, value] : object.items()) + { + if (value.is_boolean()) + { + record.flags[key] = value.get(); + } + else if (value.is_number()) + { + record.values[key] = value.get(); + } + else if (!value.is_null()) + { + throw std::invalid_argument("State entry " + id + "." + key + " must be a number or a boolean"); + } + } + return record; + } + + std::map readRecords(const json& document, const char* section) + { + std::map records; + if (document.contains(section)) + { + for (const auto& [id, object] : document.at(section).items()) + { + records.emplace(id, readRecord(id, object)); + } + } + return records; + } + + json writeRecords(const std::map& records) + { + json section = json::object(); + for (const auto& [id, record] : records) + { + json object = json::object(); + for (const auto& [key, value] : record.values) + { + object[key] = value; + } + for (const auto& [key, flag] : record.flags) + { + object[key] = flag; + } + section[id] = object; + } + return section; + } + + template + void readOptional(const json& object, const char* key, std::optional& value) + { + if (object.contains(key) && !object.at(key).is_null()) + { + value = object.at(key).get(); + } + } + + template + void writeOptional(json& object, const char* key, const std::optional& value) + { + if (value) + { + object[key] = *value; + } + } + } // namespace + + double StateRecord::value(const std::string& key, double fallback) const + { + const auto entry = values.find(key); + if (entry == values.end()) + { + return fallback; + } + return entry->second; + } + + bool StateRecord::flag(const std::string& key, bool fallback) const + { + const auto entry = flags.find(key); + if (entry == flags.end()) + { + return fallback; + } + return entry->second; + } + + const StateRecord* StateData::bus(std::size_t number) const + { + const auto entry = buses.find(busKey(number)); + if (entry == buses.end()) + { + return nullptr; + } + return &entry->second; + } + + const StateRecord* StateData::device(const std::string& id) const + { + const auto entry = devices.find(id); + if (entry == devices.end()) + { + return nullptr; + } + return &entry->second; + } + + std::string busKey(std::size_t number) + { + return "bus_id_" + std::to_string(number); + } + + std::pair currentKeys(std::size_t terminal, std::size_t terminal_count) + { + if (terminal_count == 1) + { + return {"ir", "ii"}; + } + const auto suffix = std::to_string(terminal + 1); + return {"ir" + suffix, "ii" + suffix}; + } + + bool terminalPower(const StateData& state, + const std::string& id, + std::size_t number, + std::size_t terminal, + std::size_t terminal_count, + double& p, + double& q) + { + const StateRecord* device = state.device(id); + const StateRecord* bus = state.bus(number); + if (device == nullptr || bus == nullptr) + { + return false; + } + + const auto [ir_key, ii_key] = currentKeys(terminal, terminal_count); + if (!device->values.contains(ir_key) || !device->values.contains(ii_key) + || !bus->values.contains("vr") || !bus->values.contains("vi")) + { + return false; + } + + const double vr = bus->values.at("vr"); + const double vi = bus->values.at("vi"); + const double ir = device->values.at(ir_key); + const double ii = device->values.at(ii_key); + + p = vr * ir + vi * ii; + q = vi * ir - vr * ii; + return true; + } + + void setTerminalCurrent(StateData& state, + const std::string& id, + std::size_t number, + std::size_t terminal, + std::size_t terminal_count, + double p, + double q) + { + const auto& voltage = state.buses.at(busKey(number)).values; + const double vr = voltage.at("vr"); + const double vi = voltage.at("vi"); + const double v2 = vr * vr + vi * vi; + + // I = conj((P + jQ) / V) + const auto [ir_key, ii_key] = currentKeys(terminal, terminal_count); + auto& current = state.devices[id].values; + current[ir_key] = (p * vr + q * vi) / v2; + current[ii_key] = (p * vi - q * vr) / v2; + } + + StateData parseStateData(std::istream& stream) + { + const json document = json::parse(stream); + + StateData state; + if (document.contains("header")) + { + const auto& header = document.at("header"); + readOptional(header, "version", state.header.version); + readOptional(header, "time", state.header.time); + readOptional(header, "created", state.header.created); + readOptional(header, "description", state.header.description); + } + state.buses = readRecords(document, "buses"); + state.devices = readRecords(document, "devices"); + return state; + } + + StateData parseStateData(const std::filesystem::path& file) + { + std::ifstream stream(file); + if (!stream) + { + throw std::runtime_error("Could not open state file " + file.string()); + } + return parseStateData(stream); + } + + void writeStateData(const StateData& state, std::ostream& stream) + { + json header = json::object(); + writeOptional(header, "version", state.header.version); + writeOptional(header, "time", state.header.time); + writeOptional(header, "created", state.header.created); + writeOptional(header, "description", state.header.description); + + json document = json::object(); + document["header"] = header; + document["buses"] = writeRecords(state.buses); + document["devices"] = writeRecords(state.devices); + + stream << document.dump(4) << "\n"; + } + + void writeStateData(const StateData& state, const std::filesystem::path& file) + { + std::ofstream stream(file); + if (!stream) + { + throw std::runtime_error("Could not open state file " + file.string()); + } + writeStateData(state, stream); + } + } // namespace Model +} // namespace GridKit diff --git a/GridKit/Model/StateData.hpp b/GridKit/Model/StateData.hpp new file mode 100644 index 0000000000..59cf23581d --- /dev/null +++ b/GridKit/Model/StateData.hpp @@ -0,0 +1,97 @@ +/** + * @file StateData.hpp + * @brief Operating state shared by all model families. See `STATE.md`. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace Model + { + /// Entries of one bus or device + struct StateRecord + { + std::map values; ///< Numeric entries such as `vr` or `ir` + std::map flags; ///< Boolean entries such as `online` or `open` + + double value(const std::string& key, double fallback) const; + bool flag(const std::string& key, bool fallback) const; + }; + + /// Metadata of a state file + struct StateHeader + { + std::optional version; + std::optional time; + std::optional created; + std::optional description; + }; + + /** + * @brief Operating state of a case + * + * Currents are positive into the bus and use the system base. + */ + struct StateData + { + StateHeader header; + std::map buses; ///< Keyed by `busKey(number)` + std::map devices; ///< Keyed by the case `id` + + const StateRecord* bus(std::size_t number) const; + const StateRecord* device(const std::string& id) const; + }; + + /// Key of bus `number` in `StateData::buses` + std::string busKey(std::size_t number); + + /** + * @brief Keys of the real and imaginary current at `terminal` of a device + * with `terminal_count` terminals + */ + std::pair currentKeys(std::size_t terminal, std::size_t terminal_count); + + /** + * @brief Power into bus `number` at `terminal` of device `id` + * + * @return false if the state has no current for the terminal or no + * voltage for the bus + */ + bool terminalPower(const StateData& state, + const std::string& id, + std::size_t number, + std::size_t terminal, + std::size_t terminal_count, + double& p, + double& q); + + /** + * @brief Set the current of device `id` at `terminal` that injects `p` + * and `q` into bus `number` + * + * @pre The state has a nonzero voltage for bus `number`. + */ + void setTerminalCurrent(StateData& state, + const std::string& id, + std::size_t number, + std::size_t terminal, + std::size_t terminal_count, + double p, + double q); + + StateData parseStateData(std::istream& stream); + StateData parseStateData(const std::filesystem::path& file); + void writeStateData(const StateData& state, std::ostream& stream); + void writeStateData(const StateData& state, const std::filesystem::path& file); + } // namespace Model +} // namespace GridKit diff --git a/GridKit/Solver/CMakeLists.txt b/GridKit/Solver/CMakeLists.txt index f783ce34e9..febd6808b3 100644 --- a/GridKit/Solver/CMakeLists.txt +++ b/GridKit/Solver/CMakeLists.txt @@ -10,7 +10,8 @@ endif() if(TARGET SUNDIALS::idas) add_subdirectory(Dynamic) - if(GRIDKIT_ENABLE_IPOPT) - add_subdirectory(Optimization) - endif() +endif() + +if(GRIDKIT_ENABLE_IPOPT) + add_subdirectory(Optimization) endif() diff --git a/GridKit/Solver/Optimization/CMakeLists.txt b/GridKit/Solver/Optimization/CMakeLists.txt index 7df982ccda..382561ec08 100644 --- a/GridKit/Solver/Optimization/CMakeLists.txt +++ b/GridKit/Solver/Optimization/CMakeLists.txt @@ -5,12 +5,26 @@ # - Cameron Rutherford #]] +if(TARGET SUNDIALS::idas) + gridkit_add_library( + solvers_opt + SOURCES DynamicObjective.cpp DynamicConstraint.cpp + HEADERS DynamicConstraint.hpp DynamicObjective.hpp OptimizationSolver.hpp + LINK_LIBRARIES + PUBLIC + IPOPT + PUBLIC + GridKit::solvers_dyn) +endif() + gridkit_add_library( - solvers_opt - SOURCES DynamicObjective.cpp DynamicConstraint.cpp - HEADERS DynamicConstraint.hpp DynamicObjective.hpp OptimizationSolver.hpp + solvers_opt_problem + SOURCES OptimizationProblem.cpp + HEADERS OptimizationProblem.hpp LINK_LIBRARIES PUBLIC IPOPT PUBLIC - GridKit::solvers_dyn) + GridKit::dense_vector + PUBLIC + GridKit::sparse_matrix) diff --git a/GridKit/Solver/Optimization/OptimizationProblem.cpp b/GridKit/Solver/Optimization/OptimizationProblem.cpp new file mode 100644 index 0000000000..4b1bd1d60c --- /dev/null +++ b/GridKit/Solver/Optimization/OptimizationProblem.cpp @@ -0,0 +1,230 @@ +/** + * @file OptimizationProblem.cpp + * @brief Ipopt problem over a `Model::OptimizationEvaluator`. + */ + +#include "OptimizationProblem.hpp" + +#include + +namespace AnalysisManager +{ + namespace IpoptInterface + { + template + OptimizationProblem::OptimizationProblem(ModelT* model) + : model_(model) + { + } + + template + bool OptimizationProblem::get_nlp_info(Index& n, + Index& m, + Index& nnz_jac_g, + Index& nnz_h_lag, + IndexStyleEnum& index_style) + { + n = static_cast(model_->size()); + m = static_cast(model_->sizeConstraints()); + nnz_jac_g = static_cast(model_->getCsrJacobian()->getNnz()); + nnz_h_lag = static_cast(model_->getCsrHessian()->getNnz()); + index_style = C_STYLE; + + return true; + } + + template + bool OptimizationProblem::get_bounds_info(Index n, + Number* x_l, + Number* x_u, + Index m, + Number* g_l, + Number* g_u) + { + std::copy_n(model_->xLower().getData(), n, x_l); + std::copy_n(model_->xUpper().getData(), n, x_u); + std::copy_n(model_->gLower().getData(), m, g_l); + std::copy_n(model_->gUpper().getData(), m, g_u); + + return true; + } + + template + bool OptimizationProblem::get_starting_point(Index n, + bool init_x, + Number* x, + bool init_z, + [[maybe_unused]] Number* z_L, + [[maybe_unused]] Number* z_U, + [[maybe_unused]] Index m, + bool init_lambda, + [[maybe_unused]] Number* lambda) + { + // Only the variables have a starting point + if (!init_x || init_z || init_lambda) + { + return false; + } + + std::copy_n(model_->x().getData(), n, x); + + return true; + } + + template + bool OptimizationProblem::eval_f([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number& obj_value) + { + setVariables(x); + if (model_->evaluateObjective() != 0) + { + return false; + } + + obj_value = model_->objective(); + + return true; + } + + template + bool OptimizationProblem::eval_grad_f(Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number* grad_f) + { + setVariables(x); + if (model_->evaluateGradient() != 0) + { + return false; + } + + std::copy_n(model_->gradient().getData(), n, grad_f); + + return true; + } + + template + bool OptimizationProblem::eval_g([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Index m, + Number* g) + { + setVariables(x); + if (model_->evaluateConstraints() != 0) + { + return false; + } + + std::copy_n(model_->g().getData(), m, g); + + return true; + } + + template + bool OptimizationProblem::eval_jac_g([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + [[maybe_unused]] Index m, + Index nele_jac, + Index* iRow, + Index* jCol, + Number* values) + { + if (values == nullptr) + { + structure(*model_->getCsrJacobian(), iRow, jCol); + return true; + } + + setVariables(x); + if (model_->evaluateJacobian() != 0) + { + return false; + } + + std::copy_n(model_->getCsrJacobian()->getValues(), nele_jac, values); + + return true; + } + + template + bool OptimizationProblem::eval_h([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number obj_factor, + [[maybe_unused]] Index m, + const Number* lambda, + [[maybe_unused]] bool new_lambda, + Index nele_hess, + Index* iRow, + Index* jCol, + Number* values) + { + if (values == nullptr) + { + structure(*model_->getCsrHessian(), iRow, jCol); + return true; + } + + setVariables(x); + if (model_->evaluateHessian(obj_factor, lambda) != 0) + { + return false; + } + + std::copy_n(model_->getCsrHessian()->getValues(), nele_hess, values); + + return true; + } + + /** + * @brief Leave the final point in the model + */ + template + void OptimizationProblem::finalize_solution([[maybe_unused]] SolverReturn status, + [[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] const Number* z_L, + [[maybe_unused]] const Number* z_U, + [[maybe_unused]] Index m, + [[maybe_unused]] const Number* g, + [[maybe_unused]] const Number* lambda, + [[maybe_unused]] Number obj_value, + [[maybe_unused]] const IpoptData* ip_data, + [[maybe_unused]] IpoptCalculatedQuantities* ip_cq) + { + setVariables(x); + } + + template + void OptimizationProblem::setVariables(const Number* x) + { + std::copy_n(x, model_->size(), model_->x().getData()); + model_->x().setDataUpdated(); + } + + /** + * @brief Coordinates of the CSR entries in storage order + */ + template + void OptimizationProblem::structure(CsrMatrixT& matrix, Index* iRow, Index* jCol) + { + const IdxT* row_ptrs = matrix.getRowData(); + const IdxT* cols = matrix.getColData(); + for (IdxT row = 0; row < matrix.getNumRows(); ++row) + { + for (IdxT k = row_ptrs[row]; k < row_ptrs[row + 1]; ++k) + { + iRow[k] = static_cast(row); + jCol[k] = static_cast(cols[k]); + } + } + } + + // Available template instantiations + template class OptimizationProblem; + } // namespace IpoptInterface +} // namespace AnalysisManager diff --git a/GridKit/Solver/Optimization/OptimizationProblem.hpp b/GridKit/Solver/Optimization/OptimizationProblem.hpp new file mode 100644 index 0000000000..d0fad4a87e --- /dev/null +++ b/GridKit/Solver/Optimization/OptimizationProblem.hpp @@ -0,0 +1,107 @@ +/** + * @file OptimizationProblem.hpp + * @brief Ipopt problem over a `Model::OptimizationEvaluator`. + */ + +#pragma once + +#include + +#include + +namespace AnalysisManager +{ + namespace IpoptInterface + { + /** + * @brief Implementation of Ipopt's pure virtual TNLP class for a + * nonlinear program with exact sparse derivatives + * + * The constraint Jacobian and the lower triangle of the Lagrangian + * Hessian come from the model in CSR format, with the pattern set by the + * model's `allocate()`. + */ + template + class OptimizationProblem : public Ipopt::TNLP + { + public: + using ScalarT = scalar_type; + using IdxT = index_type; + using ModelT = GridKit::Model::OptimizationEvaluator; + using RealT = typename ModelT::RealT; + using CsrMatrixT = typename ModelT::CsrMatrixT; + + using Index = Ipopt::Index; + using Number = Ipopt::Number; + using SolverReturn = Ipopt::SolverReturn; + using IpoptCalculatedQuantities = Ipopt::IpoptCalculatedQuantities; + using IpoptData = Ipopt::IpoptData; + + /** + * @param[in] model - Allocated model, which holds the solution after + * the solve + */ + explicit OptimizationProblem(ModelT* model); + + bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style) override; + + bool get_bounds_info(Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u) override; + + bool get_starting_point(Index n, + bool init_x, + Number* x, + bool init_z, + Number* z_L, + Number* z_U, + Index m, + bool init_lambda, + Number* lambda) override; + + bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value) override; + + bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f) override; + + bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g) override; + + bool eval_jac_g(Index n, + const Number* x, + bool new_x, + Index m, + Index nele_jac, + Index* iRow, + Index* jCol, + Number* values) override; + + bool eval_h(Index n, + const Number* x, + bool new_x, + Number obj_factor, + Index m, + const Number* lambda, + bool new_lambda, + Index nele_hess, + Index* iRow, + Index* jCol, + Number* values) override; + + void finalize_solution(SolverReturn status, + Index n, + const Number* x, + const Number* z_L, + const Number* z_U, + Index m, + const Number* g, + const Number* lambda, + Number obj_value, + const IpoptData* ip_data, + IpoptCalculatedQuantities* ip_cq) override; + + private: + void setVariables(const Number* x); + + static void structure(CsrMatrixT& matrix, Index* iRow, Index* jCol); + + ModelT* model_; + }; + } // namespace IpoptInterface +} // namespace AnalysisManager diff --git a/application/PhasorDynamics/AnalysisUtilities.hpp b/application/PhasorDynamics/AnalysisUtilities.hpp index 85ed86c188..e94fe2cac1 100644 --- a/application/PhasorDynamics/AnalysisUtilities.hpp +++ b/application/PhasorDynamics/AnalysisUtilities.hpp @@ -63,6 +63,8 @@ namespace GridKit { /// path to system model JSON file fs::path system_model_file; + /// path to state JSON file, or empty to use the case operating point + fs::path state_file; /// monitor output time step size, or 0 for no intermediate monitoring double dt_monitor; /// max time @@ -83,6 +85,12 @@ namespace GridKit std::vector events; /// path to output file fs::path output_file; + /// path to the state file written at the end of the study, or empty for none + fs::path output_state_file; + /// path to the MATPOWER case with limits and costs for optimal dispatch + fs::path dispatch_file; + /// Ipopt options by name for optimal dispatch + ::nlohmann::json ipopt; /// path to reference file for validation fs::path reference_file; /// Error tolerance (between output file and reference file) @@ -110,8 +118,12 @@ namespace GridKit using namespace magic_enum; j.at("system_model_file").get_to(c.system_model_file); - c.dt_monitor = j.value("dt_monitor", 0.0); - j.at("tmax").get_to(c.tmax); + if (j.contains("state_file")) + { + j.at("state_file").get_to(c.state_file); + } + c.dt_monitor = j.value("dt_monitor", 0.0); + c.tmax = j.value("tmax", 0.0); c.rel_tol = j.value("rel_tol", DEFAULT_SOLVER_REL_TOL); c.abs_tol = j.value("abs_tol", DEFAULT_SOLVER_ABS_TOL); c.dt_fixed = j.value("dt_fixed", 0.0); @@ -137,7 +149,7 @@ namespace GridKit } } - for (auto& raw_event : j.at("events")) + for (auto& raw_event : j.value("events", json::array())) { auto& event = c.events.emplace_back(); raw_event.at("time").get_to(event.time); @@ -164,6 +176,18 @@ namespace GridKit j.at("output_file").get_to(c.output_file); } + if (j.contains("output_state_file")) + { + j.at("output_state_file").get_to(c.output_state_file); + } + + if (j.contains("dispatch_file")) + { + j.at("dispatch_file").get_to(c.dispatch_file); + } + + c.ipopt = j.value("ipopt", json::object()); + if (j.contains("reference_file")) { j.at("reference_file").get_to(c.reference_file); @@ -243,9 +267,21 @@ namespace GridKit data.reference_file = loc / data.reference_file; } } + if (!data.state_file.empty() && !data.state_file.is_absolute()) + { + data.state_file = loc / data.state_file; + } + if (!data.dispatch_file.empty() && !data.dispatch_file.is_absolute()) + { + data.dispatch_file = loc / data.dispatch_file; + } auto csv = ::GridKit::Model::VariableMonitorFormat::CSV; data.model_data = parseSystemModelData(data.system_model_file); + if (!data.state_file.empty()) + { + applyState(data.model_data, Model::parseStateData(data.state_file)); + } std::string model_output_file; // Find output file (CSV) specified in model input file for (const auto& sink : data.model_data.monitor_sink) diff --git a/application/PhasorDynamics/CMakeLists.txt b/application/PhasorDynamics/CMakeLists.txt index fbe1471b90..a7b96dfc4b 100644 --- a/application/PhasorDynamics/CMakeLists.txt +++ b/application/PhasorDynamics/CMakeLists.txt @@ -20,6 +20,24 @@ target_include_directories( ContingencyAnalysis PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) +if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) + add_executable(OptimalDispatch OptimalDispatch.cpp) + target_link_libraries( + OptimalDispatch + PUBLIC GridKit::optimal_power_flow_systemmodel + GridKit::phasor_dynamics_systemmodel + GridKit::solvers_opt_problem + GridKit::solvers_dyn + GridKit::Utilities + GridKit::testing) + target_include_directories(OptimalDispatch + PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) + install( + TARGETS OptimalDispatch + EXPORT gridkit-targets + RUNTIME) +endif() + if(GRIDKIT_ENABLE_OPENMP) target_link_libraries(ContingencyAnalysis PUBLIC OpenMP::OpenMP_CXX) endif() diff --git a/application/PhasorDynamics/ContingencyAnalysis.cpp b/application/PhasorDynamics/ContingencyAnalysis.cpp index c1a5b61ee2..be8796948d 100644 --- a/application/PhasorDynamics/ContingencyAnalysis.cpp +++ b/application/PhasorDynamics/ContingencyAnalysis.cpp @@ -177,6 +177,11 @@ int runApplication(int argc, const char* argv[]) // Study file checkCommandLine(argc, "ContingencyAnalysis"); auto study_data = parseStudyData(argv[1]); + if (study_data.tmax <= 0.0) + { + Log::error() << "ContingencyAnalysis requires a positive tmax\n"; + return 1; + } const auto start = Clock::now(); diff --git a/application/PhasorDynamics/DynamicSimulation.cpp b/application/PhasorDynamics/DynamicSimulation.cpp index 351a3a1ed1..0d16851377 100644 --- a/application/PhasorDynamics/DynamicSimulation.cpp +++ b/application/PhasorDynamics/DynamicSimulation.cpp @@ -27,6 +27,11 @@ int runApplication(int argc, const char* argv[]) // Study file checkCommandLine(argc, "DynamicSimulation"); auto study = parseStudyData(argv[1]); + if (study.tmax <= 0.0) + { + Log::error() << "DynamicSimulation requires a positive tmax\n"; + return 1; + } using EventType = SystemEvent::Type; diff --git a/application/PhasorDynamics/OptimalDispatch.cpp b/application/PhasorDynamics/OptimalDispatch.cpp new file mode 100644 index 0000000000..d39ee92bca --- /dev/null +++ b/application/PhasorDynamics/OptimalDispatch.cpp @@ -0,0 +1,193 @@ +/** + * @file OptimalDispatch.cpp + * @brief Optimal dispatch of a PhasorDynamics case, written as its initial + * state. + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include "AnalysisUtilities.hpp" + +namespace OPF = GridKit::OptimalPowerFlow; +namespace PD = GridKit::PhasorDynamics; + +using PD::json; +using PD::Log; + +/** + * @brief Dispatchable generators from PhasorDynamics machines + */ +template +void addGenerators(OPF::SystemModelData<>& data, const std::vector& machines) +{ + using Buses = typename MachineDataT::Buses; + + for (const auto& machine : machines) + { + auto& generator = data.generator.emplace_back(); + generator.id = machine.disambiguation_string; + generator.buses[OPF::GeneratorBuses::bus] = machine.buses.at(Buses::bus); + } +} + +/** + * @brief Optimal power flow network of a PhasorDynamics case + * + * Machines become generators, `LoadZIP` devices fixed loads, and `LoadZ` + * devices shunts. Branches keep the PhasorDynamics parameters. + */ +OPF::SystemModelData<> network(const PD::SystemModelData<>& grid) +{ + using BusType = PD::SystemModelData<>::BusDataT::BusType; + + OPF::SystemModelData<> data; + data.va_base = grid.va_base; + + for (const auto& bus : grid.bus) + { + auto& record = data.bus.emplace_back(); + record.number = bus.bus_id; + record.infinite = bus.bus_type == BusType::SLACK; + } + + for (const auto& branch : grid.branch) + { + auto& record = data.branch.emplace_back(); + record.id = branch.disambiguation_string; + record.buses[OPF::BranchBuses::bus1] = branch.buses.at(PD::BranchBuses::bus1); + record.buses[OPF::BranchBuses::bus2] = branch.buses.at(PD::BranchBuses::bus2); + for (const auto& key : std::views::keys(branch.parameters)) + { + const auto parameter = magic_enum::enum_cast(magic_enum::enum_name(key)); + record.parameters[parameter.value()] = PD::realParameter(branch, key); + } + } + + addGenerators(data, grid.genrou); + addGenerators(data, grid.gensal); + addGenerators(data, grid.genclassical); + addGenerators(data, grid.regca); + + for (const auto& load : grid.loadzip) + { + auto& record = data.load.emplace_back(); + record.id = load.disambiguation_string; + record.buses[OPF::LoadBuses::bus] = load.buses.at(PD::LoadZIPBuses::bus); + } + + // Y = 1 / (R + jX) + for (const auto& load : grid.loadz) + { + const double r = PD::realParameter(load, PD::LoadZParameters::R); + const double x = PD::realParameter(load, PD::LoadZParameters::X); + + auto& record = data.shunt.emplace_back(); + record.id = load.disambiguation_string; + record.buses[OPF::ShuntBuses::bus] = load.buses.at(PD::LoadZBuses::bus); + record.parameters[OPF::ShuntParameters::G] = r / (r * r + x * x); + record.parameters[OPF::ShuntParameters::B] = -x / (r * r + x * x); + } + + return data; +} + +/** + * @brief Set Ipopt options of string, integer, or real type + */ +void setOptions(Ipopt::IpoptApplication& app, const json& options) +{ + for (const auto& [name, value] : options.items()) + { + bool set = false; + if (value.is_string()) + { + set = app.Options()->SetStringValue(name, value.get()); + } + else if (value.is_number_integer()) + { + set = app.Options()->SetIntegerValue(name, value.get()); + } + else if (value.is_number()) + { + set = app.Options()->SetNumericValue(name, value.get()); + } + + if (!set) + { + throw std::invalid_argument("Invalid Ipopt option " + name); + } + } +} + +int runApplication(int argc, const char* argv[]) +{ + PD::checkCommandLine(argc, "OptimalDispatch"); + const PD::StudyData study = PD::parseStudyData(argv[1]); + if (study.dispatch_file.empty() || study.output_state_file.empty()) + { + Log::error() << "OptimalDispatch requires dispatch_file and output_state_file\n"; + return 1; + } + + OPF::SystemModelData<> data = network(study.model_data); + OPF::applyMatpowerData(data, OPF::parseMatpowerData(study.dispatch_file)); + + OPF::SystemModel model(data, PD::extractState(study.model_data)); + if (model.allocate() != 0) + { + return 1; + } + + // PhasorDynamics initialization rejects limits that relaxed bounds violate + Ipopt::SmartPtr app = IpoptApplicationFactory(); + app->Options()->SetNumericValue("bound_relax_factor", 0.0); + setOptions(*app, study.ipopt); + if (app->Initialize() != Ipopt::Solve_Succeeded) + { + Log::error() << "Ipopt initialization failed\n"; + return 1; + } + + Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::OptimizationProblem(&model); + + const Ipopt::ApplicationReturnStatus status = app->OptimizeTNLP(problem); + if (status != Ipopt::Solve_Succeeded && status != Ipopt::Solved_To_Acceptable_Level) + { + Log::error() << "Ipopt did not converge, status " << magic_enum::enum_name(status) << "\n"; + return 1; + } + + model.evaluateObjective(); + std::cout << "\nOptimal cost " << model.objective() << "\n"; + + GridKit::Model::writeStateData(model.solutionState(), study.output_state_file); + std::cout << "State written to " << study.output_state_file << "\n"; + + return 0; +} + +int main(int argc, const char* argv[]) +{ + try + { + return runApplication(argc, argv); + } + catch (const std::exception& error) + { + Log::error() << "OptimalDispatch failed: " << error.what() << '\n'; + } + + return 1; +} diff --git a/application/PhasorDynamics/README.md b/application/PhasorDynamics/README.md index a14c5fe7ed..3f081267b3 100644 --- a/application/PhasorDynamics/README.md +++ b/application/PhasorDynamics/README.md @@ -5,22 +5,28 @@ Name | Value ----------------------|------------------------------------------------------- `system_model_file` | Path to the system model file[^1] + `state_file` | Path to a state file[^2] that sets the initial operating point (optional) `dt_monitor` | Monitor output time interval for recorded simulation results (default: 0, no intermediate monitoring) - `tmax` | A floating-point value for max time + `tmax` | A floating-point value for max time (required by `DynamicSimulation` and `ContingencyAnalysis`) `rel_tol` | Relative solver tolerance (default: 1.0e-7) `abs_tol` | Absolute solver tolerance override (default: 1.0e-9) `dt_fixed` | Fixed solver time step size, or 0 for adaptive stepping (default: 0) `max_steps` | Maximum number of solver time steps, 0 for the IDA default, or a negative number for unlimited steps (default: 0) `max_order` | Maximum IDA integration method order from 1 to 5 (default: 5; fixed stepping is capped at 2) `consistent_ic_type` | IDA consistent initial condition calculation type; one of { "y", "ya_ydp" } (default: "ya_ydp") - `events` | An array of event groups (see [Events](#events) below) + `events` | An array of event groups (see [Events](#events) below, default: none) `output_file` | Path to output (CSV) file (optional) + `output_state_file` | Path to the state file[^2] the study writes (required by `OptimalDispatch`) + `dispatch_file` | Path to the MATPOWER case[^3] with limits and costs (required by `OptimalDispatch`) + `ipopt` | Ipopt options by name (optional, `OptimalDispatch` only) `reference_file` | A string containing the name of the case (optional) `error_type` | One of { "relative" (default), "absolute" } `error_tolerance` | A floating-point value for highest allowable total error (default: 1.0e-4) `abs_err_threshold` | A floating-point value for the smallest value at which to scale relative error (default: machine epsilon for double-precision) [^1]: See system model [case format](../../GridKit/Model/PhasorDynamics/INPUT_FORMAT.md) +[^2]: See the [state format](../../GridKit/Model/STATE.md) +[^3]: See the optimal power flow [data](../../GridKit/Model/OptimalPowerFlow/README.md#data) ## Events @@ -34,3 +40,29 @@ Each event group describes a system event that occurs at a given time point `R` | Fault resistance in per unit (required for "fault_on") `X` | Fault reactance in per unit (required for "fault_on") `device` | `id` of the branch to put in service ("in_service") or take out of service ("out_of_service") + +## Optimal dispatch + +`OptimalDispatch` solves the AC optimal power flow of the case with the limits +and costs of its MATPOWER case and writes the solution to `output_state_file`. +`DynamicSimulation` starts from that state through `state_file`. + +```shell +OptimalDispatch IEEE39.solver.json +``` + + Case device | Optimal power flow component + ---------------------------------------------|----------------------------- + `Bus`, `BusInfinite` | `Bus`, infinite for `BusInfinite` + `Branch` | `Branch` with the same parameters + `Genrou`, `Gensal`, `GenClassical`, `Regca` | `Generator` + `LoadZIP` | `Load` with its demand from the state + `LoadZ` | `Shunt` with $G + jB = 1 / (R + jX)$ + +Controllers, exciters, governors, stabilizers, and faults do not enter the +optimal power flow. PhasorDynamics initialization checks the dispatch against +their limits. + +Ipopt uses exact sparse derivatives. The application sets `bound_relax_factor` +to 0, because PhasorDynamics initialization rejects limits that relaxed bounds +violate. Options under `ipopt` are applied after it. diff --git a/cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m b/cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m new file mode 100644 index 0000000000..26c5add5b0 --- /dev/null +++ b/cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m @@ -0,0 +1,9460 @@ +function mpc = case_ACTIVSg2000 +%CASE_ACTIVSG2000 Synthetic Texas 2000-bus power system model. +% +% This is an entirely synthetic 2000 bus case, geographically situated +% in the US state of Texas. The case is designed with a 500, 230, 161 +% and 115 kV transmission network to serve a load that roughly mimics +% the actual population of its geographic footprint. The synthetic +% transmission system was designed by algorithms described in [1] to be +% statistically similar to actual transmission system models but without +% modeling any actual lines. +% +% When publishing results based on this data, please cite: +% +% [1] A.B. Birchfield, T. Xu, K.M. Gegner, K.S. Shetye, T.J. Overbye, +% "Grid Structural Characteristics as Validation Criteria for +% Synthetic Networks," IEEE Transactions on Power Systems, +% vol. 32, no. 4, pp. 3258-3265, July 2017. +% doi: 10.1109/TPWRS.2016.2616385 +% +% This is a synthetic power system model that does not represent the +% actual grid. It was developed as part of the US ARPA-E GRID DATA +% research project and contains no CEII. +% +% One-line diagrams and other data formats available at: +% https://electricgrids.engr.tamu.edu +% +% August 9, 2018 + +% Created from ACTIVSg2000_AUG-09-2018.pwb, saved by +% PowerWorld Simulator, version 21, build date August 30, 2018, +% then by MATPOWER 6. + +% MATPOWER +% Copyright (c) 2017-2018 by A.B. Birchfield, T. Xu, K.M. Gegner, K.S. Shetye, +% and T.J. Overbye +% Licensed under the Creative Commons Attribution 4.0 International license, +% https://creativecommons.org/licenses/by/4.0/ + +%% MATPOWER Case Format : Version 2 +mpc.version = '2'; + +%%----- Power Flow Data -----%% +%% system MVA base +mpc.baseMVA = 100; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin lam_P lam_Q mu_Vmax mu_Vmin +mpc.bus = [ + 1001 1 20.78 5.89 0 0 1 0.9839336 -22.646338 115 9 1.1 0.9 25.7500 -3.4800 0.0000 0.0000; + 1002 1 15.41 4.37 0 0 1 1.0229021 -18.132001 115 9 1.1 0.9 84.2100 0.4900 0.0000 0.0000; + 1003 1 0 0 0 0 1 1.012931 -17.011695 115 9 1.1 0.9 -6.7400 0.1400 0.0000 0.0000; + 1004 2 0 0 0 0 1 1.017406 -18.848732 230 9 1.1 0.9 -7.0800 6.0300 0.0000 0.0000; + 1005 1 0 0 0 0 1 1.0101076 -16.099297 115 9 1.1 0.9 -52.9600 -29.6300 0.0000 0.0000; + 1006 2 0 0 0 0 1 1.0036973 -13.943433 13.8 9 1.1 0.9 -50.4400 0.0000 0.0000 0.0000; + 1007 1 7.01 1.99 0 0.08 1 1.0300037 -18.50223 115 9 1.1 0.9 73.7600 0.0000 0.0000 0.0000; + 1008 1 0 0 0 0 1 1.0242318 -8.750765 115 9 1.1 0.9 -680.6900 29.8600 0.0000 0.0000; + 1009 2 0 0 0 0 1 1.0142528 -5.487293 13.8 9 1.1 0.9 -680.3200 29.7600 0.0000 0.0000; + 1010 1 0 0 0 -2.19 1 1.0300037 -16.859272 115 9 1.1 0.9 86.1300 0.0000 0.0000 0.0000; + 1011 2 0 0 0 0 1 1.0302222 -15.111129 22 9 1.1 0.9 86.0200 0.0000 0.0000 0.0000; + 1012 1 2.99 0.85 0 9.5 1 1.0168192 -25.304621 115 9 1.1 0.9 -344.5900 36.1000 0.0000 0.0000; + 1013 1 29.23 8.28 0 0 1 1.0095823 -15.448205 115 9 1.1 0.9 49.3400 -0.9800 0.0000 0.0000; + 1014 1 2.22 0.63 0 0 1 1.015959 -11.967074 115 9 1.1 0.9 71.8900 -7.3200 0.0000 0.0000; + 1015 1 7.51 2.13 0 0 1 1.0319511 -18.255397 115 9 1.1 0.9 81.0900 -0.1500 0.0000 0.0000; + 1016 1 2.89 0.82 0 30 1 1.0189172 -15.496608 115 9 1.1 0.9 -1.9100 -27.3300 0.0000 0.0000; + 1017 1 18.34 5.2 0 0 1 0.9904413 -21.41216 115 9 1.1 0.9 26.5600 -2.7100 0.0000 0.0000; + 1018 1 0.07 0.02 0 0 1 0.9965435 -20.156205 115 9 1.1 0.9 29.9100 -2.1500 0.0000 0.0000; + 1019 1 61.78 17.5 0 142.98 1 1.0040552 -22.237084 115 9 1.1 0.9 21.2500 -3.6000 0.0000 0.0000; + 1020 1 0 0 0 76.73 1 1.0259069 -15.252842 115 9 1.1 0.9 -53.9700 0.0000 0.0000 0.0000; + 1021 2 0 0 0 0 1 1.0016168 -8.668233 13.8 9 1.1 0.9 -52.3600 0.0000 0.0000 0.0000; + 1022 1 0 0 0 0 1 1.0156825 -16.129727 115 9 1.1 0.9 -6.0700 0.1900 0.0000 0.0000; + 1023 2 0 0 0 0 1 1.0100036 -7.245683 13.8 9 1.1 0.9 -5.9200 0.0000 0.0000 0.0000; + 1024 1 63.04 17.86 0 0 1 0.9971655 -19.133526 115 9 1.1 0.9 32.4600 -0.9900 0.0000 0.0000; + 1025 1 0 0 0 0 1 1.021133 -14.197091 115 9 1.1 0.9 -52.2600 -11.8400 0.0000 0.0000; + 1026 2 0 0 0 0 1 1.0000036 -4.707268 13.8 9 1.1 0.9 -49.5300 0.0000 0.0000 0.0000; + 1027 1 101.21 28.68 0 75 1 1.0139861 -25.752862 115 9 1.1 0.9 -5.6400 -2.4900 0.0000 0.0000; + 1028 1 10.01 2.84 0 0 1 1.0190224 -17.633912 115 9 1.1 0.9 -4.8900 0.5000 0.0000 0.0000; + 1029 1 83.18 23.57 0 65.41 1 1.0300037 -24.955148 115 9 1.1 0.9 -0.1500 -0.6100 0.0000 0.0000; + 1030 1 24.63 6.98 0 0 1 1.0182991 -13.494046 115 9 1.1 0.9 99.1600 -10.0500 0.0000 0.0000; + 1031 1 9.25 2.62 0 0 1 1.0191923 -17.690257 115 9 1.1 0.9 61.7400 -0.0300 0.0000 0.0000; + 1032 1 0 0 0 0 1 1.0064914 -12.394114 115 9 1.1 0.9 132.8800 -43.5100 0.0000 0.0000; + 1033 2 0 0 0 50 1 1.0259109 -16.949237 230 9 1.1 0.9 51.5300 -22.1400 0.0000 0.0000; + 1034 1 0 0 0 0 1 1.0064769 -14.328033 115 9 1.1 0.9 -27.5400 -36.4900 0.0000 0.0000; + 1035 2 0 0 0 0 1 1.0000036 -11.038753 13.8 9 1.1 0.9 -23.3600 0.0000 0.0000 0.0000; + 1036 1 13.6 3.85 0 0 1 1.000559 -12.598627 115 9 1.1 0.9 107.4400 -21.8600 0.0000 0.0000; + 1037 1 102.24 28.97 0 0 1 0.9813726 -22.48228 115 9 1.1 0.9 27.0800 -3.0000 0.0000 0.0000; + 1038 1 0 0 0 0 1 1.0200949 -7.759505 115 9 1.1 0.9 110.7900 -14.8600 0.0000 0.0000; + 1039 2 0 0 0 0 1 1.0000035 -2.38994 22 9 1.1 0.9 112.0800 0.0000 0.0000 0.0000; + 1040 1 44.36 12.57 0 0 1 0.995842 -20.396949 115 9 1.1 0.9 29.6800 -1.7100 0.0000 0.0000; + 1041 1 0 0 0 0 1 1.0049175 -15.121136 115 9 1.1 0.9 -1038.7500 23.7600 0.0000 0.0000; + 1042 2 0 0 0 0 1 1.0049175 -15.121136 13.8 9 1.1 0.9 -1038.7500 23.7600 0.0000 0.0000; + 1043 2 0 0 0 0 1 1.0000036 -11.883763 13.8 9 1.1 0.9 -1037.8800 0.0000 0.0000 0.0000; + 1044 1 14.68 4.16 0 0 1 1.0151811 -25.876036 115 9 1.1 0.9 -141.5500 -40.2700 0.0000 0.0000; + 1045 1 98.56 27.93 0 0 1 0.9827629 -24.352257 115 9 1.1 0.9 18.0500 -3.5000 0.0000 0.0000; + 1046 1 11.08 3.14 0 12 1 1.0281129 -22.494317 115 9 1.1 0.9 -423.4200 31.5500 0.0000 0.0000; + 1047 1 0 0 0 0 1 1.0086095 -13.372118 115 9 1.1 0.9 47.2400 -1.2800 0.0000 0.0000; + 1048 2 0 0 0 0 1 1.0086095 -13.372118 18 9 1.1 0.9 47.2400 -1.2800 0.0000 0.0000; + 1049 2 0 0 0 0 1 1.0086095 -13.372118 18 9 1.1 0.9 47.2400 -1.2800 0.0000 0.0000; + 1050 2 0 0 0 0 1 1.0000036 -8.317495 18 9 1.1 0.9 47.1700 0.0000 0.0000 0.0000; + 1051 2 0 0 0 0 1 1.0000036 -6.84264 18 9 1.1 0.9 47.0500 0.0000 0.0000 0.0000; + 1052 2 0 0 0 0 1 1.0009878 -9.168399 18 9 1.1 0.9 47.1300 0.0000 0.0000 0.0000; + 1053 2 0 0 0 0 1 1.0257297 -17.34203 230 9 1.1 0.9 46.3800 -0.3200 0.0000 0.0000; + 1054 1 14.99 4.25 0 0 1 1.0125102 -22.284887 115 9 1.1 0.9 -18.5800 0.2400 0.0000 0.0000; + 1055 1 3.98 1.13 0 0 1 1.0056314 -18.059023 115 9 1.1 0.9 -8.0700 -0.0300 0.0000 0.0000; + 1056 1 0 0 0 56.13 1 1.0300037 -21.836825 115 9 1.1 0.9 -20.8400 0.0000 0.0000 0.0000; + 1057 2 0 0 0 0 1 1.0300037 -21.836825 18 9 1.1 0.9 -20.8400 0.0000 0.0000 0.0000; + 1058 1 13.46 3.81 0 0 1 1.0257559 -11.359509 115 9 1.1 0.9 -585.8000 13.3000 0.0000 0.0000; + 1059 2 0 0 0 0 1 1.0257559 -11.359509 22 9 1.1 0.9 -585.8000 13.3000 0.0000 0.0000; + 1060 2 0 0 0 0 1 1.0257559 -11.359509 22 9 1.1 0.9 -585.8000 13.3000 0.0000 0.0000; + 1061 1 0 0 0 0 1 1.011891 -17.239365 115 9 1.1 0.9 -60.9200 -23.1300 0.0000 0.0000; + 1062 2 0 0 0 0 1 1.011891 -17.239365 13.8 9 1.1 0.9 -60.9200 -23.1300 0.0000 0.0000; + 1063 2 0 0 0 0 1 1.011891 -17.239365 13.8 9 1.1 0.9 -60.9200 -23.1300 0.0000 0.0000; + 1064 1 123.76 35.07 0 0 1 0.9768367 -24.054482 115 9 1.1 0.9 23.2500 -3.5400 0.0000 0.0000; + 1065 1 0 0 0 0 1 1.0078425 -14.9558 115 9 1.1 0.9 -2026.4900 113.3100 0.0000 0.0000; + 1066 2 0 0 0 0 1 1.0000036 -7.440687 13.8 9 1.1 0.9 -2023.9500 0.0000 0.0000 0.0000; + 1067 1 101.55 28.77 0 0 1 1.0018217 -15.690254 115 9 1.1 0.9 -45.3700 -60.7700 0.0000 0.0000; + 1068 1 59.4 16.83 0 0 1 0.9876132 -16.454991 115 9 1.1 0.9 37.4700 -15.8100 0.0000 0.0000; + 1069 1 0 0 0 0 1 1.0272175 -8.876951 115 9 1.1 0.9 -619.5200 14.7100 0.0000 0.0000; + 1070 2 0 0 0 0 1 1.0400036 -4.382542 13.8 9 1.1 0.9 -617.1200 0.0000 0.0000 0.0000; + 1071 1 91.46 25.91 0 0 1 0.9912743 -21.394129 115 9 1.1 0.9 27.6900 -3.3500 0.0000 0.0000; + 1072 2 0 0 0 0 1 1.0100037 -12.054718 18 9 1.1 0.9 28.0300 0.0000 0.0000 0.0000; + 1073 2 0 0 0 0 1 1.0100037 -5.661534 18 9 1.1 0.9 28.3400 0.0000 0.0000 0.0000; + 1074 2 0 0 0 0 1 1.0100037 -7.70557 18 9 1.1 0.9 28.2000 0.0000 0.0000 0.0000; + 1075 2 0 0 0 0 1 1.0100037 -10.463225 18 9 1.1 0.9 28.1600 0.0000 0.0000 0.0000; + 1076 2 0 0 0 0 1 0.9912743 -21.394129 18 9 1.1 0.9 27.6900 -3.3500 0.0000 0.0000; + 1077 2 0 0 0 0 1 0.9912743 -21.394129 18 9 1.1 0.9 27.6900 -3.3500 0.0000 0.0000; + 1078 2 0 0 0 0 1 1.0100037 -10.982473 18 9 1.1 0.9 28.1900 0.0000 0.0000 0.0000; + 1079 2 0 0 0 0 1 1.0198409 -38.334204 500 9 1.1 0.9 38.0200 -10.2300 0.0000 0.0000; + 1080 2 0 0 0 0 1 1.0100037 -10.401045 18 9 1.1 0.9 28.0600 0.0000 0.0000 0.0000; + 1081 2 0 0 0 79.77 1 1.0300036 -18.68991 230 9 1.1 0.9 46.2600 0.0000 0.0000 0.0000; + 1082 2 0 0 0 0 1 1.0233299 -6.05054 115 9 1.1 0.9 -589.2600 7.3400 0.0000 0.0000; + 1083 1 39.95 11.32 0 26.15 1 1.0227241 -9.981271 115 9 1.1 0.9 102.1700 -13.7100 0.0000 0.0000; + 1084 2 0 0 0 0 1 1.0283078 -16.471192 115 9 1.1 0.9 -42.6500 -7.5000 0.0000 0.0000; + 1085 1 21.3 6.03 0 0 1 1.011558 -15.327359 115 9 1.1 0.9 44.1000 -0.9300 0.0000 0.0000; + 1086 1 39.67 11.24 0 30 1 1.0186846 -17.567109 115 9 1.1 0.9 47.0000 -1.1800 0.0000 0.0000; + 1087 1 0.91 0.26 0 14.05 1 1.0300036 -16.230416 115 9 1.1 0.9 -514.2000 0.0000 0.0000 0.0000; + 1088 2 0 0 0 0 1 1.0000036 -11.910186 115 9 1.1 0.9 82.0500 0.0000 0.0000 0.0000; + 1089 1 40.6 11.5 0 0 1 0.9866587 -21.244278 115 9 1.1 0.9 -12.4400 -0.2700 0.0000 0.0000; + 1090 2 0 0 0 0 1 1.0200037 -16.064038 115 9 1.1 0.9 34.4400 0.0000 0.0000 0.0000; + 1091 1 11.62 3.29 0 0 1 1.0327141 -30.810235 161 9 1.1 0.9 -23.2600 -0.7600 0.0000 0.0000; + 2001 1 48.36 13.7 0 0 2 1.0028305 -59.60226 161 11 1.1 0.9 141.9600 14.2400 0.0000 0.0000; + 2002 1 0 0 0 0 2 1.0127504 -61.189054 500 11 1.1 0.9 148.2000 16.9700 0.0000 0.0000; + 2003 1 0 0 0 0 2 1.0114428 -63.443341 161 11 1.1 0.9 155.9200 19.8300 0.0000 0.0000; + 2004 2 0 0 0 0 2 1.0127504 -61.189054 13.8 11 1.1 0.9 148.2000 16.9700 0.0000 0.0000; + 2005 2 0 0 0 0 2 1.0127504 -61.189054 13.8 11 1.1 0.9 148.2000 16.9700 0.0000 0.0000; + 2006 2 0 0 0 0 2 1.0127504 -61.189054 13.8 11 1.1 0.9 148.2000 16.9700 0.0000 0.0000; + 2007 1 9.54 2.7 0 0 2 1.0037001 -59.372996 161 11 1.1 0.9 144.5600 16.5900 0.0000 0.0000; + 2008 1 8.06 2.28 0 0 2 1.0195642 -32.538822 161 10 1.1 0.9 6.8600 -1.0900 0.0000 0.0000; + 2009 1 39.14 11.09 0 120 2 1.0240415 -44.929252 161 11 1.1 0.9 19.7100 0.0000 0.0000 0.0000; + 2010 1 56.81 16.09 0 30.17 2 1.0300037 -36.203466 161 10 1.1 0.9 -47.2000 0.0000 0.0000 0.0000; + 2011 1 0 0 0 0 2 1.0391574 -31.780334 500 10 1.1 0.9 24.3600 -0.3500 0.0000 0.0000; + 2012 1 0 0 0 0 2 1.0281418 -29.554483 161 10 1.1 0.9 21.8000 -0.7200 0.0000 0.0000; + 2013 2 0 0 0 0 2 1.0308001 -29.441672 18 10 1.1 0.9 24.3700 -0.3600 0.0000 0.0000; + 2014 1 25.43 7.2 0 0 2 1.0192746 -33.128426 161 10 1.1 0.9 -1.8700 -0.8300 0.0000 0.0000; + 2015 1 4.69 1.33 0 0 2 1.0119269 -62.94927 161 11 1.1 0.9 247.0500 17.4400 0.0000 0.0000; + 2016 1 69.27 19.63 0 0 2 1.0110365 -69.563089 161 11 1.1 0.9 2322.9100 545.8200 0.0000 0.0000; + 2017 1 0 0 0 -200 2 1.0309429 -31.944266 500 10 1.1 0.9 21.4800 0.1900 0.0000 0.0000; + 2018 1 0 0 0 0 2 1.0285229 -31.154853 161 10 1.1 0.9 21.6700 -0.1000 0.0000 0.0000; + 2019 2 0 0 0 0 2 1.0309429 -31.944266 20 10 1.1 0.9 21.4800 0.1900 0.0000 0.0000; + 2020 1 47.97 13.59 0 0 2 0.9971221 -44.577474 161 11 1.1 0.9 25.6900 4.2600 0.0000 0.0000; + 2021 1 0 0 0 0 2 1.0147857 -56.329248 500 11 1.1 0.9 135.3500 9.9500 0.0000 0.0000; + 2022 1 11.56 3.28 0 0 2 1.0110382 -58.260249 161 11 1.1 0.9 138.8400 13.0800 0.0000 0.0000; + 2023 2 0 0 0 0 2 1.0200037 -54.766915 13.8 11 1.1 0.9 134.8100 0.0000 0.0000 0.0000; + 2024 2 0 0 0 0 2 1.0200037 -54.102087 13.8 11 1.1 0.9 134.6600 0.0000 0.0000 0.0000; + 2025 1 39.62 11.23 0 0 2 0.9957092 -43.814611 161 11 1.1 0.9 17.8400 1.5300 0.0000 0.0000; + 2026 1 18.57 5.26 0 0 2 1.0269597 -30.76094 161 10 1.1 0.9 23.8600 -0.4700 0.0000 0.0000; + 2027 1 3.55 1.01 0 0 2 1.0033184 -60.032422 161 11 1.1 0.9 143.7200 14.9800 0.0000 0.0000; + 2028 1 14.24 4.03 0 0 2 0.9973652 -46.944103 161 11 1.1 0.9 44.1300 10.6900 0.0000 0.0000; + 2029 1 3.2 0.91 0 0 2 1.0258493 -32.521904 161 10 1.1 0.9 -8.6900 -0.5600 0.0000 0.0000; + 2030 1 47.15 13.36 0 0 2 0.9899978 -63.651835 161 11 1.1 0.9 163.8000 24.6200 0.0000 0.0000; + 2031 1 5.77 1.63 0 0 2 1.0274656 -29.477812 161 10 1.1 0.9 -81.8900 7.2400 0.0000 0.0000; + 2032 1 3.35 0.95 0 0 2 1.0056747 -58.769309 161 11 1.1 0.9 142.6200 15.3300 0.0000 0.0000; + 2033 1 13.57 3.85 0 0 2 0.9926513 -65.160443 161 11 1.1 0.9 172.6100 26.2800 0.0000 0.0000; + 2034 1 5.34 1.51 0 0 2 1.0087755 -68.886605 161 11 1.1 0.9 2456.8200 590.2500 0.0000 0.0000; + 2035 1 4.68 1.33 0 0 2 1.0225087 -30.410783 161 10 1.1 0.9 -98.5100 10.2600 0.0000 0.0000; + 2036 1 41.59 11.78 0 0 2 1.0010787 -44.178555 161 11 1.1 0.9 20.6100 1.7700 0.0000 0.0000; + 2037 1 3.5 0.99 0 0 2 1.0231762 -63.290496 161 11 1.1 0.9 275.4100 12.4300 0.0000 0.0000; + 2038 1 2.6 0.74 0 0 2 1.0084005 -63.914513 161 11 1.1 0.9 159.8400 21.4800 0.0000 0.0000; + 2039 1 5.56 1.58 0 0 2 0.9953598 -60.323988 161 11 1.1 0.9 168.9500 23.3000 0.0000 0.0000; + 2040 1 15.9 4.51 0 0 2 1.0085073 -58.929562 161 11 1.1 0.9 140.7400 13.7500 0.0000 0.0000; + 2041 1 0 0 0 0 2 1.0289976 -27.374918 161 10 1.1 0.9 21.8900 -0.5400 0.0000 0.0000; + 2042 2 0 0 0 0 2 1.0204143 -24.804568 18 10 1.1 0.9 21.9000 -2.8900 0.0000 0.0000; + 2043 1 4.24 1.2 0 0 2 1.0095614 -69.195156 161 11 1.1 0.9 2400.3300 573.9300 0.0000 0.0000; + 2044 1 27.4 7.76 0 0 2 1.018029 -65.016518 161 11 1.1 0.9 261.0300 18.8300 0.0000 0.0000; + 2045 1 22.61 6.4 0 0 2 0.9965663 -45.116654 161 11 1.1 0.9 29.4400 5.7000 0.0000 0.0000; + 2046 1 22.13 6.27 0 0 2 1.0083263 -68.498314 161 11 1.1 0.9 2515.8800 603.8800 0.0000 0.0000; + 2047 1 14.96 4.24 0 0 2 1.0102323 -64.342317 161 11 1.1 0.9 1395.5700 363.4200 0.0000 0.0000; + 2048 1 6.42 1.82 0 0 2 1.031688 -31.522443 161 10 1.1 0.9 -50.4400 2.9400 0.0000 0.0000; + 2049 1 11.57 3.28 0 0 2 1.0212137 -40.667536 161 10 1.1 0.9 -0.7900 2.0600 0.0000 0.0000; + 2050 1 3.66 1.04 0 0 2 0.9955969 -62.848806 161 11 1.1 0.9 156.1600 20.5300 0.0000 0.0000; + 2051 1 17.85 5.06 0 0 2 0.9932948 -53.824107 161 11 1.1 0.9 119.2700 25.2600 0.0000 0.0000; + 2052 1 24.84 7.04 0 0 2 1.0197355 -31.658607 161 10 1.1 0.9 14.1300 -1.1100 0.0000 0.0000; + 2053 1 29.13 8.25 0 0 2 0.993578 -59.003536 161 11 1.1 0.9 109.2800 18.7400 0.0000 0.0000; + 2054 1 0 0 0 0 2 0.9992403 -42.825425 500 11 1.1 0.9 19.4700 0.9900 0.0000 0.0000; + 2055 1 49.62 14.06 0 0 2 0.9990468 -43.652909 161 11 1.1 0.9 20.7500 1.9800 0.0000 0.0000; + 2056 2 0 0 0 0 2 0.9992403 -42.825425 18 11 1.1 0.9 19.4700 0.9900 0.0000 0.0000; + 2057 2 0 0 0 0 2 0.9900036 -38.424 18 11 1.1 0.9 19.3300 0.0000 0.0000 0.0000; + 2058 1 0 0 0 0 2 1.0292536 -26.946807 161 10 1.1 0.9 22.1100 -0.5300 0.0000 0.0000; + 2059 2 0 0 0 0 2 1.0192676 -23.60635 13.8 10 1.1 0.9 22.0900 -0.5300 0.0000 0.0000; + 2060 1 3.8 1.08 0 0 2 0.9987303 -61.567396 161 11 1.1 0.9 151.9700 19.2900 0.0000 0.0000; + 2061 1 0 0 0 0 2 1.0241813 -37.153069 161 10 1.1 0.9 -16.0700 0.8800 0.0000 0.0000; + 2062 2 0 0 0 0 2 1.0200037 -34.856437 18 10 1.1 0.9 -16.0600 0.0000 0.0000 0.0000; + 2063 1 65.62 18.59 0 40 2 1.0094256 -67.860557 161 11 1.1 0.9 2558.9800 612.1200 0.0000 0.0000; + 2064 1 10.05 2.85 0 0 2 1.0042757 -59.897232 161 11 1.1 0.9 145.0500 16.1800 0.0000 0.0000; + 2065 1 78.36 22.2 0 100 2 1.0266022 -65.248986 161 11 1.1 0.9 317.7700 0.0000 0.0000 0.0000; + 2066 1 7.11 2.02 0 0 2 1.0205541 -27.500251 161 10 1.1 0.9 -119.1700 10.1000 0.0000 0.0000; + 2067 1 53.97 15.29 0 0 2 0.9938774 -43.737026 161 11 1.1 0.9 13.7100 1.0900 0.0000 0.0000; + 2068 1 5.76 1.63 0 0 2 1.0000156 -41.705083 161 11 1.1 0.9 -3.0800 -0.2200 0.0000 0.0000; + 2069 1 21.92 6.21 0 120 2 1.0256589 -68.742467 161 11 1.1 0.9 211.3000 0.0000 0.0000 0.0000; + 2070 1 0 0 0 0 2 1.0020167 -41.28671 161 11 1.1 0.9 -9.2800 -0.1900 0.0000 0.0000; + 2071 2 0 0 0 0 2 1.0000036 -37.610519 18 11 1.1 0.9 -9.2200 0.0000 0.0000 0.0000; + 2072 1 9.71 2.75 0 0 2 1.0193101 -66.865499 161 11 1.1 0.9 196.2700 48.1600 0.0000 0.0000; + 2073 1 0 0 0 0 2 1.0206805 -24.994746 161 10 1.1 0.9 -134.8900 8.3800 0.0000 0.0000; + 2074 1 0 0 0 0 2 1.0103706 -23.14277 115 10 1.1 0.9 -187.9600 4.7300 0.0000 0.0000; + 2075 1 0 0 0 0 2 1.0103706 -23.14277 115 10 1.1 0.9 -187.9600 4.7300 0.0000 0.0000; + 2076 2 0 0 0 0 2 1.0259186 -24.097157 24 10 1.1 0.9 -134.9500 8.3600 0.0000 0.0000; + 2077 1 0 0 0 0 2 1.0234359 -60.875623 161 11 1.1 0.9 244.4700 11.6100 0.0000 0.0000; + 2078 2 0 0 0 0 2 1.0200037 -57.562196 13.8 11 1.1 0.9 242.7000 0.0000 0.0000 0.0000; + 2079 1 4.48 1.27 0 0 2 1.0315049 -34.430602 161 10 1.1 0.9 -48.5300 1.3600 0.0000 0.0000; + 2080 1 16.93 4.8 0 0 2 0.9988796 -57.174905 161 11 1.1 0.9 160.8500 24.6900 0.0000 0.0000; + 2081 1 4.46 1.26 0 0 2 1.0029399 -64.71821 161 11 1.1 0.9 166.9900 24.3400 0.0000 0.0000; + 2082 1 59.03 16.73 0 0 2 1.0054662 -44.525835 161 11 1.1 0.9 20.4200 1.5300 0.0000 0.0000; + 2083 2 0 0 0 0 2 1.0200037 -42.953793 20 11 1.1 0.9 20.3100 1.4800 0.0000 0.0000; + 2084 2 0 0 0 0 2 1.0054662 -44.525835 20 11 1.1 0.9 20.4200 1.5300 0.0000 0.0000; + 2085 2 0 0 0 0 2 1.0054662 -44.525835 20 11 1.1 0.9 20.4200 1.5300 0.0000 0.0000; + 2086 1 2.19 0.62 0 0 2 0.9966171 -59.135878 161 11 1.1 0.9 165.9200 23.9800 0.0000 0.0000; + 2087 1 7.9 2.24 0 0 2 1.0234535 -27.335879 161 10 1.1 0.9 -109.6900 9.0500 0.0000 0.0000; + 2088 1 0 0 0 0 2 1.0010231 -41.405037 161 11 1.1 0.9 -5.3400 -0.2400 0.0000 0.0000; + 2089 2 0 0 0 0 2 1.0000036 -37.804418 24 11 1.1 0.9 -5.2800 0.0000 0.0000 0.0000; + 2090 1 2.42 0.69 0 0 2 1.0037195 -60.651608 161 11 1.1 0.9 146.6600 16.3500 0.0000 0.0000; + 2091 1 17.05 4.83 0 0 2 1.0250043 -33.796582 161 10 1.1 0.9 -72.4200 7.2000 0.0000 0.0000; + 2092 1 24.11 6.83 0 0 2 1.0082536 -66.176092 161 11 1.1 0.9 2569.9700 618.2600 0.0000 0.0000; + 2093 1 0 0 0 0 2 1.0287779 -30.313058 161 10 1.1 0.9 21.7400 -0.4300 0.0000 0.0000; + 2094 2 0 0 0 0 2 1.0287779 -30.313058 13.8 10 1.1 0.9 21.7400 -0.4300 0.0000 0.0000; + 2095 2 0 0 0 0 2 1.0287779 -30.313058 13.8 10 1.1 0.9 21.7400 -0.4300 0.0000 0.0000; + 2096 1 0 0 0 -68.51 2 1.0299997 -27.645227 500 10 1.1 0.9 9.9700 0.6400 0.0000 0.0000; + 2097 1 0 0 0 0 2 1.0286671 -27.098475 230 10 1.1 0.9 7.2600 0.5800 0.0000 0.0000; + 2098 1 0 0 0 0 2 1.033775 -30.224427 161 10 1.1 0.9 -18.4100 -1.6600 0.0000 0.0000; + 2099 2 0 0 0 0 2 1.0295321 -27.504092 18 10 1.1 0.9 9.9600 0.0000 0.0000 0.0000; + 2100 2 0 0 0 0 2 1.0207998 -25.039206 18 10 1.1 0.9 9.9300 0.0000 0.0000 0.0000; + 2101 1 0 0 0 0 2 1.0123899 -62.293898 500 11 1.1 0.9 150.8700 18.3100 0.0000 0.0000; + 2102 1 0 0 0 0 2 1.0131827 -63.73776 161 11 1.1 0.9 176.2200 27.2000 0.0000 0.0000; + 2103 2 0 0 0 0 2 1.0123899 -62.293898 20 11 1.1 0.9 150.8700 18.3100 0.0000 0.0000; + 2104 2 0 0 0 0 2 1.0123899 -62.293898 20 11 1.1 0.9 150.8700 18.3100 0.0000 0.0000; + 2105 2 0 0 0 0 2 1.0123899 -62.293898 20 11 1.1 0.9 150.8700 18.3100 0.0000 0.0000; + 2106 1 14.4 4.08 0 0 2 0.9910979 -65.805332 161 11 1.1 0.9 178.0800 28.5300 0.0000 0.0000; + 2107 1 74.15 21.01 0 0 2 1.0078222 -64.606397 161 11 1.1 0.9 192.4900 27.8800 0.0000 0.0000; + 2108 1 2.14 0.61 0 0 2 1.0034813 -43.407819 161 10 1.1 0.9 -182.5800 88.3600 0.0000 0.0000; + 2109 1 33.81 9.58 0 0 2 1.010155 -46.060351 161 11 1.1 0.9 29.5300 4.9400 0.0000 0.0000; + 2110 1 8.59 2.43 0 50 2 1.0267183 -61.949264 161 11 1.1 0.9 257.1700 0.0000 0.0000 0.0000; + 2111 1 13.95 3.95 0 0 2 0.9973075 -48.6609 161 11 1.1 0.9 -69.6100 41.0200 0.0000 0.0000; + 2112 1 4.54 1.29 0 0 2 0.9947264 -49.07163 161 11 1.1 0.9 66.3900 17.3200 0.0000 0.0000; + 2113 1 0 0 0 0 2 1.0146803 -55.860332 500 11 1.1 0.9 133.9900 9.7700 0.0000 0.0000; + 2114 1 70.78 20.05 0 0 2 1.0123542 -57.144719 161 11 1.1 0.9 136.1600 11.9500 0.0000 0.0000; + 2115 2 0 0 0 0 2 1.0058027 -51.873841 13.8 11 1.1 0.9 132.2500 10.0800 0.0000 0.0000; + 2116 2 0 0 0 0 2 1.0104495 -53.794824 13.8 11 1.1 0.9 133.1500 9.8900 0.0000 0.0000; + 2117 2 0 0 0 0 2 1.0030718 -51.23565 13.8 11 1.1 0.9 132.1800 10.1200 0.0000 0.0000; + 2118 2 0 0 0 0 2 1.001705 -50.728714 13.8 11 1.1 0.9 131.9000 10.1900 0.0000 0.0000; + 2119 2 0 0 0 0 2 1.0093702 -53.343166 13.8 11 1.1 0.9 132.9700 9.9300 0.0000 0.0000; + 2120 2 0 0 0 0 2 1.0100037 -50.974945 13.8 11 1.1 0.9 132.6900 0.0000 0.0000 0.0000; + 2121 1 2.33 0.66 0 0 2 1.0072293 -59.561706 161 11 1.1 0.9 142.7900 14.6600 0.0000 0.0000; + 2122 1 6.72 1.9 0 0 2 0.9976392 -60.762015 161 11 1.1 0.9 151.1300 19.2700 0.0000 0.0000; + 2123 2 0 0 0 0 2 1.0294908 -26.71907 161 10 1.1 0.9 21.9000 -0.5800 0.0000 0.0000; + 2124 1 21.29 6.03 0 0 2 0.9900034 -66.877809 161 11 1.1 0.9 185.1500 31.6200 0.0000 0.0000; + 2125 1 4.06 1.15 0 0 2 0.996358 -66.944981 161 11 1.1 0.9 282.3300 18.7500 0.0000 0.0000; + 2126 1 14.24 4.03 0 0 2 1.0126625 -66.636731 161 11 1.1 0.9 433.8600 -10.0600 0.0000 0.0000; + 2127 2 0 0 0 -184.86 2 1.0400037 -33.644241 500 10 1.1 0.9 25.3800 0.0000 0.0000 0.0000; + 2128 1 0 0 0 0 2 1.0303186 -32.154116 161 10 1.1 0.9 24.6700 -0.5100 0.0000 0.0000; + 2129 1 6.63 1.88 0 0 2 0.9941082 -65.72191 161 11 1.1 0.9 177.8900 27.7500 0.0000 0.0000; + 2130 1 0 0 0 0 2 1.005481 -42.032756 161 10 1.1 0.9 -210.8000 96.3000 0.0000 0.0000; + 2131 1 0 0 0 0 2 1.000627 -39.465573 115 10 1.1 0.9 -270.0100 97.4600 0.0000 0.0000; + 2132 1 11.94 3.38 0 10 2 1.0167576 -41.185988 115 10 1.1 0.9 -264.3100 99.5600 0.0000 0.0000; + 2133 1 5.68 1.61 0 0 2 1.0181866 -60.200361 161 11 1.1 0.9 228.4300 15.1400 0.0000 0.0000; + 3001 1 0 0 0 0 3 1.0137236 -55.704689 230 28 1.1 0.9 47.3800 6.4700 0.0000 0.0000; + 3002 1 112.86 31.98 0 0 3 1.0017833 -58.138561 115 28 1.1 0.9 45.2300 5.4500 0.0000 0.0000; + 3003 1 0 0 0 0 3 1.0178015 -18.168179 115 27 1.1 0.9 -695.0700 17.0000 0.0000 0.0000; + 3004 2 0 0 0 0 3 1.012923 -16.578644 18 27 1.1 0.9 -694.7500 16.9300 0.0000 0.0000; + 3005 1 7.34 2.08 0 0 3 1.0200387 -58.122796 115 28 1.1 0.9 20.2200 2.0100 0.0000 0.0000; + 3006 1 7.35 2.08 0 0 3 1.0052002 -26.758125 115 27 1.1 0.9 -794.6200 136.2000 0.0000 0.0000; + 3007 1 14.96 4.24 0 0 3 1.0157044 -24.597087 115 27 1.1 0.9 -1158.2600 188.5800 0.0000 0.0000; + 3008 1 19.81 5.61 0 0 3 0.9963778 -36.954705 115 27 1.1 0.9 -393.0600 160.7100 0.0000 0.0000; + 3009 1 12.54 3.55 0 0 3 1.0213724 -31.108449 115 28 1.1 0.9 -263.4100 27.7100 0.0000 0.0000; + 3010 1 4.67 1.32 0 0 3 1.0025526 -57.072528 115 28 1.1 0.9 20.4500 1.7200 0.0000 0.0000; + 3011 1 27.14 7.69 0 0 3 1.0168172 -61.057449 115 28 1.1 0.9 287.9000 37.4400 0.0000 0.0000; + 3012 1 0.56 0.16 0 0 3 1.0182316 -60.658779 115 28 1.1 0.9 300.4400 34.5300 0.0000 0.0000; + 3013 1 64.56 18.29 0 65 3 1.0188327 -28.428432 115 27 1.1 0.9 -960.1800 183.8600 0.0000 0.0000; + 3014 1 22 6.23 0 0 3 1.0190822 -53.241903 115 28 1.1 0.9 76.1700 27.9700 0.0000 0.0000; + 3015 1 5.36 1.52 0 0 3 1.01533 -16.953076 115 27 1.1 0.9 -269.5900 -197.3100 0.0000 0.0000; + 3016 1 0 0 0 0 3 1.0119036 -21.862245 115 27 1.1 0.9 -1129.7900 123.3300 0.0000 0.0000; + 3017 2 0 0 0 0 3 1.0100036 -16.668576 18 27 1.1 0.9 -1138.8300 0.0000 0.0000 0.0000; + 3018 1 0 0 0 0 3 1.0303312 -29.038546 230 27 1.1 0.9 -157.1900 -28.1900 0.0000 0.0000; + 3019 1 0 0 0 40.95 3 1.0300036 -30.63772 115 27 1.1 0.9 -213.1900 0.0000 0.0000 0.0000; + 3020 2 0 0 0 0 3 1.0300036 -24.91851 13.8 27 1.1 0.9 -154.1300 0.0000 0.0000 0.0000; + 3021 1 1.94 0.55 0 0 3 1.0053529 -35.541844 115 27 1.1 0.9 -338.6300 100.9900 0.0000 0.0000; + 3022 1 24.59 6.97 0 0 3 0.9989041 -18.045227 115 27 1.1 0.9 -50.0000 -138.8000 0.0000 0.0000; + 3023 1 10.41 2.95 0 50 3 1.0269219 -26.895923 115 27 1.1 0.9 -538.5100 0.0000 0.0000 0.0000; + 3024 1 10.13 2.87 0 0 3 1.0257894 -31.076161 115 28 1.1 0.9 -229.7000 -19.6700 0.0000 0.0000; + 3025 1 13.67 3.87 0 0 3 0.9989445 -45.324839 115 28 1.1 0.9 -105.4600 77.8300 0.0000 0.0000; + 3026 1 0 0 0 0 3 1.0288856 -36.618323 230 27 1.1 0.9 -722.6500 73.6700 0.0000 0.0000; + 3027 1 0 0 0 0 3 1.019168 -37.219994 115 27 1.1 0.9 -740.5900 323.8500 0.0000 0.0000; + 3028 2 0 0 0 0 3 1.0400037 -34.034269 18 27 1.1 0.9 -726.0500 2398.8100 0.0000 0.0000; + 3029 1 4.87 1.38 0 0 3 1.0300528 -53.517743 115 28 1.1 0.9 47.7900 0.3600 0.0000 0.0000; + 3030 1 129.72 36.75 0 80 3 1.0178371 -39.89665 115 27 1.1 0.9 326.7200 -108.0200 0.0000 0.0000; + 3031 1 14.73 4.17 0 0 3 1.0005941 -26.115261 115 27 1.1 0.9 -579.0800 82.9500 0.0000 0.0000; + 3032 1 72.86 20.64 0 0 3 1.0022897 -26.98529 115 27 1.1 0.9 -959.5200 165.5000 0.0000 0.0000; + 3033 1 0 0 0 0 3 1.0089061 -14.969161 115 27 1.1 0.9 -809.5000 10.4900 0.0000 0.0000; + 3034 2 0 0 0 0 3 1.0300036 -5.702912 22 27 1.1 0.9 -806.7900 0.0000 0.0000 0.0000; + 3035 1 3.47 0.98 0 0 3 1.0021183 -44.438843 115 28 1.1 0.9 -96.9500 75.1700 0.0000 0.0000; + 3036 1 5.8 1.64 0 0 3 0.998823 -41.632464 115 28 1.1 0.9 -204.0100 116.1700 0.0000 0.0000; + 3037 1 0 0 0 0 3 1.0274371 -25.406821 230 27 1.1 0.9 4.6200 -6.5000 0.0000 0.0000; + 3038 1 0 0 0 0 3 1.0075834 -20.036372 115 27 1.1 0.9 -111.3100 -91.9200 0.0000 0.0000; + 3039 2 0 0 0 0 3 1.0400037 -22.829877 13.8 27 1.1 0.9 5.2200 -6.3600 0.0000 0.0000; + 3040 1 14.61 4.14 0 0 3 0.997184 -34.254583 115 27 1.1 0.9 51.9900 -29.6900 0.0000 0.0000; + 3041 1 0 0 0 0 3 1.019886 -29.135657 230 27 1.1 0.9 44.2900 -9.7400 0.0000 0.0000; + 3042 1 8.75 2.48 0 0 3 1.006916 -18.790587 115 27 1.1 0.9 -170.9300 -1.3900 0.0000 0.0000; + 3043 2 0 0 0 0 3 1.019886 -29.135657 13.8 27 1.1 0.9 44.2900 -9.7400 0.0000 0.0000; + 3044 2 0 0 0 0 3 1.019886 -29.135657 13.8 27 1.1 0.9 44.2900 -9.7400 0.0000 0.0000; + 3045 2 0 0 0 0 3 1.019886 -29.135657 13.8 27 1.1 0.9 44.2900 -9.7400 0.0000 0.0000; + 3046 1 0 0 0 200 3 1.016328 -34.54236 230 27 1.1 0.9 61.9700 -20.0900 0.0000 0.0000; + 3047 1 0 0 0 116.24 3 1.0300036 -20.522627 115 27 1.1 0.9 -397.2000 0.0000 0.0000 0.0000; + 3048 2 0 0 0 0 3 1.0213904 -41.391566 500 27 1.1 0.9 39.1800 -12.0100 0.0000 0.0000; + 3049 1 10.58 3 0 0 3 1.0065595 -29.893009 115 27 1.1 0.9 -555.4700 97.8800 0.0000 0.0000; + 3050 1 0 0 0 65 3 1.0239623 -33.926777 230 28 1.1 0.9 -89.2800 -10.8400 0.0000 0.0000; + 3051 1 145.29 41.17 0 20 3 1.0059952 -35.795965 115 28 1.1 0.9 -129.8800 -5.1000 0.0000 0.0000; + 3052 1 8.08 2.29 0 0 3 1.0062201 -58.530069 115 28 1.1 0.9 31.0700 2.5300 0.0000 0.0000; + 3053 1 0 0 0 0 3 1.0300228 -27.083304 230 27 1.1 0.9 142.0400 -25.7800 0.0000 0.0000; + 3054 1 0 0 0 0 3 1.0093892 -26.590852 115 27 1.1 0.9 -339.4300 -6.1800 0.0000 0.0000; + 3055 2 0 0 0 0 3 1.0400037 -24.199083 13.8 27 1.1 0.9 143.9200 0.0000 0.0000 0.0000; + 3056 2 0 0 0 0 3 1.0400037 -21.619502 13.8 27 1.1 0.9 144.5100 0.0000 0.0000 0.0000; + 3057 2 0 0 0 0 3 1.0400037 -21.784101 13.8 27 1.1 0.9 144.4600 0.0000 0.0000 0.0000; + 3058 1 0 0 0 0 3 1.0320922 -23.902769 230 27 1.1 0.9 48.2500 -9.4600 0.0000 0.0000; + 3059 1 0 0 0 0 3 1.0124383 -17.291643 115 27 1.1 0.9 -66.1800 -9.6500 0.0000 0.0000; + 3060 2 0 0 0 0 3 1.0400037 -16.336142 18 27 1.1 0.9 49.4800 0.0000 0.0000 0.0000; + 3061 2 0 0 0 0 3 1.0400037 -18.507171 18 27 1.1 0.9 49.1700 0.0000 0.0000 0.0000; + 3062 2 0 0 0 0 3 1.0400037 -21.186464 18 27 1.1 0.9 48.8500 0.0000 0.0000 0.0000; + 3063 2 0 0 0 0 3 1.0400037 -20.03345 18 27 1.1 0.9 48.9900 0.0000 0.0000 0.0000; + 3064 1 0 0 0 0 3 1.0215851 -18.440898 115 27 1.1 0.9 -441.4000 5.3900 0.0000 0.0000; + 3065 2 0 0 0 0 3 1.0003333 -12.344168 18 27 1.1 0.9 -437.6300 0.0000 0.0000 0.0000; + 3066 1 22.03 6.24 0 0 3 1.0078407 -42.671335 115 28 1.1 0.9 -85.4000 67.1100 0.0000 0.0000; + 3067 1 0 0 0 0 3 1.0281769 -19.73257 115 27 1.1 0.9 -782.5300 55.0000 0.0000 0.0000; + 3068 2 0 0 0 0 3 1.0400037 -16.839464 20 27 1.1 0.9 -785.4300 0.0000 0.0000 0.0000; + 3069 1 3.81 1.08 0 0 3 0.9997036 -29.444608 115 27 1.1 0.9 -685.8600 165.6600 0.0000 0.0000; + 3070 1 0 0 0 0 3 1.0198813 -21.025657 115 27 1.1 0.9 -799.4800 89.3700 0.0000 0.0000; + 3071 2 0 0 0 0 3 1.0054475 -16.450545 24 27 1.1 0.9 -805.8400 691.4200 0.0000 0.0000; + 3072 1 5.98 1.7 0 0 3 1.011792 -38.528257 115 27 1.1 0.9 181.7400 -57.1200 0.0000 0.0000; + 3073 1 0 0 0 0 3 1.0040665 -54.220886 115 28 1.1 0.9 12.6200 0.6400 0.0000 0.0000; + 3074 2 0 0 0 0 3 1.000003 -51.701704 13.8 28 1.1 0.9 12.5700 0.0000 0.0000 0.0000; + 3075 1 12.18 3.45 0 0 3 1.0030425 -40.097706 115 28 1.1 0.9 -178.5200 76.9200 0.0000 0.0000; + 3076 1 10.79 3.06 0 0 3 1.0012835 -55.675889 115 28 1.1 0.9 15.6100 1.1400 0.0000 0.0000; + 3077 1 68.66 19.45 0 0 3 1.0031436 -27.925895 115 27 1.1 0.9 -880.5000 169.7900 0.0000 0.0000; + 3078 1 0 0 0 0 3 1.022309 -25.744695 230 27 1.1 0.9 4.7500 -4.1300 0.0000 0.0000; + 3079 1 0 0 0 0 3 1.0185289 -23.972232 161 27 1.1 0.9 -85.4000 -5.4900 0.0000 0.0000; + 3080 1 0 0 0 0 3 1.0083586 -21.099777 115 27 1.1 0.9 -104.3300 -69.5800 0.0000 0.0000; + 3081 2 0 0 0 0 3 1.0400037 -19.665476 20 27 1.1 0.9 5.3500 0.0000 0.0000 0.0000; + 3082 1 0 0 0 0 3 1.0209748 -27.929473 230 27 1.1 0.9 287.3000 -82.0500 0.0000 0.0000; + 3083 1 0 0 0 0 3 1.0143155 -24.125986 115 27 1.1 0.9 -1601.1300 252.4600 0.0000 0.0000; + 3084 2 0 0 0 0 3 1.0000036 -18.089098 13.8 27 1.1 0.9 301.2900 0.0000 0.0000 0.0000; + 3085 1 0 0 0 0 3 1.0070584 -18.37142 115 27 1.1 0.9 -134.6000 -121.2200 0.0000 0.0000; + 3086 2 0 0 0 0 3 1.0000036 -11.441498 13.2 27 1.1 0.9 -114.7300 0.0000 0.0000 0.0000; + 3087 2 0 0 0 0 3 1.0070584 -18.37142 13.2 27 1.1 0.9 -134.6000 -121.2200 0.0000 0.0000; + 3088 1 0 0 0 126.23 3 1.0300036 -33.117967 230 27 1.1 0.9 73.3900 0.0000 0.0000 0.0000; + 3089 1 0 0 0 0 3 1.0268531 -35.746317 161 27 1.1 0.9 58.8600 -3.3500 0.0000 0.0000; + 3090 1 0 0 0 0 3 1.0238383 -36.395897 161 27 1.1 0.9 48.7100 -3.2100 0.0000 0.0000; + 3091 1 0 0 0 65.8 3 1.0200036 -37.278793 115 27 1.1 0.9 35.0700 0.0000 0.0000 0.0000; + 3092 2 0 0 0 0 3 1.0400037 -26.329556 13.8 27 1.1 0.9 73.1100 0.0000 0.0000 0.0000; + 3093 1 5.05 1.43 0 0 3 1.0040589 -57.888866 115 28 1.1 0.9 24.5700 2.0700 0.0000 0.0000; + 3094 1 0 0 0 0 3 1.0161091 -23.162404 115 27 1.1 0.9 -1040.0500 120.6800 0.0000 0.0000; + 3095 2 0 0 0 0 3 1.0400037 -15.237821 18 27 1.1 0.9 -1053.1300 0.0000 0.0000 0.0000; + 3096 1 0 0 0 0 3 1.0246537 -21.372695 230 27 1.1 0.9 -3.0100 1.0100 0.0000 0.0000; + 3097 1 0 0 0 0 3 1.0203686 -19.532663 115 27 1.1 0.9 -3.8300 0.7500 0.0000 0.0000; + 3098 2 0 0 0 0 3 1.0400037 -12.726961 13.8 27 1.1 0.9 -3.1100 0.0000 0.0000 0.0000; + 3099 1 12.08 3.42 0 0 3 1.0008904 -28.713999 115 27 1.1 0.9 -897.0000 189.1700 0.0000 0.0000; + 3100 1 8.53 2.42 0 0 3 1.0015027 -34.804097 115 27 1.1 0.9 -421.7700 244.2600 0.0000 0.0000; + 3101 1 9.43 2.67 0 0 3 1.0063068 -47.843067 115 28 1.1 0.9 -47.3500 37.6600 0.0000 0.0000; + 3102 1 75.26 21.32 0 0 3 1.0115922 -37.425201 115 27 1.1 0.9 -710.7200 466.5100 0.0000 0.0000; + 3103 1 39.32 11.14 0 0 3 1.0100614 -20.600702 115 27 1.1 0.9 -937.1200 67.7600 0.0000 0.0000; + 3104 1 0 0 0 0 3 1.0133944 -47.433932 115 28 1.1 0.9 9.0700 35.4100 0.0000 0.0000; + 3105 2 0 0 0 0 3 1.0112245 -41.865359 13.2 28 1.1 0.9 3.4100 121.1000 0.0000 0.0000; + 3106 2 0 0 0 0 3 1.0044975 -40.836869 13.2 28 1.1 0.9 0.0000 0.0000 0.0000 0.0000; + 3107 1 14.87 4.21 0 0 3 1.0013283 -58.650118 115 28 1.1 0.9 39.2700 4.1900 0.0000 0.0000; + 3108 1 23.52 6.66 0 0 3 1.0089963 -56.700862 115 28 1.1 0.9 77.4700 10.8800 0.0000 0.0000; + 3109 1 0 0 0 0 3 1.0203797 -18.151959 115 27 1.1 0.9 -4.4000 0.5800 0.0000 0.0000; + 3110 2 0 0 0 0 3 1.0400037 -10.659421 13.8 27 1.1 0.9 -4.4200 0.0000 0.0000 0.0000; + 3111 1 0 0 0 0 3 1.0114072 -16.448913 115 27 1.1 0.9 -116.5200 -1.5900 0.0000 0.0000; + 3112 2 0 0 0 0 3 1.0000036 -8.3008 18 27 1.1 0.9 -114.6000 0.0000 0.0000 0.0000; + 3113 2 0 0 0 0 3 1.0000036 -8.29996 18 27 1.1 0.9 -115.0500 0.0000 0.0000 0.0000; + 3114 1 98.31 27.85 0 0 3 1.0156624 -34.341154 115 27 1.1 0.9 -336.6100 -55.0300 0.0000 0.0000; + 3115 1 9.58 2.71 0 0 3 1.0067461 -21.839161 115 27 1.1 0.9 -223.3300 4.2000 0.0000 0.0000; + 3116 1 0 0 0 0 3 1.0059651 -15.208162 115 27 1.1 0.9 -791.1100 2.2700 0.0000 0.0000; + 3117 2 0 0 0 0 3 1.0000036 -12.155248 13.8 27 1.1 0.9 -789.3300 0.0000 0.0000 0.0000; + 3118 2 0 0 0 0 3 1.0000036 -11.18528 13.8 27 1.1 0.9 -786.2900 0.0000 0.0000 0.0000; + 3119 1 0 0 0 0 3 1.029188 -51.756173 115 28 1.1 0.9 3.1700 2.5300 0.0000 0.0000; + 3120 2 0 0 0 0 3 1.0295699 -50.297495 13.8 28 1.1 0.9 3.0500 2.5400 0.0000 0.0000; + 3121 1 0 0 0 0 3 1.0177993 -16.382134 115 27 1.1 0.9 -1173.7200 23.2800 0.0000 0.0000; + 3122 2 0 0 0 0 3 1.0000036 -7.533117 18 27 1.1 0.9 -1158.9000 0.0000 0.0000 0.0000; + 3123 1 66.07 18.72 0 0 3 0.997916 -56.74592 115 28 1.1 0.9 12.8900 0.5100 0.0000 0.0000; + 3124 1 64.54 18.29 0 45 3 1.0295971 -59.613951 115 28 1.1 0.9 264.5300 0.0000 0.0000 0.0000; + 3125 1 91.26 25.86 0 0 3 1.0041577 -37.458057 115 27 1.1 0.9 -83.7500 90.4700 0.0000 0.0000; + 3126 1 9.96 2.82 0 40.32 3 1.0300031 -57.200074 115 28 1.1 0.9 13.0700 0.0000 0.0000 0.0000; + 3127 2 0 0 0 0 3 1.0188631 -16.424808 115 27 1.1 0.9 -1516.5400 2114.7500 0.0000 0.0000; + 3128 1 2.82 0.8 0 0 3 1.0103131 -18.007911 115 27 1.1 0.9 -176.8100 -135.1800 0.0000 0.0000; + 3129 2 0 0 0 0 3 1.027401 -16.881264 115 27 1.1 0.9 -1142.7500 1404.6500 0.0000 0.0000; + 3130 1 92.15 26.11 0 0 3 1.009018 -19.09004 115 27 1.1 0.9 -65.6600 -14.8500 0.0000 0.0000; + 3131 2 0 0 0 0 3 1.0200036 -22.040636 115 27 1.1 0.9 -869.8900 106.7700 0.0000 0.0000; + 3132 1 9.56 2.71 0 0 3 0.9984354 -40.096984 115 28 1.1 0.9 -254.2100 115.3700 0.0000 0.0000; + 3133 2 0 0 0 0 3 1.0209991 -22.013917 230 27 1.1 0.9 -7.2300 1.2400 0.0000 0.0000; + 3134 1 0 0 0 0 3 1.0200994 -22.787086 161 27 1.1 0.9 -125.2300 22.5000 0.0000 0.0000; + 3135 1 0 0 0 0 3 1.0103196 -19.243816 161 27 1.1 0.9 -448.6500 72.0600 0.0000 0.0000; + 3136 1 46.96 13.3 0 0 3 1.0030814 -15.564022 115 27 1.1 0.9 -788.8300 7.1500 0.0000 0.0000; + 3137 2 0 0 0 0 3 1.0201134 -23.501811 115 27 1.1 0.9 -1284.2100 203.5500 0.0000 0.0000; + 3138 1 10.95 3.1 0 0 3 1.0187513 -38.894081 115 28 1.1 0.9 -106.1500 38.1700 0.0000 0.0000; + 3139 1 14.92 4.23 0 0 3 0.9936561 -29.514288 115 27 1.1 0.9 -74.9500 -26.8800 0.0000 0.0000; + 3140 1 0.22 0.06 0 0 3 0.9969644 -29.934823 115 27 1.1 0.9 -617.2300 144.2800 0.0000 0.0000; + 3141 2 0 0 0 0 3 1.0197368 -17.756149 115 27 1.1 0.9 -636.9800 8.4400 0.0000 0.0000; + 3142 1 7.07 2 0 30 3 1.0267909 -40.07254 115 27 1.1 0.9 19.6300 38.1400 0.0000 0.0000; + 3143 1 5.75 1.63 0 17 3 1.0061812 -38.636912 115 28 1.1 0.9 -343.9400 152.3500 0.0000 0.0000; + 3144 1 5.56 1.57 0 0 3 1.0008154 -39.550265 115 28 1.1 0.9 -297.5100 134.7100 0.0000 0.0000; + 3145 1 2.94 0.83 0 0 3 1.009482 -23.653599 115 27 1.1 0.9 -1010.1900 147.3500 0.0000 0.0000; + 3146 1 12.04 3.41 0 15 3 1.0263909 -35.48043 115 28 1.1 0.9 -188.3700 41.0900 0.0000 0.0000; + 3147 1 34.76 9.85 0 33.86 3 1.0300034 -55.806237 115 28 1.1 0.9 58.0600 0.0000 0.0000 0.0000; + 4002 1 1.01 0.29 0 0 4 1.0201246 -52.824441 115 20 1.1 0.9 7.0800 1.8700 0.0000 0.0000; + 4003 1 127.29 36.07 0 0 4 1.0055761 -71.993902 115 19 1.1 0.9 1762.8800 217.8100 0.0000 0.0000; + 4004 1 0 0 0 0 4 1.0239652 -55.865093 230 20 1.1 0.9 16.1100 11.0500 0.0000 0.0000; + 4005 1 164.14 46.51 0 70 4 1.0221997 -60.027932 115 20 1.1 0.9 14.7100 8.7900 0.0000 0.0000; + 4006 1 2.75 0.78 0 0 4 1.0280051 -55.394212 115 20 1.1 0.9 162.1200 58.7400 0.0000 0.0000; + 4007 1 183.66 52.04 0 0 4 1.0090042 -72.59152 115 19 1.1 0.9 2018.7200 13.7300 0.0000 0.0000; + 4008 1 32.49 9.21 0 0 4 0.996096 -54.697551 115 20 1.1 0.9 54.3800 14.7200 0.0000 0.0000; + 4009 1 0 0 0 0 4 1.0253681 -46.442948 115 21 1.1 0.9 1.4800 39.1000 0.0000 0.0000; + 4010 2 0 0 0 0 4 1.0300032 -43.602345 20 21 1.1 0.9 -2006.0700 0.0000 0.0000 0.0000; + 4011 1 16.05 4.55 0 0 4 1.0203187 -57.344565 115 19 1.1 0.9 334.7600 106.7900 0.0000 0.0000; + 4012 1 13.74 3.89 0 50 4 1.0212456 -68.912893 115 19 1.1 0.9 1693.7100 -38.9200 0.0000 0.0000; + 4013 1 92.35 26.17 0 0 4 1.0099492 -71.112944 115 19 1.1 0.9 2095.8100 54.0200 0.0000 0.0000; + 4014 1 0 0 0 0 4 1.0260846 -52.827203 230 20 1.1 0.9 -8.0700 6.7400 0.0000 0.0000; + 4015 1 159.81 45.28 0 67.88 4 1.0300032 -54.297186 115 20 1.1 0.9 -7.2700 0.0000 0.0000 0.0000; + 4016 1 6.25 1.77 0 0 4 1.0101817 -50.062792 115 20 1.1 0.9 45.8400 10.9900 0.0000 0.0000; + 4017 1 89.56 25.38 0 0 4 1.0097723 -48.318836 115 21 1.1 0.9 619.0600 69.7200 0.0000 0.0000; + 4018 1 7.14 2.02 0 0 4 1.0024055 -47.146006 115 21 1.1 0.9 407.1900 76.7900 0.0000 0.0000; + 4019 1 135.83 38.48 0 0 4 0.9901916 -67.149546 115 19 1.1 0.9 1374.8500 -10.9900 0.0000 0.0000; + 4020 1 117.81 33.38 0 0 4 0.9846321 -50.182554 115 21 1.1 0.9 1284.6400 89.1800 0.0000 0.0000; + 4021 1 31.97 9.06 0 0 4 0.9976659 -66.441457 115 19 1.1 0.9 2704.5100 -34.9900 0.0000 0.0000; + 4022 1 5.56 1.58 0 0 4 1.0105752 -59.503489 115 20 1.1 0.9 11.3200 6.9400 0.0000 0.0000; + 4023 1 5.06 1.43 0 0 4 1.0104086 -52.177927 115 20 1.1 0.9 53.5900 14.5700 0.0000 0.0000; + 4024 1 0 0 0 0 4 1.0212305 -42.175459 230 20 1.1 0.9 21.3500 -0.1500 0.0000 0.0000; + 4025 1 0 0 0 0 4 1.0189448 -46.047524 115 20 1.1 0.9 32.3400 5.8100 0.0000 0.0000; + 4026 2 0 0 0 0 4 1.030003 -34.758475 13.8 20 1.1 0.9 21.2900 0.0000 0.0000 0.0000; + 4027 1 65.12 18.45 0 0 4 1.0217313 -72.61364 115 19 1.1 0.9 1966.6300 0.7000 0.0000 0.0000; + 4028 1 0 0 0 0 4 1.0154938 -33.732969 230 21 1.1 0.9 60.4100 1.7800 0.0000 0.0000; + 4029 1 0 0 0 0 4 1.0156665 -35.698044 115 21 1.1 0.9 65.5700 4.7400 0.0000 0.0000; + 4030 2 0 0 0 0 4 1.0100027 -30.339803 13.8 21 1.1 0.9 18.9700 0.0000 0.0000 0.0000; + 4031 1 2.75 0.78 0 0 4 1.0231404 -57.593552 115 20 1.1 0.9 904.1300 143.3300 0.0000 0.0000; + 4032 1 91.39 25.89 0 0 4 0.9869365 -54.922467 115 21 1.1 0.9 1794.3600 414.6300 0.0000 0.0000; + 4033 1 126.25 35.77 0 0 4 1.0086369 -58.635731 115 20 1.1 0.9 993.0500 145.1400 0.0000 0.0000; + 4034 1 37.64 10.66 0 0 4 1.0079148 -71.086312 115 19 1.1 0.9 1789.1600 35.5400 0.0000 0.0000; + 4035 1 79.16 22.43 0 0 4 0.9865021 -48.631564 115 21 1.1 0.9 822.9200 148.3900 0.0000 0.0000; + 4036 1 35.07 9.94 0 0 4 1.0011393 -55.374249 115 20 1.1 0.9 1.8400 1.8800 0.0000 0.0000; + 4037 1 28.72 8.14 0 65 4 1.0113138 -49.050917 115 21 1.1 0.9 536.2800 65.8800 0.0000 0.0000; + 4038 1 83.3 23.6 0 0 4 0.9957176 -48.420159 115 21 1.1 0.9 670.7500 32.4900 0.0000 0.0000; + 4039 1 0 0 0 0 4 1.0191654 -60.939941 230 19 1.1 0.9 97.0400 126.3500 0.0000 0.0000; + 4040 1 225.66 63.94 0 379.68 4 1.0300032 -64.510329 115 19 1.1 0.9 726.5500 0.0000 0.0000 0.0000; + 4041 1 0 0 0 0 4 1.012531 -65.439055 230 19 1.1 0.9 107.3400 286.2600 0.0000 0.0000; + 4042 1 215.18 60.97 0 0 4 1.0190781 -70.586832 115 19 1.1 0.9 189.8400 449.7700 0.0000 0.0000; + 4043 1 2.47 0.7 0 0 4 1.0145059 -57.753163 115 19 1.1 0.9 796.8800 79.8600 0.0000 0.0000; + 4044 1 0 0 0 0 4 1.0157358 -56.471252 115 19 1.1 0.9 5.2900 32.7100 0.0000 0.0000; + 4045 2 0 0 0 0 4 1.0200031 -48.109683 13.8 19 1.1 0.9 1.2600 0.0000 0.0000 0.0000; + 4046 2 0 0 0 0 4 1.0200031 -52.601456 13.8 19 1.1 0.9 2.3000 0.0000 0.0000 0.0000; + 4047 2 0 0 0 0 4 1.0200031 -55.089813 13.8 19 1.1 0.9 0.0100 0.0000 0.0000 0.0000; + 4048 1 13.1 3.71 0 0 4 1.0079987 -65.982704 115 19 1.1 0.9 1138.3500 32.3900 0.0000 0.0000; + 4049 1 0 0 0 0 4 1.0076134 -60.202873 115 19 1.1 0.9 1197.3900 -68.1300 0.0000 0.0000; + 4050 2 0 0 0 0 4 1.0000032 -56.781006 13.8 19 1.1 0.9 -802.9600 0.0000 0.0000 0.0000; + 4051 1 89.39 25.33 0 0 4 0.9875562 -54.347062 115 21 1.1 0.9 1009.9400 48.5500 0.0000 0.0000; + 4052 2 0 0 0 0 4 1.0237877 -50.178894 18 21 1.1 0.9 999.3100 44.1000 0.0000 0.0000; + 4053 1 0.11 0.03 0 0 4 1.0159207 -50.354306 115 19 1.1 0.9 -94.0000 18.0600 0.0000 0.0000; + 4054 1 5.6 1.59 0 0 4 1.003428 -48.852286 115 21 1.1 0.9 599.8700 52.4400 0.0000 0.0000; + 4055 1 17.78 5.04 0 0 4 0.9895083 -47.472649 115 21 1.1 0.9 403.8000 157.8200 0.0000 0.0000; + 4056 1 0 0 0 0 4 1.020351 -38.889493 230 21 1.1 0.9 18.4200 8.9400 0.0000 0.0000; + 4057 1 0 0 0 0 4 1.0019285 -44.35785 115 21 1.1 0.9 384.0400 144.2500 0.0000 0.0000; + 4058 2 0 0 0 0 4 1.0300032 -35.733329 13.8 21 1.1 0.9 17.4600 0.0000 0.0000 0.0000; + 4059 2 0 0 0 0 4 1.0300032 -36.646435 13.8 21 1.1 0.9 17.4000 0.0000 0.0000 0.0000; + 4060 2 0 0 0 0 4 1.0300032 -33.188677 13.8 21 1.1 0.9 17.5200 0.0000 0.0000 0.0000; + 4061 2 0 0 0 0 4 1.0300032 -34.237936 13.8 21 1.1 0.9 17.7400 0.0000 0.0000 0.0000; + 4062 2 0 0 0 0 4 1.0300032 -32.173664 13.8 21 1.1 0.9 18.2200 0.0000 0.0000 0.0000; + 4063 2 0 0 0 0 4 1.0300032 -34.921937 13.8 21 1.1 0.9 17.7000 0.0000 0.0000 0.0000; + 4064 1 8.82 2.5 0 0 4 0.9944281 -47.849079 115 21 1.1 0.9 582.7600 117.9600 0.0000 0.0000; + 4065 2 0 0 0 0 4 1.0200031 -42.842628 18 21 1.1 0.9 561.9800 0.0000 0.0000 0.0000; + 4066 1 191.53 54.27 0 145.13 4 1.0212963 -73.153171 115 19 1.1 0.9 1978.6100 308.8300 0.0000 0.0000; + 4067 1 159.46 45.18 0 0 4 0.9918237 -64.286846 115 19 1.1 0.9 1281.0000 -28.9100 0.0000 0.0000; + 4068 1 27.99 7.93 0 0 4 1.0104652 -72.56388 115 19 1.1 0.9 1659.0500 184.1200 0.0000 0.0000; + 4069 1 4.24 1.2 0 0 4 0.9951713 -47.714044 115 21 1.1 0.9 368.8200 106.6200 0.0000 0.0000; + 4070 1 0 0 0 0 4 1.0137137 -51.196412 230 19 1.1 0.9 42.8600 17.2500 0.0000 0.0000; + 4071 1 281.45 79.75 0 0 4 0.996438 -55.671297 115 19 1.1 0.9 183.4200 63.6000 0.0000 0.0000; + 4072 1 51.71 14.65 0 0 4 0.9960976 -47.405269 115 21 1.1 0.9 54.3400 13.6100 0.0000 0.0000; + 4073 1 0 0 0 0 4 1.0188507 -61.129521 230 19 1.1 0.9 48.5000 139.1900 0.0000 0.0000; + 4074 1 0 0 0 0 4 1.0274918 -63.647615 115 19 1.1 0.9 875.8400 -43.9200 0.0000 0.0000; + 4075 2 0 0 0 0 4 1.0188507 -61.129521 24 19 1.1 0.9 48.5000 139.1900 0.0000 0.0000; + 4076 2 0 0 0 0 4 1.0300032 -55.384473 24 19 1.1 0.9 30.7200 0.0000 0.0000 0.0000; + 4077 2 0 0 0 0 4 1.0300032 -57.527564 24 19 1.1 0.9 29.5100 0.0000 0.0000 0.0000; + 4078 1 84.07 23.82 0 0 4 0.98683 -47.923684 115 21 1.1 0.9 247.7800 98.7800 0.0000 0.0000; + 4079 1 171.21 48.51 0 0 4 1.0172412 -67.518738 115 19 1.1 0.9 619.1700 3.6400 0.0000 0.0000; + 4080 1 0 0 0 0 4 1.0295117 -44.001911 230 21 1.1 0.9 18.5700 0.9600 0.0000 0.0000; + 4081 1 0 0 0 0 4 1.0148455 -47.454833 115 21 1.1 0.9 636.5200 81.6000 0.0000 0.0000; + 4082 2 0 0 0 0 4 1.0400032 -37.443315 13.8 21 1.1 0.9 18.4600 0.0000 0.0000 0.0000; + 4083 2 0 0 0 0 4 1.0400032 -37.962294 13.8 21 1.1 0.9 18.3800 0.0000 0.0000 0.0000; + 4084 2 0 0 0 0 4 1.0400032 -40.713071 13.8 21 1.1 0.9 18.4800 0.0000 0.0000 0.0000; + 4085 2 0 0 0 0 4 1.0400032 -42.058645 13.8 21 1.1 0.9 18.7600 0.0000 0.0000 0.0000; + 4086 1 19.87 5.63 0 102.93 4 1.0250677 -60.899824 115 19 1.1 0.9 1083.2500 0.0000 0.0000 0.0000; + 4087 1 2.08 0.59 0 120 4 1.0164653 -48.993802 115 21 1.1 0.9 362.1800 16.1900 0.0000 0.0000; + 4088 1 212.52 60.21 0 282.76 4 1.0300032 -72.29687 115 19 1.1 0.9 1940.0500 0.0000 0.0000 0.0000; + 4089 1 8.6 2.44 0 0 4 1.0052288 -64.23767 115 19 1.1 0.9 1953.4300 -76.1500 0.0000 0.0000; + 4090 2 0 0 0 0 4 1.0052288 -64.23767 13.8 19 1.1 0.9 1953.4300 -76.1500 0.0000 0.0000; + 4091 2 0 0 0 0 4 1.0100032 -61.592776 13.8 19 1.1 0.9 1954.7500 0.0000 0.0000 0.0000; + 4092 2 0 0 0 0 4 1.0052288 -64.23767 13.8 19 1.1 0.9 1953.4300 -76.1500 0.0000 0.0000; + 4093 2 0 0 0 0 4 1.0100032 -60.416578 13.8 19 1.1 0.9 1947.8800 0.0000 0.0000 0.0000; + 4094 2 0 0 0 0 4 1.0100032 -62.79195 13.8 19 1.1 0.9 1954.7500 0.0000 0.0000 0.0000; + 4095 2 0 0 0 0 4 1.0100032 -61.304479 13.8 19 1.1 0.9 1952.2400 0.0000 0.0000 0.0000; + 4096 2 0 0 0 0 4 1.0052288 -64.23767 13.8 19 1.1 0.9 1953.4300 -76.1500 0.0000 0.0000; + 4097 2 0 0 0 0 4 1.0100032 -60.912578 13.8 19 1.1 0.9 1951.2900 0.0000 0.0000 0.0000; + 4098 2 0 0 0 0 4 1.0052288 -64.23767 13.8 19 1.1 0.9 1953.4300 -76.1500 0.0000 0.0000; + 4099 1 15.17 4.3 0 0 4 0.9944009 -49.849068 115 21 1.1 0.9 599.8200 72.0100 0.0000 0.0000; + 4100 1 50.6 14.34 0 0 4 0.9938044 -47.303372 115 21 1.1 0.9 -107.4900 -8.5200 0.0000 0.0000; + 4101 1 128.14 36.31 0 0 4 1.0065813 -58.493042 115 20 1.1 0.9 988.9400 140.1200 0.0000 0.0000; + 4102 1 24.17 6.85 0 0 4 1.0056631 -58.480352 115 19 1.1 0.9 -68.1700 82.4000 0.0000 0.0000; + 4103 1 189.88 53.8 0 120 4 1.0146255 -73.625651 115 19 1.1 0.9 2048.2200 194.1600 0.0000 0.0000; + 4104 1 0 0 0 0 4 0.998728 -46.382596 115 21 1.1 0.9 518.2700 154.7000 0.0000 0.0000; + 4105 2 0 0 0 0 4 1.0100031 -43.005428 18 21 1.1 0.9 -1505.1700 0.0000 0.0000 0.0000; + 4106 1 37.55 10.64 0 0 4 0.9988978 -57.812391 115 19 1.1 0.9 457.5900 65.3500 0.0000 0.0000; + 4107 1 118.36 33.54 0 0 4 1.0166498 -72.082564 115 19 1.1 0.9 2005.9600 336.4300 0.0000 0.0000; + 4108 1 28.34 8.03 0 0 4 0.9990433 -44.916841 115 21 1.1 0.9 396.6100 144.2800 0.0000 0.0000; + 4109 1 110.86 31.41 0 0 4 0.9836103 -49.639064 115 21 1.1 0.9 1838.4200 609.7300 0.0000 0.0000; + 4110 1 57.35 16.25 0 0 4 1.0074874 -62.684567 115 19 1.1 0.9 1287.6400 -116.4800 0.0000 0.0000; + 4111 1 104.08 29.49 0 0 4 0.9895912 -66.847222 115 19 1.1 0.9 2167.2900 -34.1200 0.0000 0.0000; + 4112 1 5.59 1.58 0 0 4 1.0202471 -54.338401 115 21 1.1 0.9 459.8300 80.3200 0.0000 0.0000; + 4113 1 0 0 0 0 4 1.0262252 -55.357624 230 20 1.1 0.9 30.0200 13.2000 0.0000 0.0000; + 4114 1 0 0 0 0 4 1.0172849 -57.524211 115 20 1.1 0.9 10.6200 7.3200 0.0000 0.0000; + 4115 2 0 0 0 0 4 1.0400032 -51.556381 13.8 20 1.1 0.9 29.4600 0.0000 0.0000 0.0000; + 4116 2 0 0 0 0 4 1.0400032 -51.599297 13.8 20 1.1 0.9 29.3200 0.0000 0.0000 0.0000; + 4117 1 18.89 5.35 0 0 4 1.015549 -47.775485 115 20 1.1 0.9 37.9600 7.4000 0.0000 0.0000; + 4118 1 13.88 3.93 0 0 4 0.9871672 -56.073413 115 21 1.1 0.9 714.8300 -10.6800 0.0000 0.0000; + 4119 1 55.57 15.75 0 0 4 1.0116104 -57.719682 115 19 1.1 0.9 769.8100 49.6400 0.0000 0.0000; + 4120 1 46.52 13.18 0 0 4 0.9903374 -47.615651 115 21 1.1 0.9 -5.3000 18.4700 0.0000 0.0000; + 4121 1 4.11 1.16 0 50 4 1.0160068 -68.312399 115 19 1.1 0.9 1508.7700 -53.4500 0.0000 0.0000; + 4122 1 146.11 41.4 0 150 4 1.0163884 -71.319742 115 19 1.1 0.9 2157.7900 -3.7500 0.0000 0.0000; + 4123 1 90.5 25.64 0 0 4 0.9903032 -49.752811 115 21 1.1 0.9 875.0600 108.2000 0.0000 0.0000; + 4124 1 24.38 6.91 0 0 4 1.0039254 -62.118488 115 19 1.1 0.9 860.1200 242.4200 0.0000 0.0000; + 4125 1 4.5 1.28 0 0 4 0.9964445 -46.004864 115 21 1.1 0.9 792.4400 21.1700 0.0000 0.0000; + 4126 1 127.38 36.09 0 0 4 1.0053079 -56.091787 115 19 1.1 0.9 -36.1300 46.4300 0.0000 0.0000; + 4127 1 87.29 24.73 0 70 4 1.0034791 -57.810311 115 21 1.1 0.9 2513.7900 -1142.8400 0.0000 0.0000; + 4128 1 123.51 35 0 70 4 1.0071846 -69.101982 115 19 1.1 0.9 1292.2500 280.7200 0.0000 0.0000; + 4129 1 18.51 5.25 0 0 4 1.0326025 -55.994434 115 20 1.1 0.9 789.9900 175.8900 0.0000 0.0000; + 4130 1 9.48 2.69 0 23.99 4 1.0300031 -57.470476 115 20 1.1 0.9 796.6700 0.0000 0.0000 0.0000; + 4131 1 0 0 0 71.45 4 1.0300031 -50.351745 230 20 1.1 0.9 -0.6400 0.0000 0.0000 0.0000; + 4132 1 33.09 9.38 0 0 4 1.02802 -51.273759 115 20 1.1 0.9 -0.0200 0.4100 0.0000 0.0000; + 4133 2 0 0 0 0 4 1.0300031 -50.351745 20 20 1.1 0.9 -0.6400 0.0000 0.0000 0.0000; + 4134 2 0 0 0 0 4 1.0247289 -49.530541 20 20 1.1 0.9 -0.6300 -0.0000 0.0000 0.0000; + 4135 2 0 0 0 0 4 1.0251205 -49.568797 20 20 1.1 0.9 -0.6300 -0.0000 0.0000 0.0000; + 4136 2 0 0 0 0 4 1.0234422 -49.323519 20 20 1.1 0.9 -0.6300 -0.0000 0.0000 0.0000; + 4137 2 0 0 0 0 4 1.0300031 -50.351745 20 20 1.1 0.9 -0.6400 0.0000 0.0000 0.0000; + 4138 2 0 0 0 0 4 1.0300031 -50.351745 20 20 1.1 0.9 -0.6400 0.0000 0.0000 0.0000; + 4139 1 10.62 3.01 0 0 4 0.9867455 -54.47332 115 21 1.1 0.9 684.0000 -51.6400 0.0000 0.0000; + 4140 1 0 0 0 0 4 1.0326265 -48.454186 230 21 1.1 0.9 146.8000 18.4500 0.0000 0.0000; + 4141 1 0 0 0 86.25 4 1.0300032 -51.629569 115 21 1.1 0.9 339.3600 0.0000 0.0000 0.0000; + 4142 2 0 0 0 0 4 1.0400032 -46.363552 13.8 21 1.1 0.9 145.2600 18.0700 0.0000 0.0000; + 4143 1 14.36 4.07 0 0 4 1.011373 -53.856034 115 20 1.1 0.9 1.5600 1.5000 0.0000 0.0000; + 4144 1 16.36 4.63 0 0 4 0.988789 -55.771305 115 21 1.1 0.9 1656.1100 -448.5900 0.0000 0.0000; + 4145 1 49.86 14.13 0 0 4 0.9936232 -46.419774 115 21 1.1 0.9 420.1600 158.5200 0.0000 0.0000; + 4146 1 0 0 0 0 4 1.0272604 -55.544113 230 20 1.1 0.9 66.2800 36.4900 0.0000 0.0000; + 4147 1 193.64 54.87 0 100 4 1.0267965 -57.365027 115 20 1.1 0.9 961.9800 0.0000 0.0000 0.0000; + 4148 1 14.64 4.15 0 0 4 0.9956005 -57.623343 115 20 1.1 0.9 758.8000 52.7100 0.0000 0.0000; + 4149 1 61.36 17.38 0 0 4 0.9960202 -44.8084 115 21 1.1 0.9 264.3700 76.3600 0.0000 0.0000; + 4150 1 12.53 3.55 0 0 4 0.9900746 -48.290371 115 21 1.1 0.9 1510.4100 112.1500 0.0000 0.0000; + 4151 1 0 0 0 0 4 1.027008 -49.667792 230 21 1.1 0.9 81.2200 46.2100 0.0000 0.0000; + 4152 1 0 0 0 0 4 1.0218341 -48.239991 115 21 1.1 0.9 -36.7800 40.5600 0.0000 0.0000; + 4153 2 0 0 0 0 4 1.0370931 -47.845108 18 21 1.1 0.9 78.0700 45.4300 0.0000 0.0000; + 4154 1 26.32 7.46 0 0 4 1.005071 -67.383787 115 19 1.1 0.9 1279.4900 46.3700 0.0000 0.0000; + 4155 1 19.45 5.51 0 0 4 1.0099639 -65.315726 115 19 1.1 0.9 1079.3500 23.6600 0.0000 0.0000; + 4156 1 108.01 30.6 0 0 4 0.9931379 -49.239087 115 21 1.1 0.9 106.2600 -27.1500 0.0000 0.0000; + 4157 1 104.67 29.66 0 0 4 1.0137407 -69.785245 115 19 1.1 0.9 2262.6000 -31.9100 0.0000 0.0000; + 4158 1 0 0 0 0 4 1.0149143 -41.884549 230 21 1.1 0.9 18.8500 5.6500 0.0000 0.0000; + 4159 1 36.18 10.25 0 0 4 1.0001984 -46.0916 115 21 1.1 0.9 -39.2500 -2.8600 0.0000 0.0000; + 4160 2 0 0 0 0 4 1.0300032 -39.285445 13.8 21 1.1 0.9 18.6100 0.0000 0.0000 0.0000; + 4161 2 0 0 0 0 4 1.0300032 -39.042913 13.8 21 1.1 0.9 17.7200 0.0000 0.0000 0.0000; + 4162 2 0 0 0 0 4 1.0300032 -38.294242 13.8 21 1.1 0.9 17.7700 0.0000 0.0000 0.0000; + 4163 2 0 0 0 0 4 1.0149143 -41.884549 13.8 21 1.1 0.9 18.8500 5.6500 0.0000 0.0000; + 4164 1 2.03 0.57 0 0 4 1.0094579 -64.302434 115 19 1.1 0.9 1036.9800 33.4000 0.0000 0.0000; + 4165 1 0 0 0 0 4 1.024907 -46.233907 115 21 1.1 0.9 19.2500 1.8000 0.0000 0.0000; + 4166 2 0 0 0 0 4 1.0110274 -42.376769 13.8 21 1.1 0.9 -1984.3400 4412.7700 0.0000 0.0000; + 4167 1 5.31 1.5 0 0 4 0.9991489 -67.485598 115 19 1.1 0.9 2481.3700 -36.2600 0.0000 0.0000; + 4168 1 8.87 2.51 0 0 4 0.9987165 -46.401559 115 21 1.1 0.9 -44.0100 -2.6400 0.0000 0.0000; + 4169 1 27.68 7.84 0 0 4 0.9900028 -51.908732 115 21 1.1 0.9 637.6600 28.2200 0.0000 0.0000; + 4170 1 35.86 10.16 0 0 4 0.9898578 -46.659535 115 21 1.1 0.9 446.3300 137.8000 0.0000 0.0000; + 4171 1 167.63 47.5 0 100 4 1.0121991 -62.067607 115 19 1.1 0.9 1593.0500 -350.7700 0.0000 0.0000; + 4172 1 42.31 11.99 0 0 4 1.0100606 -50.626945 115 20 1.1 0.9 49.7900 6.5700 0.0000 0.0000; + 4173 1 12.05 3.42 0 0 4 1.00053 -40.401416 115 21 1.1 0.9 193.6900 58.9800 0.0000 0.0000; + 4174 1 19.16 5.43 0 85 4 1.0204937 -57.365461 115 20 1.1 0.9 96.3000 16.5900 0.0000 0.0000; + 4175 1 3.16 0.89 0 21.78 4 1.0300031 -55.920939 115 20 1.1 0.9 -120.8900 0.0000 0.0000 0.0000; + 4176 1 0 0 0 0 4 1.0390062 -52.484025 115 20 1.1 0.9 -1232.0500 19.6000 0.0000 0.0000; + 4177 2 0 0 0 0 4 1.0400032 -49.119304 13.8 20 1.1 0.9 -1227.2700 0.0000 0.0000 0.0000; + 4178 1 17.46 4.95 0 44.77 4 1.0248678 -46.567754 115 21 1.1 0.9 634.4700 0.0000 0.0000 0.0000; + 4179 1 19.92 5.64 0 0 4 1.015857 -58.106236 115 20 1.1 0.9 794.6100 127.7500 0.0000 0.0000; + 4180 1 10.76 3.05 0 0 4 0.9877546 -47.711955 115 21 1.1 0.9 490.5000 125.9600 0.0000 0.0000; + 4181 2 0 0 0 0 4 1.0233176 -39.095329 230 21 1.1 0.9 34.6400 12.7000 0.0000 0.0000; + 4182 1 22.68 6.43 0 0 4 1.0045507 -43.15253 115 21 1.1 0.9 176.5600 64.6600 0.0000 0.0000; + 4183 2 0 0 0 0 4 1.0190549 -49.568639 230 19 1.1 0.9 -15.5700 18.0100 0.0000 0.0000; + 4184 1 0 0 0 0 4 1.0067657 -57.284224 115 19 1.1 0.9 -319.7800 -39.0300 0.0000 0.0000; + 4185 1 37.84 10.72 0 20.63 4 1.0205876 -58.458507 115 19 1.1 0.9 497.8800 147.3000 0.0000 0.0000; + 4186 1 37.06 10.5 0 53.8 4 1.0029866 -68.836691 115 19 1.1 0.9 2147.1800 1.2300 0.0000 0.0000; + 4187 1 15.06 4.27 0 0 4 1.0011474 -58.682311 115 20 1.1 0.9 8.0700 5.2000 0.0000 0.0000; + 4188 1 2.97 0.84 0 0 4 1.0304114 -52.985417 115 20 1.1 0.9 -1.2100 3.3600 0.0000 0.0000; + 4189 1 29.89 8.47 0 0 4 0.9976437 -56.620352 115 20 1.1 0.9 3.9100 2.8600 0.0000 0.0000; + 4190 1 132.46 37.53 0 0 4 1.0115516 -58.27465 115 20 1.1 0.9 1.0500 6.4300 0.0000 0.0000; + 4191 1 46.43 13.16 0 0 4 1.0038487 -55.450924 115 19 1.1 0.9 -238.0100 -22.5400 0.0000 0.0000; + 4192 2 0 0 0 0 4 1.0200033 -50.348044 230 19 1.1 0.9 18.2000 0.0000 0.0000 0.0000; + 4193 1 178.22 50.5 0 0 4 1.013129 -53.089525 115 19 1.1 0.9 -5.2600 15.5100 0.0000 0.0000; + 4194 2 0 0 0 0 4 1.0030258 -61.15424 115 19 1.1 0.9 1247.2100 -52.9200 0.0000 0.0000; + 4195 2 0 0 0 0 4 1.0352325 -51.155131 500 20 1.1 0.9 65.1600 26.0600 0.0000 0.0000; + 4196 1 0 0 0 0 4 1.0333344 -52.636732 230 20 1.1 0.9 70.7000 29.7900 0.0000 0.0000; + 4197 1 0 0 0 4.12 4 1.0300031 -54.613901 115 20 1.1 0.9 96.8200 177.1000 0.0000 0.0000; + 5003 1 113.64 32.2 0 0 5 0.9907152 -70.466945 161 16 1.1 0.9 549.6000 24.8300 0.0000 0.0000; + 5004 1 11.69 3.31 0 0 5 0.99013 -63.237887 161 14 1.1 0.9 101.6700 13.3300 0.0000 0.0000; + 5005 1 8.95 2.53 0 0 5 1.0151133 -54.86159 161 18 1.1 0.9 40.4400 1.7500 0.0000 0.0000; + 5006 1 100.19 28.39 0 0 5 0.9963108 -70.005118 161 16 1.1 0.9 295.7800 38.8300 0.0000 0.0000; + 5007 1 72.05 20.42 0 0 5 0.9963546 -65.720705 161 17 1.1 0.9 361.2200 5.0300 0.0000 0.0000; + 5008 1 7.6 2.15 0 0 5 1.0134722 -43.323687 161 15 1.1 0.9 -1.9200 14.4400 0.0000 0.0000; + 5009 1 62.68 17.76 0 0 5 0.9984786 -71.254056 161 16 1.1 0.9 418.2300 27.9000 0.0000 0.0000; + 5010 1 133.87 37.93 0 0 5 0.9976655 -69.22568 161 16 1.1 0.9 306.2600 41.4200 0.0000 0.0000; + 5011 1 7.64 2.17 0 0 5 1.0062648 -55.110655 161 13 1.1 0.9 57.8600 10.6700 0.0000 0.0000; + 5012 1 81.32 23.04 0 0 5 0.9942004 -66.198953 161 17 1.1 0.9 412.0100 -6.4500 0.0000 0.0000; + 5013 1 19.34 5.48 0 44.89 5 1.0300036 -51.225976 161 15 1.1 0.9 33.1500 0.0000 0.0000 0.0000; + 5014 1 46.76 13.25 0 0 5 0.9996384 -62.444149 161 17 1.1 0.9 214.3300 22.5000 0.0000 0.0000; + 5015 1 0 0 0 0 5 1.0045957 -61.189358 500 17 1.1 0.9 105.2500 12.9300 0.0000 0.0000; + 5016 1 181.16 51.33 0 0 5 1.003355 -65.800269 161 17 1.1 0.9 161.8100 19.8900 0.0000 0.0000; + 5017 1 13.85 3.93 0 0 5 0.9945081 -67.06733 161 17 1.1 0.9 635.5100 -69.0700 0.0000 0.0000; + 5018 1 0 0 0 0 5 1.0057415 -48.359052 500 12 1.1 0.9 27.6800 -1.4500 0.0000 0.0000; + 5019 1 0 0 0 0 5 1.0037418 -50.108858 161 12 1.1 0.9 32.1800 0.8000 0.0000 0.0000; + 5020 2 0 0 0 0 5 1.0000036 -46.650434 13.8 12 1.1 0.9 27.7300 0.0000 0.0000 0.0000; + 5021 1 0 0 0 0 5 1.0017908 -59.088185 500 17 1.1 0.9 78.0400 6.5700 0.0000 0.0000; + 5022 1 140.24 39.73 0 0 5 0.9994071 -62.801442 161 17 1.1 0.9 123.6300 8.5000 0.0000 0.0000; + 5023 2 0 0 0 0 5 1.0017908 -59.088185 13.8 17 1.1 0.9 78.0400 6.5700 0.0000 0.0000; + 5024 1 50.92 14.43 0 0 5 1.0052865 -55.53405 161 13 1.1 0.9 37.2600 1.5600 0.0000 0.0000; + 5025 1 74.46 21.1 0 0 5 0.9960384 -62.131783 161 18 1.1 0.9 2256.0100 -249.2300 0.0000 0.0000; + 5026 1 71.11 20.15 0 0 5 0.991411 -67.295628 161 17 1.1 0.9 188.3000 10.6000 0.0000 0.0000; + 5027 1 74.13 21 0 0 5 0.9948773 -68.15382 161 17 1.1 0.9 439.0100 -41.5300 0.0000 0.0000; + 5028 1 9.35 2.65 0 0 5 1.0003104 -68.258861 161 17 1.1 0.9 224.1200 28.8800 0.0000 0.0000; + 5029 1 12.77 3.62 0 0 5 1.0036083 -54.45904 161 13 1.1 0.9 42.5600 3.4200 0.0000 0.0000; + 5030 1 79.61 22.55 0 0 5 0.9924906 -65.894965 161 12 1.1 0.9 135.7800 -1.7700 0.0000 0.0000; + 5031 1 42.36 12 0 0 5 1.0038071 -66.341044 161 16 1.1 0.9 179.9100 29.2700 0.0000 0.0000; + 5032 1 47.16 13.36 0 0 5 0.9941745 -69.401575 161 16 1.1 0.9 401.1400 40.6100 0.0000 0.0000; + 5033 1 0 0 0 0 5 1.0118899 -63.603917 500 16 1.1 0.9 15.8900 -9.6400 0.0000 0.0000; + 5034 1 55.35 15.68 0 0 5 1.0060152 -65.813723 161 16 1.1 0.9 122.6600 23.4100 0.0000 0.0000; + 5035 2 0 0 0 0 5 1.0118899 -63.603917 13.2 16 1.1 0.9 15.8900 -9.6400 0.0000 0.0000; + 5036 2 0 0 0 0 5 1.0118899 -63.603917 13.2 16 1.1 0.9 15.8900 -9.6400 0.0000 0.0000; + 5037 2 0 0 0 0 5 1.0200037 -62.97667 13.2 16 1.1 0.9 16.2200 0.0000 0.0000 0.0000; + 5038 2 0 0 0 0 5 1.0200037 -62.955486 13.2 16 1.1 0.9 16.2100 0.0000 0.0000 0.0000; + 5039 2 0 0 0 0 5 1.0200037 -63.323245 13.2 16 1.1 0.9 16.1100 -1936.2900 0.0000 0.0000; + 5040 2 0 0 0 0 5 1.0200037 -62.757295 13.2 16 1.1 0.9 16.5900 0.0000 0.0000 0.0000; + 5041 2 0 0 0 0 5 1.0200037 -63.017874 13.2 16 1.1 0.9 16.3200 0.0000 0.0000 0.0000; + 5042 2 0 0 0 0 5 1.0200037 -62.908332 13.2 16 1.1 0.9 16.2300 0.0000 0.0000 0.0000; + 5043 1 68.1 19.29 0 0 5 0.9871375 -69.362392 161 16 1.1 0.9 332.5500 45.7100 0.0000 0.0000; + 5044 1 17.5 4.96 0 0 5 0.9983642 -62.792669 161 17 1.1 0.9 -869.1700 -9.1900 0.0000 0.0000; + 5045 1 0 0 0 0 5 1.0123163 -48.659247 500 18 1.1 0.9 27.0200 -7.5600 0.0000 0.0000; + 5046 1 77.11 21.85 0 0 5 1.0101609 -50.688968 161 18 1.1 0.9 28.4800 -5.2700 0.0000 0.0000; + 5047 1 0 0 0 0 5 1.0087755 -59.5352 500 17 1.1 0.9 68.1100 -1.1400 0.0000 0.0000; + 5048 1 184.54 52.29 0 0 5 0.9973323 -63.870985 161 17 1.1 0.9 119.4300 13.3900 0.0000 0.0000; + 5049 1 0 0 0 0 5 1.0073743 -59.597977 500 16 1.1 0.9 135.9500 13.4100 0.0000 0.0000; + 5050 1 64.6 18.3 0 0 5 1.0038591 -64.067728 161 16 1.1 0.9 185.6100 33.3000 0.0000 0.0000; + 5051 2 0 0 0 0 5 1.0144236 -58.83038 22 16 1.1 0.9 135.5400 13.2100 0.0000 0.0000; + 5052 1 0 0 0 0 5 1.006318 -62.768645 115 16 1.1 0.9 272.0400 49.8400 0.0000 0.0000; + 5053 1 152.78 43.29 0 0 5 0.9906846 -69.184529 161 16 1.1 0.9 234.5100 37.7700 0.0000 0.0000; + 5054 1 21.17 6 0 0 5 0.9966943 -57.081888 161 14 1.1 0.9 63.9500 11.5000 0.0000 0.0000; + 5055 1 0 0 0 0 5 1.0041557 -49.871156 500 12 1.1 0.9 17.9800 -1.5800 0.0000 0.0000; + 5056 1 40.4 11.45 0 0 5 1.0028279 -50.723681 161 12 1.1 0.9 1.5000 -2.3600 0.0000 0.0000; + 5057 2 0 0 0 0 5 1.0041557 -49.871156 13.8 12 1.1 0.9 17.9800 -1.5800 0.0000 0.0000; + 5058 2 0 0 0 0 5 1.0000036 -47.103438 13.8 12 1.1 0.9 18.0900 0.0000 0.0000 0.0000; + 5059 1 0 0 0 0 5 0.9999403 -63.856348 161 14 1.1 0.9 62.2100 5.0200 0.0000 0.0000; + 5060 1 0 0 0 0 5 1.0048472 -66.185805 115 14 1.1 0.9 5.8400 -11.7500 0.0000 0.0000; + 5061 1 0 0 0 35.42 5 1.0300036 -69.49484 115 14 1.1 0.9 5.4000 0.0000 0.0000 0.0000; + 5062 1 43.74 12.39 0 0 5 1.0020469 -73.777618 115 14 1.1 0.9 5.3900 -0.0000 0.0000 0.0000; + 5063 1 0 0 0 0 5 1.0114735 -61.808109 500 17 1.1 0.9 110.8000 10.0100 0.0000 0.0000; + 5064 1 77.07 21.84 0 0 5 1.003275 -66.003957 161 17 1.1 0.9 173.9600 24.6100 0.0000 0.0000; + 5065 2 0 0 0 0 5 1.0124335 -61.705125 13.8 17 1.1 0.9 110.7600 9.9900 0.0000 0.0000; + 5066 2 0 0 0 0 5 1.0114735 -61.808109 13.8 17 1.1 0.9 110.8000 10.0100 0.0000 0.0000; + 5067 2 0 0 0 0 5 1.0300037 -59.231918 13.8 17 1.1 0.9 110.1500 0.0000 0.0000 0.0000; + 5068 2 0 0 0 0 5 1.0300037 -59.107068 13.8 17 1.1 0.9 110.0300 0.0000 0.0000 0.0000; + 5069 2 0 0 0 0 5 1.0300037 -58.93638 13.8 17 1.1 0.9 109.9400 0.0000 0.0000 0.0000; + 5070 1 74.65 21.15 0 0 5 0.9927308 -69.888997 161 17 1.1 0.9 358.0400 38.2800 0.0000 0.0000; + 5071 1 74.11 21 0 0 5 1.011603 -54.493242 161 13 1.1 0.9 35.0500 0.9500 0.0000 0.0000; + 5072 1 72.34 20.5 0 0 5 0.9961472 -69.466882 161 16 1.1 0.9 261.0300 37.9300 0.0000 0.0000; + 5073 1 8.83 2.5 0 0 5 1.021853 -46.388717 161 15 1.1 0.9 34.8000 -6.0300 0.0000 0.0000; + 5074 1 31.78 9 0 0 5 0.9989481 -69.171734 161 16 1.1 0.9 221.0700 42.4400 0.0000 0.0000; + 5075 1 3.96 1.12 0 0 5 1.0058604 -56.587249 161 18 1.1 0.9 37.9500 1.2500 0.0000 0.0000; + 5076 1 0 0 0 0 5 1.0070069 -71.259946 161 16 1.1 0.9 417.8700 19.1700 0.0000 0.0000; + 5077 1 18.49 5.24 0 81.78 5 1.0300037 -72.214151 115 16 1.1 0.9 404.5600 0.0000 0.0000 0.0000; + 5078 1 66.42 18.82 0 0 5 0.9920351 -66.500523 161 17 1.1 0.9 301.6000 17.4100 0.0000 0.0000; + 5079 1 38.19 10.82 0 0 5 1.0156433 -55.948539 161 13 1.1 0.9 34.8900 0.8800 0.0000 0.0000; + 5080 1 37.61 10.66 0 0 5 0.9973988 -56.837566 161 13 1.1 0.9 40.8300 2.6100 0.0000 0.0000; + 5081 1 89.83 25.45 0 0 5 1.0039916 -55.498998 161 13 1.1 0.9 38.2200 1.0500 0.0000 0.0000; + 5082 1 102.22 28.96 0 0 5 0.9967862 -69.260101 161 17 1.1 0.9 228.0100 21.5200 0.0000 0.0000; + 5083 1 0 0 0 0 5 1.0106265 -63.296954 500 16 1.1 0.9 135.4000 14.7300 0.0000 0.0000; + 5084 1 224.2 63.52 0 0 5 0.9963451 -67.57801 161 16 1.1 0.9 203.3800 34.9700 0.0000 0.0000; + 5085 1 51.3 14.54 0 0 5 0.9901891 -69.43092 161 17 1.1 0.9 383.3800 37.4700 0.0000 0.0000; + 5086 1 92.04 26.08 0 0 5 0.990891 -68.837369 161 17 1.1 0.9 240.9300 16.5000 0.0000 0.0000; + 5087 1 4.13 1.17 0 0 5 0.9923699 -63.439795 161 14 1.1 0.9 215.6300 23.9900 0.0000 0.0000; + 5088 1 0 0 0 0 5 0.9995355 -58.78058 161 18 1.1 0.9 92.1500 13.7700 0.0000 0.0000; + 5089 2 0 0 0 0 5 0.9995355 -58.78058 13.8 18 1.1 0.9 92.1500 13.7700 0.0000 0.0000; + 5090 1 108.74 30.81 0 175 5 0.9997266 -70.653791 161 16 1.1 0.9 452.3800 28.0300 0.0000 0.0000; + 5091 1 5.33 1.51 0 0 5 0.9924256 -62.842774 161 14 1.1 0.9 182.4800 26.5500 0.0000 0.0000; + 5092 1 17.62 4.99 0 0 5 0.9939751 -66.750279 161 14 1.1 0.9 932.0200 -99.3800 0.0000 0.0000; + 5093 1 47.98 13.6 0 215 5 1.0079873 -67.273656 161 17 1.1 0.9 258.8800 -129.6000 0.0000 0.0000; + 5094 1 2.66 0.75 0 0 5 1.0091252 -60.663602 161 14 1.1 0.9 44.5400 0.4800 0.0000 0.0000; + 5095 1 32.24 9.14 0 0 5 1.0061243 -69.180403 161 17 1.1 0.9 277.4000 8.9200 0.0000 0.0000; + 5096 1 61.74 17.49 0 0 5 0.998145 -68.268555 161 16 1.1 0.9 267.7400 41.3300 0.0000 0.0000; + 5097 1 82.57 23.4 0 0 5 0.9999972 -67.60884 161 17 1.1 0.9 206.3300 27.4900 0.0000 0.0000; + 5098 1 156.22 44.26 0 250 5 1.0133532 -68.452463 161 17 1.1 0.9 784.1200 -118.4500 0.0000 0.0000; + 5099 1 67.63 19.16 0 200 5 1.0285145 -69.49623 161 17 1.1 0.9 304.1700 0.0000 0.0000 0.0000; + 5100 1 22.45 6.36 0 0 5 0.9981555 -69.025462 161 16 1.1 0.9 846.2700 6.2000 0.0000 0.0000; + 5101 1 22.63 6.41 0 0 5 1.0231385 -52.383519 161 15 1.1 0.9 34.5600 0.3500 0.0000 0.0000; + 5102 1 0 0 0 0 5 1.0061088 -64.336842 500 16 1.1 0.9 110.6100 8.9500 0.0000 0.0000; + 5103 1 234.49 66.44 0 0 5 0.9970338 -68.607114 161 16 1.1 0.9 226.4200 36.7900 0.0000 0.0000; + 5104 1 79.02 22.39 0 0 5 0.9906466 -66.812962 161 17 1.1 0.9 174.2800 13.6400 0.0000 0.0000; + 5105 1 105.27 29.83 0 0 5 0.9978506 -70.309714 161 17 1.1 0.9 273.9900 22.2200 0.0000 0.0000; + 5106 2 0 0 0 0 5 0.9978506 -70.309714 13.8 17 1.1 0.9 273.9900 22.2200 0.0000 0.0000; + 5107 2 0 0 0 0 5 0.9978506 -70.309714 13.8 17 1.1 0.9 273.9900 22.2200 0.0000 0.0000; + 5108 1 40.12 11.37 0 437.23 5 1.0128198 -67.907093 161 17 1.1 0.9 228.2000 31.7600 0.0000 0.0000; + 5109 1 53.98 15.29 0 0 5 0.9875976 -68.797125 161 16 1.1 0.9 532.1800 40.6700 0.0000 0.0000; + 5110 1 3.44 0.97 0 0 5 0.9917234 -54.157856 161 12 1.1 0.9 44.6600 3.3700 0.0000 0.0000; + 5111 1 37.24 10.55 0 0 5 0.9960216 -70.697429 161 16 1.1 0.9 322.2200 37.0600 0.0000 0.0000; + 5112 1 14.25 4.04 0 0 5 1.0124075 -55.708458 161 18 1.1 0.9 40.2700 2.4100 0.0000 0.0000; + 5113 1 21.58 6.11 0 0 5 1.0034564 -67.378639 161 17 1.1 0.9 567.9200 -47.3400 0.0000 0.0000; + 5114 1 56.95 16.13 0 0 5 0.9941422 -68.777123 161 16 1.1 0.9 262.9800 25.9300 0.0000 0.0000; + 5115 1 17.73 5.02 0 0 5 1.012488 -66.807081 161 16 1.1 0.9 220.0400 35.6800 0.0000 0.0000; + 5116 1 141.56 40.11 0 0 5 0.995135 -70.092213 161 16 1.1 0.9 263.8000 36.0200 0.0000 0.0000; + 5117 1 128.28 36.35 0 0 5 0.9865518 -68.807277 161 17 1.1 0.9 214.2000 13.0500 0.0000 0.0000; + 5118 1 8.65 2.45 0 0 5 1.013265 -44.64322 161 15 1.1 0.9 27.2200 2.6700 0.0000 0.0000; + 5119 1 4.4 1.25 0 0 5 1.0020109 -55.902668 161 12 1.1 0.9 -126.2500 -33.0700 0.0000 0.0000; + 5120 1 0 0 0 0 5 1.0265839 -46.477141 500 15 1.1 0.9 31.5700 -7.1600 0.0000 0.0000; + 5121 1 76.66 21.72 0 30 5 1.0230557 -47.088422 161 15 1.1 0.9 33.5800 -6.3300 0.0000 0.0000; + 5122 1 65 18.42 0 0 5 0.9955858 -70.406998 161 16 1.1 0.9 403.8300 37.5300 0.0000 0.0000; + 5123 1 0 0 0 0 5 1.0100373 -52.478371 161 13 1.1 0.9 91.9100 14.0100 0.0000 0.0000; + 5124 1 26.69 7.56 0 0 5 1.0074707 -51.526607 115 13 1.1 0.9 93.4200 16.8300 0.0000 0.0000; + 5125 1 67.92 19.24 0 0 5 1.0008332 -66.953525 161 17 1.1 0.9 191.7200 25.9600 0.0000 0.0000; + 5126 1 173.21 49.08 0 0 5 0.9903022 -70.945107 161 16 1.1 0.9 422.8100 36.1800 0.0000 0.0000; + 5127 1 3.89 1.1 0 0 5 1.0141202 -55.980893 161 18 1.1 0.9 43.4000 2.9200 0.0000 0.0000; + 5128 1 90.51 25.65 0 0 5 0.9933463 -70.17962 161 16 1.1 0.9 434.5200 32.4900 0.0000 0.0000; + 5129 1 14.89 4.22 0 0 5 1.029375 -50.86701 161 18 1.1 0.9 33.6500 -0.7000 0.0000 0.0000; + 5130 1 99.79 28.27 0 0 5 0.9927624 -69.144531 161 16 1.1 0.9 233.6400 37.5500 0.0000 0.0000; + 5131 1 0 0 0 0 5 1.0231168 -50.339257 500 13 1.1 0.9 32.1600 0.1700 0.0000 0.0000; + 5132 1 102.52 29.05 0 0 5 1.0160463 -52.557089 161 13 1.1 0.9 35.6800 1.3500 0.0000 0.0000; + 5133 1 12.16 3.45 0 0 5 1.0133566 -55.302206 161 18 1.1 0.9 40.4400 1.9700 0.0000 0.0000; + 5134 1 26.98 7.64 0 0 5 1.0093804 -47.451055 161 15 1.1 0.9 13.5700 11.8000 0.0000 0.0000; + 5135 1 27.59 7.82 0 0 5 1.0204654 -52.622255 161 15 1.1 0.9 36.7900 3.6400 0.0000 0.0000; + 5136 1 11.94 3.38 0 0 5 0.9954279 -62.679777 161 16 1.1 0.9 156.8200 21.2300 0.0000 0.0000; + 5137 1 0 0 0 0 5 1.0176217 -53.866566 500 13 1.1 0.9 31.6000 -0.6300 0.0000 0.0000; + 5138 1 105.04 29.76 0 0 5 1.0151038 -55.163641 161 13 1.1 0.9 33.6500 0.4600 0.0000 0.0000; + 5139 1 86.38 24.47 0 270 5 1.0105444 -71.482721 161 16 1.1 0.9 306.2900 29.9900 0.0000 0.0000; + 5140 1 8.65 2.45 0 0 5 1.003568 -55.984643 161 13 1.1 0.9 38.0500 1.7700 0.0000 0.0000; + 5141 1 45.38 12.86 0 0 5 0.9970567 -66.610051 161 16 1.1 0.9 188.2700 30.2300 0.0000 0.0000; + 5142 1 15.53 4.4 0 0 5 1.000532 -55.756364 161 13 1.1 0.9 41.2400 2.8200 0.0000 0.0000; + 5143 1 87.45 24.78 0 0 5 1.000363 -66.784734 161 17 1.1 0.9 185.4800 23.9100 0.0000 0.0000; + 5144 1 73.43 20.8 0 0 5 1.0055435 -56.125128 161 13 1.1 0.9 40.5800 3.3300 0.0000 0.0000; + 5145 1 117.86 33.39 0 0 5 0.9981724 -68.433215 161 17 1.1 0.9 237.9500 34.3400 0.0000 0.0000; + 5146 1 90.75 25.71 0 0 5 0.9940247 -68.908641 161 16 1.1 0.9 333.1800 44.7800 0.0000 0.0000; + 5147 1 108.12 30.63 0 0 5 0.9911209 -70.456465 161 16 1.1 0.9 261.4000 37.0700 0.0000 0.0000; + 5148 1 83.41 23.63 0 0 5 0.9923733 -70.464588 161 17 1.1 0.9 279.7000 27.8600 0.0000 0.0000; + 5149 1 91.45 25.91 0 0 5 0.9905308 -70.846728 161 16 1.1 0.9 442.6400 31.7000 0.0000 0.0000; + 5150 1 4.11 1.17 0 0 5 1.0005802 -54.447796 161 12 1.1 0.9 22.3300 -7.8200 0.0000 0.0000; + 5151 1 5.33 1.51 0 0 5 1.0106406 -57.425386 161 18 1.1 0.9 57.6700 6.0900 0.0000 0.0000; + 5152 1 60.98 17.28 0 0 5 0.9926236 -69.534802 161 16 1.1 0.9 387.7100 43.9500 0.0000 0.0000; + 5153 1 15.98 4.53 0 0 5 0.9987727 -60.198066 161 12 1.1 0.9 -572.1800 -38.9500 0.0000 0.0000; + 5154 1 15.58 4.41 0 0 5 1.0028218 -58.187621 161 18 1.1 0.9 74.6800 9.6000 0.0000 0.0000; + 5155 1 3.71 1.05 0 0 5 1.0132422 -49.714957 161 12 1.1 0.9 23.7000 8.8200 0.0000 0.0000; + 5156 1 6.22 1.76 0 0 5 1.0253708 -49.891957 161 15 1.1 0.9 31.8800 0.7800 0.0000 0.0000; + 5157 1 146.63 41.55 0 0 5 0.9873718 -69.108281 161 17 1.1 0.9 363.9600 37.8700 0.0000 0.0000; + 5158 1 168.19 47.66 0 0 5 1.0155484 -69.345549 161 16 1.1 0.9 980.1500 1.3300 0.0000 0.0000; + 5159 1 14.54 4.12 0 0 5 1.0095589 -52.950894 161 13 1.1 0.9 91.0400 12.7100 0.0000 0.0000; + 5160 1 59.35 16.81 0 0 5 0.9961502 -65.683461 161 17 1.1 0.9 307.4200 15.3500 0.0000 0.0000; + 5161 1 199.65 56.57 0 210 5 1.0151899 -70.792267 161 16 1.1 0.9 662.2300 11.5200 0.0000 0.0000; + 5162 1 6.69 1.9 0 0 5 0.9978615 -58.144392 161 14 1.1 0.9 73.9600 12.2700 0.0000 0.0000; + 5163 1 15.15 4.29 0 0 5 1.0121686 -53.790808 161 13 1.1 0.9 39.6700 1.7900 0.0000 0.0000; + 5164 1 0 0 0 0 5 1.0047874 -61.952518 500 17 1.1 0.9 117.3500 15.0200 0.0000 0.0000; + 5165 1 55.53 15.73 0 0 5 1.0002843 -64.983368 161 17 1.1 0.9 309.6800 14.1900 0.0000 0.0000; + 5166 2 0 0 0 0 5 1.0218809 -60.053904 13.8 17 1.1 0.9 116.2400 14.5100 0.0000 0.0000; + 5167 2 0 0 0 0 5 1.0055327 -61.871378 13.8 17 1.1 0.9 117.3000 15.0000 0.0000 0.0000; + 5168 1 125.67 35.61 0 0 5 0.9927381 -71.347424 161 16 1.1 0.9 368.7000 26.9000 0.0000 0.0000; + 5169 1 0 0 0 0 5 1.0217423 -52.632927 161 15 1.1 0.9 38.8700 2.1500 0.0000 0.0000; + 5170 2 0 0 0 0 5 1.0165538 -50.991727 18 15 1.1 0.9 38.6900 2.1900 0.0000 0.0000; + 5171 1 1.06 0.3 0 0 5 0.9933353 -62.060553 161 14 1.1 0.9 164.3200 25.1900 0.0000 0.0000; + 5172 1 74.24 21.03 0 200 5 1.0198779 -64.872745 161 12 1.1 0.9 123.4300 5.5200 0.0000 0.0000; + 5173 1 136.36 38.63 0 0 5 0.9907796 -69.388475 161 16 1.1 0.9 239.0500 37.9500 0.0000 0.0000; + 5174 1 4.32 1.22 0 0 5 0.9946906 -61.012573 161 14 1.1 0.9 140.4200 22.7800 0.0000 0.0000; + 5175 1 118.67 33.62 0 0 5 0.9984568 -66.267214 161 17 1.1 0.9 313.9900 14.4700 0.0000 0.0000; + 5176 1 7.3 2.07 0 0 5 0.9965165 -52.332332 161 12 1.1 0.9 38.7900 2.4200 0.0000 0.0000; + 5177 1 91.38 25.89 0 0 5 0.9896107 -68.59584 161 17 1.1 0.9 312.6600 7.4100 0.0000 0.0000; + 5178 1 83.96 23.79 0 0 5 0.9936603 -69.777837 161 16 1.1 0.9 399.2100 48.0700 0.0000 0.0000; + 5179 1 0 0 0 0 5 1.0168463 -57.357226 500 14 1.1 0.9 29.3400 -5.9400 0.0000 0.0000; + 5180 1 88.36 25.04 0 0 5 1.0125232 -58.860082 161 14 1.1 0.9 33.3200 -3.6000 0.0000 0.0000; + 5181 1 178.22 50.5 0 0 5 0.9927711 -70.230473 161 16 1.1 0.9 468.0500 40.3000 0.0000 0.0000; + 5182 1 3.82 1.08 0 0 5 1.0057523 -55.657961 161 13 1.1 0.9 37.9200 1.7800 0.0000 0.0000; + 5183 1 139.09 39.41 0 0 5 1.0015418 -71.390505 161 16 1.1 0.9 287.9200 31.8800 0.0000 0.0000; + 5184 1 80.23 22.73 0 0 5 0.9838705 -69.90947 161 17 1.1 0.9 2286.7000 635.9800 0.0000 0.0000; + 5185 1 25.72 7.29 0 0 5 1.0005536 -65.340876 161 17 1.1 0.9 306.8800 -230.6200 0.0000 0.0000; + 5186 1 24.98 7.08 0 0 5 0.9925876 -66.430798 161 17 1.1 0.9 443.4200 -6.7800 0.0000 0.0000; + 5187 1 15.41 4.37 0 0 5 0.9984839 -49.947539 161 12 1.1 0.9 -33.2100 20.0100 0.0000 0.0000; + 5188 1 64.82 18.37 0 0 5 0.9903155 -70.02581 161 16 1.1 0.9 271.6900 35.9500 0.0000 0.0000; + 5189 1 78.84 22.34 0 0 5 0.9985568 -70.085226 161 16 1.1 0.9 634.3000 9.1400 0.0000 0.0000; + 5190 1 3.38 0.96 0 0 5 1.0068908 -57.803449 161 12 1.1 0.9 67.6400 4.2600 0.0000 0.0000; + 5191 1 7.58 2.15 0 60 5 1.0174832 -56.694087 161 18 1.1 0.9 47.8400 3.9400 0.0000 0.0000; + 5192 1 0 0 0 0 5 1.0192435 -51.136831 500 13 1.1 0.9 33.9800 0.7200 0.0000 0.0000; + 5193 1 134.77 38.19 0 0 5 1.0154042 -52.436529 161 13 1.1 0.9 32.2500 0.3800 0.0000 0.0000; + 5194 1 59.01 16.72 0 0 5 0.996302 -68.661066 161 17 1.1 0.9 284.0600 37.6400 0.0000 0.0000; + 5195 1 55.26 15.66 0 0 5 1.0087413 -67.882477 161 17 1.1 0.9 352.4500 -1.8000 0.0000 0.0000; + 5196 1 0 0 0 0 5 1.0035311 -51.6705 500 12 1.1 0.9 22.4800 -2.0600 0.0000 0.0000; + 5197 1 0 0 0 0 5 1.0021341 -53.396769 161 12 1.1 0.9 13.5600 -10.8000 0.0000 0.0000; + 5198 2 0 0 0 0 5 1.0012469 -50.952335 18 12 1.1 0.9 22.5200 1.5300 0.0000 0.0000; + 5199 1 24.33 6.89 0 0 5 0.9940136 -68.00405 161 17 1.1 0.9 203.5700 0.0800 0.0000 0.0000; + 5200 1 66.35 18.8 0 0 5 0.9883868 -55.812197 161 12 1.1 0.9 50.1600 3.9400 0.0000 0.0000; + 5201 1 4.81 1.36 0 0 5 1.0050682 -55.098831 161 14 1.1 0.9 52.6600 7.2900 0.0000 0.0000; + 5202 1 8.64 2.45 0 0 5 0.9998902 -63.253895 161 14 1.1 0.9 79.2700 7.9400 0.0000 0.0000; + 5203 1 147.01 41.65 0 0 5 0.9908861 -70.648422 161 16 1.1 0.9 300.7900 36.7800 0.0000 0.0000; + 5204 1 0 0 0 0 5 1.0041249 -54.842574 500 12 1.1 0.9 17.6300 0.1600 0.0000 0.0000; + 5205 1 0 0 0 0 5 1.0033086 -56.577962 161 12 1.1 0.9 -173.8200 -38.4400 0.0000 0.0000; + 5206 2 0 0 0 0 5 1.0100037 -52.527338 13.8 12 1.1 0.9 17.6100 0.0000 0.0000 0.0000; + 5207 2 0 0 0 0 5 1.0100037 -53.763306 13.8 12 1.1 0.9 17.6200 0.0000 0.0000 0.0000; + 5208 2 0 0 0 0 5 1.0100037 -53.483325 13.8 12 1.1 0.9 17.6200 0.0000 0.0000 0.0000; + 5209 1 3.59 1.02 0 0 5 1.0068628 -56.449559 161 18 1.1 0.9 46.4400 4.9900 0.0000 0.0000; + 5210 1 39.64 11.23 0 0 5 0.9976451 -68.385313 161 17 1.1 0.9 217.3000 23.9300 0.0000 0.0000; + 5211 1 6.91 1.96 0 0 5 0.9978483 -57.799011 161 14 1.1 0.9 68.6300 11.3000 0.0000 0.0000; + 5212 1 33.89 9.6 0 0 5 0.9853498 -67.416145 161 14 1.1 0.9 333.9300 39.8100 0.0000 0.0000; + 5213 1 92.1 26.09 0 0 5 0.991153 -70.137548 161 16 1.1 0.9 675.3800 14.4400 0.0000 0.0000; + 5214 1 102.1 28.93 0 0 5 0.9930973 -69.717172 161 16 1.1 0.9 457.2700 35.2000 0.0000 0.0000; + 5215 1 19.98 5.66 0 0 5 0.9950843 -67.83094 161 16 1.1 0.9 302.1300 12.8400 0.0000 0.0000; + 5216 1 66.58 18.86 0 0 5 0.9922295 -68.435478 161 17 1.1 0.9 219.2600 11.6900 0.0000 0.0000; + 5217 1 100.33 28.43 0 438.77 5 1.013617 -68.86798 161 17 1.1 0.9 203.5600 16.1000 0.0000 0.0000; + 5218 1 39.29 11.13 0 0 5 0.9977031 -66.629682 161 17 1.1 0.9 883.0900 -127.1600 0.0000 0.0000; + 5219 1 13.35 3.78 0 30.53 5 1.0023259 -68.071936 161 14 1.1 0.9 203.8200 27.0200 0.0000 0.0000; + 5220 1 40.49 11.47 0 0 5 1.006319 -67.248232 161 17 1.1 0.9 498.5300 -24.7500 0.0000 0.0000; + 5221 1 91.29 25.87 0 0 5 1.0056901 -55.509023 161 13 1.1 0.9 37.3900 0.7100 0.0000 0.0000; + 5222 1 33.14 9.39 0 0 5 0.9912211 -66.249575 161 14 1.1 0.9 157.9100 18.5400 0.0000 0.0000; + 5223 1 34.79 9.86 0 0 5 0.9928155 -58.120378 161 14 1.1 0.9 68.0400 11.8100 0.0000 0.0000; + 5224 1 154.87 43.88 0 0 5 0.9978456 -70.692267 161 16 1.1 0.9 267.4800 31.8200 0.0000 0.0000; + 5225 1 13.06 3.7 0 0 5 1.0112548 -67.978127 161 16 1.1 0.9 246.3400 37.9200 0.0000 0.0000; + 5226 1 5.49 1.56 0 0 5 1.0295546 -51.125203 161 15 1.1 0.9 33.3800 -0.3100 0.0000 0.0000; + 5227 1 70.88 20.08 0 0 5 1.0001819 -70.818166 161 16 1.1 0.9 422.5500 26.0700 0.0000 0.0000; + 5228 1 81.2 23.01 0 0 5 0.9978578 -67.849826 161 16 1.1 0.9 253.6600 36.5800 0.0000 0.0000; + 5229 1 43.94 12.45 0 0 5 0.9966448 -69.30509 161 16 1.1 0.9 776.6500 6.2800 0.0000 0.0000; + 5230 1 66.37 18.81 0 0 5 0.9979742 -70.329206 161 16 1.1 0.9 541.0400 14.5900 0.0000 0.0000; + 5231 1 14.93 4.23 0 0 5 1.0144161 -54.342655 161 18 1.1 0.9 37.9400 1.0500 0.0000 0.0000; + 5232 1 49.97 14.16 0 0 5 0.9970929 -69.623082 161 17 1.1 0.9 235.1300 22.2500 0.0000 0.0000; + 5233 1 98.77 27.99 0 0 5 1.0021182 -69.136419 161 17 1.1 0.9 237.3800 25.8200 0.0000 0.0000; + 5234 1 142.66 40.42 0 0 5 0.9929776 -67.866185 161 16 1.1 0.9 204.0200 31.9900 0.0000 0.0000; + 5235 1 20.37 5.77 0 0 5 1.0163012 -53.868718 161 13 1.1 0.9 47.6500 2.5800 0.0000 0.0000; + 5236 1 0 0 0 0 5 1.0064601 -45.404234 500 12 1.1 0.9 32.4600 -1.9900 0.0000 0.0000; + 5237 1 0 0 0 0 5 0.9995378 -43.050212 161 12 1.1 0.9 43.7800 -3.6000 0.0000 0.0000; + 5238 2 0 0 0 0 5 1.003443 -44.466857 18 12 1.1 0.9 32.5100 2.1800 0.0000 0.0000; + 5239 1 0 0 0 0 5 1.0302803 -48.33187 500 18 1.1 0.9 29.4000 -3.1400 0.0000 0.0000; + 5240 1 0 0 0 0 5 1.0319378 -50.135975 161 18 1.1 0.9 33.9100 -1.1800 0.0000 0.0000; + 5241 1 0 0 0 0 5 1.0340183 -51.650756 115 18 1.1 0.9 39.7900 0.4600 0.0000 0.0000; + 5242 1 0 0 0 0 5 1.0340183 -51.650756 115 18 1.1 0.9 39.7900 0.4600 0.0000 0.0000; + 5243 2 0 0 0 0 5 1.0248149 -46.73872 13.8 18 1.1 0.9 29.5600 -3.1800 0.0000 0.0000; + 5244 1 65.13 18.45 0 0 5 0.9923735 -67.617071 161 17 1.1 0.9 187.5100 15.1100 0.0000 0.0000; + 5245 1 138.96 39.37 0 0 5 1.0025837 -70.428184 161 17 1.1 0.9 274.3800 15.5100 0.0000 0.0000; + 5246 1 21.21 6.01 0 0 5 1.0092224 -55.57232 161 18 1.1 0.9 33.6600 2.1900 0.0000 0.0000; + 5247 1 3.26 0.92 0 0 5 1.0047736 -57.31084 161 18 1.1 0.9 59.9400 7.4500 0.0000 0.0000; + 5248 1 101.02 28.62 0 0 5 0.9961372 -68.548083 161 17 1.1 0.9 207.2400 22.3300 0.0000 0.0000; + 5249 1 114.68 32.49 0 0 5 0.9937061 -64.451815 161 17 1.1 0.9 144.2700 -2.5700 0.0000 0.0000; + 5250 1 165.09 46.77 0 0 5 1.001048 -67.996261 161 16 1.1 0.9 1055.1900 8.8500 0.0000 0.0000; + 5251 1 123.12 34.88 0 0 5 0.9962977 -69.304908 161 17 1.1 0.9 262.4600 32.4400 0.0000 0.0000; + 5252 1 80.8 22.89 0 0 5 0.9934338 -70.775757 161 16 1.1 0.9 394.9500 37.6600 0.0000 0.0000; + 5253 1 126.68 35.89 0 0 5 0.9920041 -68.728406 161 17 1.1 0.9 295.8300 22.8700 0.0000 0.0000; + 5254 1 82.94 23.5 0 0 5 0.9982401 -68.041206 161 17 1.1 0.9 209.8600 8.9400 0.0000 0.0000; + 5255 1 9.43 2.67 0 0 5 0.9938103 -56.571159 161 12 1.1 0.9 55.9100 4.2000 0.0000 0.0000; + 5256 1 1.3 0.37 0 0 5 0.9917716 -64.646241 161 14 1.1 0.9 220.6900 29.6200 0.0000 0.0000; + 5257 1 9.9 2.8 0 0 5 0.9916958 -63.997794 161 14 1.1 0.9 211.2300 27.8600 0.0000 0.0000; + 5258 1 100.19 28.39 0 0 5 0.9905157 -69.598804 161 16 1.1 0.9 349.2900 50.5900 0.0000 0.0000; + 5259 1 9.21 2.61 0 0 5 1.0028934 -68.489599 161 16 1.1 0.9 268.1500 40.4900 0.0000 0.0000; + 5260 1 0 0 0 0 5 1.0089631 -53.485683 500 18 1.1 0.9 7.8700 -8.1900 0.0000 0.0000; + 5261 1 0 0 0 0 5 1.0103577 -54.745603 161 18 1.1 0.9 22.9600 -0.6700 0.0000 0.0000; + 5262 2 0 0 0 0 5 1.0100036 -49.178522 13.8 18 1.1 0.9 8.6200 0.0000 0.0000 0.0000; + 5263 2 0 0 0 0 5 1.0100036 -50.889223 13.8 18 1.1 0.9 8.4400 0.0000 0.0000 0.0000; + 5264 1 12.13 3.44 0 80.93 5 1.0300037 -54.28682 161 15 1.1 0.9 44.5700 0.0000 0.0000 0.0000; + 5265 1 103.94 29.45 0 0 5 1.0039999 -67.015917 161 17 1.1 0.9 176.7500 19.7900 0.0000 0.0000; + 5266 1 136.12 38.57 0 0 5 1.0044384 -68.656178 161 17 1.1 0.9 241.4200 29.8800 0.0000 0.0000; + 5267 1 39.32 11.14 0 0 5 1.0027853 -57.00537 161 13 1.1 0.9 38.5200 1.7500 0.0000 0.0000; + 5268 1 32.23 9.13 0 0 5 0.9907612 -63.863853 161 16 1.1 0.9 161.0700 22.5000 0.0000 0.0000; + 5269 1 86.96 24.64 0 0 5 0.9955747 -64.185691 161 17 1.1 0.9 250.9300 26.5600 0.0000 0.0000; + 5270 1 22.41 6.35 0 0 5 1.0001903 -58.167585 161 13 1.1 0.9 80.3400 13.4200 0.0000 0.0000; + 5271 1 10.01 2.83 0 0 5 1.0123768 -53.413671 161 13 1.1 0.9 88.1700 9.2800 0.0000 0.0000; + 5272 1 18.83 5.33 0 0 5 1.0001553 -70.346898 161 16 1.1 0.9 582.1200 15.9500 0.0000 0.0000; + 5273 1 116 32.87 0 0 5 1.0192129 -70.472499 161 17 1.1 0.9 250.3100 6.7700 0.0000 0.0000; + 5274 1 11.87 3.36 0 0 5 0.9933622 -68.768679 161 16 1.1 0.9 694.6200 36.8200 0.0000 0.0000; + 5275 1 4.75 1.35 0 0 5 0.9939932 -58.894764 161 14 1.1 0.9 74.3100 12.0400 0.0000 0.0000; + 5276 1 10.54 2.99 0 0 5 1.0088725 -53.90564 161 14 1.1 0.9 46.1700 5.1800 0.0000 0.0000; + 5277 1 104.8 29.69 0 0 5 0.996073 -69.136041 161 16 1.1 0.9 339.6100 -0.1600 0.0000 0.0000; + 5278 1 50.69 14.36 0 0 5 1.0131096 -52.2113 161 13 1.1 0.9 62.9100 7.8100 0.0000 0.0000; + 5279 1 0 0 0 0 5 1.0204489 -50.198167 500 13 1.1 0.9 35.1800 0.9500 0.0000 0.0000; + 5280 1 94.63 26.81 0 0 5 1.016047 -51.505395 161 13 1.1 0.9 44.1900 4.3800 0.0000 0.0000; + 5281 2 0 0 0 0 5 1.0138745 -47.270235 13.8 13 1.1 0.9 35.0500 0.9700 0.0000 0.0000; + 5282 2 0 0 0 0 5 1.0151555 -47.72484 13.8 13 1.1 0.9 35.0600 0.9700 0.0000 0.0000; + 5283 2 0 0 0 0 5 1.0204489 -50.198167 13.8 13 1.1 0.9 35.1800 0.9500 0.0000 0.0000; + 5284 1 44.65 12.65 0 0 5 0.9937822 -67.452524 161 16 1.1 0.9 256.4500 43.4000 0.0000 0.0000; + 5285 1 10.15 2.88 0 0 5 0.9939746 -59.855429 161 12 1.1 0.9 142.9900 21.6700 0.0000 0.0000; + 5286 1 30.18 8.55 0 0 5 1.0085982 -53.480669 161 18 1.1 0.9 34.3100 -1.1200 0.0000 0.0000; + 5287 1 186.78 52.92 0 0 5 0.9915824 -69.454932 161 17 1.1 0.9 270.9500 22.9800 0.0000 0.0000; + 5288 1 13.61 3.86 0 0 5 0.9927968 -63.897092 161 16 1.1 0.9 162.8500 23.3600 0.0000 0.0000; + 5289 1 69.76 19.77 0 250 5 0.9979111 -70.480285 161 16 1.1 0.9 329.7200 38.7500 0.0000 0.0000; + 5290 1 30.34 8.6 0 0 5 0.9971602 -59.526577 161 18 1.1 0.9 104.8300 15.4000 0.0000 0.0000; + 5291 1 144.17 40.85 0 0 5 0.9931786 -67.687009 161 17 1.1 0.9 220.7000 -53.9800 0.0000 0.0000; + 5292 1 62.05 17.58 0 0 5 0.9916379 -65.745406 161 17 1.1 0.9 165.0500 -15.3300 0.0000 0.0000; + 5293 1 62.97 17.84 0 0 5 0.990565 -61.77388 161 18 1.1 0.9 175.4200 8.7000 0.0000 0.0000; + 5294 1 111.16 31.49 0 0 5 0.9928593 -71.069158 161 16 1.1 0.9 412.3200 30.9500 0.0000 0.0000; + 5295 1 0 0 0 0 5 1.0132636 -62.777457 500 16 1.1 0.9 134.5500 13.5200 0.0000 0.0000; + 5296 1 102.32 28.99 0 0 5 1.0048089 -65.378771 161 16 1.1 0.9 162.3800 25.4600 0.0000 0.0000; + 5297 2 0 0 0 0 5 1.0132636 -62.777458 13.8 16 1.1 0.9 134.5500 13.5200 0.0000 0.0000; + 5298 2 0 0 0 0 5 1.0195717 -62.094109 13.8 16 1.1 0.9 134.1800 13.3400 0.0000 0.0000; + 5299 2 0 0 0 0 5 1.0260017 -61.379399 13.8 16 1.1 0.9 133.8100 13.1700 0.0000 0.0000; + 5300 2 0 0 0 0 5 1.0238991 -61.615014 13.8 16 1.1 0.9 133.9300 13.2200 0.0000 0.0000; + 5301 2 0 0 0 0 5 1.0260985 -61.387308 13.8 16 1.1 0.9 133.7800 13.1500 0.0000 0.0000; + 5302 2 0 0 0 0 5 1.0400038 -58.367316 13.8 16 1.1 0.9 132.9400 0.0000 0.0000 0.0000; + 5303 2 0 0 0 0 5 1.0400038 -59.489257 13.8 16 1.1 0.9 133.4100 0.0000 0.0000 0.0000; + 5304 1 0 0 0 0 5 1.0096946 -63.067254 500 16 1.1 0.9 133.1500 13.7300 0.0000 0.0000; + 5305 1 189.42 53.67 0 0 5 1.0007762 -67.072323 161 16 1.1 0.9 226.7000 39.1800 0.0000 0.0000; + 5306 1 40.81 11.56 0 0 5 1.002542 -64.142493 161 17 1.1 0.9 132.7500 9.5400 0.0000 0.0000; + 5307 1 143.56 40.67 0 0 5 1.0086242 -69.671189 161 16 1.1 0.9 243.8500 18.3700 0.0000 0.0000; + 5308 1 15.35 4.35 0 0 5 0.996695 -68.377105 161 16 1.1 0.9 303.1100 47.9400 0.0000 0.0000; + 5309 1 98.85 28.01 0 0 5 0.9902391 -70.659059 161 16 1.1 0.9 543.6600 19.6600 0.0000 0.0000; + 5310 1 69.99 19.83 0 0 5 1.0078955 -69.176634 161 17 1.1 0.9 211.5100 13.5600 0.0000 0.0000; + 5311 1 40.96 11.61 0 0 5 0.996606 -71.16814 161 16 1.1 0.9 413.5200 27.7200 0.0000 0.0000; + 5312 1 81.81 23.18 0 0 5 0.987907 -66.263704 161 17 1.1 0.9 153.6000 -9.2500 0.0000 0.0000; + 5313 1 16.12 4.57 0 0 5 1.0023546 -66.667157 161 16 1.1 0.9 176.5800 29.9500 0.0000 0.0000; + 5314 1 11.99 3.4 0 0 5 1.0079145 -56.050806 161 13 1.1 0.9 40.6500 2.7000 0.0000 0.0000; + 5315 1 31.74 8.99 0 0 5 0.9926555 -68.038658 161 17 1.1 0.9 532.8200 -44.7900 0.0000 0.0000; + 5316 1 176.19 49.92 0 471.17 5 1.0250721 -70.290321 161 16 1.1 0.9 842.8000 0.0000 0.0000 0.0000; + 5317 1 0 0 0 0 5 1.0090041 -54.693873 500 18 1.1 0.9 2.6200 -12.1100 0.0000 0.0000; + 5318 1 0 0 0 0 5 1.0055601 -57.852276 161 18 1.1 0.9 -568.3200 -230.8600 0.0000 0.0000; + 5319 2 0 0 0 0 5 1.0100036 -53.844439 13.2 18 1.1 0.9 2.9600 0.0000 0.0000 0.0000; + 5320 2 0 0 0 0 5 1.0090041 -54.693873 13.2 18 1.1 0.9 2.6200 -12.1100 0.0000 0.0000; + 5321 2 0 0 0 0 5 1.0100036 -53.881333 13.2 18 1.1 0.9 2.9700 0.0000 0.0000 0.0000; + 5322 1 0 0 0 0 5 1.0114442 -63.313338 500 17 1.1 0.9 96.1400 5.7100 0.0000 0.0000; + 5323 1 219.44 62.17 0 0 5 1.0012527 -67.608652 161 17 1.1 0.9 220.1700 35.0100 0.0000 0.0000; + 5324 2 0 0 0 0 5 1.0396827 -60.147325 13.8 17 1.1 0.9 95.3500 5.3600 0.0000 0.0000; + 5325 2 0 0 0 0 5 1.0392848 -60.132726 13.8 17 1.1 0.9 95.4200 5.3900 0.0000 0.0000; + 5326 2 0 0 0 0 5 1.0217061 -62.207738 13.8 17 1.1 0.9 95.8500 5.5700 0.0000 0.0000; + 5327 1 4.01 1.14 0 0 5 1.0008092 -56.590338 161 14 1.1 0.9 61.2800 9.6300 0.0000 0.0000; + 5328 1 13.64 3.86 0 0 5 0.9993733 -57.379315 161 13 1.1 0.9 40.0900 2.3200 0.0000 0.0000; + 5329 1 148.25 42 0 0 5 0.9893301 -69.775551 161 16 1.1 0.9 471.1700 37.5400 0.0000 0.0000; + 5330 1 64.78 18.35 0 0 5 0.998589 -67.788901 161 17 1.1 0.9 206.8800 25.5300 0.0000 0.0000; + 5331 1 26.36 7.47 0 0 5 0.9951334 -68.202184 161 16 1.1 0.9 199.3100 36.8000 0.0000 0.0000; + 5332 1 85.12 24.12 0 0 5 0.994045 -68.527302 161 17 1.1 0.9 251.0600 -63.7700 0.0000 0.0000; + 5333 1 108.12 30.63 0 0 5 0.9858886 -68.444457 161 14 1.1 0.9 395.9900 41.1300 0.0000 0.0000; + 5334 1 23.95 6.78 0 0 5 1.0170015 -41.553255 161 15 1.1 0.9 41.6100 -3.0600 0.0000 0.0000; + 5335 1 166.71 47.23 0 0 5 0.9905902 -70.737981 161 17 1.1 0.9 297.8100 32.4800 0.0000 0.0000; + 5336 1 74.14 21.01 0 0 5 0.9961507 -68.137877 161 16 1.1 0.9 290.6000 45.3000 0.0000 0.0000; + 5337 1 18.78 5.32 0 0 5 1.0004874 -54.583053 161 12 1.1 0.9 -41.8800 -21.3500 0.0000 0.0000; + 5338 1 80.26 22.74 0 0 5 0.9861986 -64.648695 161 18 1.1 0.9 269.8900 -1.7500 0.0000 0.0000; + 5339 1 80.01 22.67 0 200 5 1.0192148 -70.062654 161 17 1.1 0.9 263.0200 10.7800 0.0000 0.0000; + 5340 1 33.94 9.62 0 0 5 0.9971876 -70.473191 161 16 1.1 0.9 459.1400 30.2100 0.0000 0.0000; + 5341 1 38.7 10.97 0 0 5 1.0147081 -69.016844 161 17 1.1 0.9 235.8400 13.6400 0.0000 0.0000; + 5342 2 0 0 0 0 5 1.0232016 -67.871086 13.8 17 1.1 0.9 234.9000 13.3100 0.0000 0.0000; + 5343 2 0 0 0 0 5 1.0400037 -63.591437 13.8 17 1.1 0.9 233.4600 0.0000 0.0000 0.0000; + 5344 1 94.71 26.84 0 0 5 1.0030215 -71.438625 161 16 1.1 0.9 337.0000 30.9600 0.0000 0.0000; + 5345 1 33.12 9.38 0 0 5 0.9918492 -61.899436 161 14 1.1 0.9 163.5300 21.9000 0.0000 0.0000; + 5346 1 91.3 25.87 0 260 5 0.9990306 -67.70482 161 17 1.1 0.9 225.7400 2.0500 0.0000 0.0000; + 5347 1 18.68 5.29 0 0 5 1.011644 -44.267315 161 15 1.1 0.9 13.9100 8.4100 0.0000 0.0000; + 5348 1 9.25 2.62 0 0 5 0.9934822 -64.120839 161 14 1.1 0.9 266.0200 20.8000 0.0000 0.0000; + 5349 1 60.83 17.23 0 0 5 0.9948937 -68.637933 161 16 1.1 0.9 281.5900 38.2400 0.0000 0.0000; + 5350 1 0 0 0 0 5 1.0063841 -63.932657 500 16 1.1 0.9 120.4100 14.4900 0.0000 0.0000; + 5351 1 174.28 49.38 0 0 5 0.9996762 -67.14998 161 16 1.1 0.9 242.5100 44.1900 0.0000 0.0000; + 5352 1 41.84 11.85 0 0 5 0.9980317 -69.436055 161 16 1.1 0.9 770.6000 6.5900 0.0000 0.0000; + 5353 1 56.58 16.03 0 0 5 1.004548 -68.276015 161 17 1.1 0.9 259.8500 34.6300 0.0000 0.0000; + 5354 1 77.72 22.02 0 0 5 1.0054482 -70.678253 161 16 1.1 0.9 610.5400 24.5100 0.0000 0.0000; + 5355 1 5.65 1.6 0 0 5 0.9954015 -64.80881 161 14 1.1 0.9 329.8300 11.9700 0.0000 0.0000; + 5356 1 122.43 34.69 0 0 5 0.9987673 -70.084759 161 16 1.1 0.9 382.3700 37.8200 0.0000 0.0000; + 5357 1 91.04 25.79 0 0 5 0.9934368 -68.519903 161 16 1.1 0.9 227.3300 37.1300 0.0000 0.0000; + 5358 1 0 0 0 0 5 1.0189112 -49.655631 500 13 1.1 0.9 33.6000 -0.6000 0.0000 0.0000; + 5359 1 0 0 0 0 5 1.0164108 -52.043526 161 13 1.1 0.9 37.0400 1.8000 0.0000 0.0000; + 5360 2 0 0 0 0 5 1.0100035 -43.371515 13.8 13 1.1 0.9 33.6000 0.0000 0.0000 0.0000; + 5361 1 0 0 0 0 5 1.0027436 -55.677392 500 12 1.1 0.9 44.6200 5.2700 0.0000 0.0000; + 5362 1 33.91 9.61 0 0 5 1.0007578 -56.64473 161 12 1.1 0.9 57.3300 10.3500 0.0000 0.0000; + 5363 2 0 0 0 0 5 1.0024188 -55.482221 13.8 12 1.1 0.9 44.5800 5.2700 0.0000 0.0000; + 5364 2 0 0 0 0 5 1.0005945 -54.523711 13.8 12 1.1 0.9 44.3800 0.0000 0.0000 0.0000; + 5365 2 0 0 0 0 5 1.0000036 -53.276491 13.8 12 1.1 0.9 44.2900 0.0000 0.0000 0.0000; + 5366 2 0 0 0 0 5 1.0000036 -52.946217 13.8 12 1.1 0.9 44.2200 0.0000 0.0000 0.0000; + 5367 2 0 0 0 0 5 1.0000036 -53.026975 13.8 12 1.1 0.9 44.2500 0.0000 0.0000 0.0000; + 5368 2 0 0 0 0 5 1.0000036 -53.913336 13.8 12 1.1 0.9 44.3400 0.0000 0.0000 0.0000; + 5369 2 0 0 0 0 5 1.0000036 -52.802605 13.8 12 1.1 0.9 44.2000 0.0000 0.0000 0.0000; + 5370 1 105.99 30.03 0 0 5 0.9930941 -67.920677 161 17 1.1 0.9 303.2500 20.0700 0.0000 0.0000; + 5371 1 69 19.55 0 0 5 1.0011586 -67.094798 161 16 1.1 0.9 152.8000 26.9900 0.0000 0.0000; + 5372 1 39.8 11.28 0 0 5 0.9973885 -71.057686 161 16 1.1 0.9 324.4100 34.1800 0.0000 0.0000; + 5373 1 156.99 44.48 0 0 5 0.9831845 -70.57855 161 17 1.1 0.9 2272.4400 675.6200 0.0000 0.0000; + 5374 1 69.09 19.58 0 0 5 1.0085274 -67.745634 161 16 1.1 0.9 1141.2900 8.3000 0.0000 0.0000; + 5375 1 62.09 17.59 0 0 5 0.9947039 -67.709225 161 17 1.1 0.9 208.8000 4.7700 0.0000 0.0000; + 5376 1 47.85 13.56 0 0 5 1.0009075 -68.205947 161 17 1.1 0.9 253.9800 35.7800 0.0000 0.0000; + 5377 1 57.62 16.33 0 0 5 1.0063759 -55.810539 161 13 1.1 0.9 37.2400 0.7000 0.0000 0.0000; + 5378 1 68.06 19.28 0 113.05 5 1.017317 -56.787137 161 13 1.1 0.9 36.5400 1.3100 0.0000 0.0000; + 5379 1 164.73 46.67 0 0 5 0.9999844 -69.527167 161 17 1.1 0.9 213.5400 13.9000 0.0000 0.0000; + 5380 1 0 0 0 0 5 1.0161422 -60.232619 500 14 1.1 0.9 9.4700 -13.5800 0.0000 0.0000; + 5381 1 79.8 22.61 0 0 5 1.0075076 -61.788935 161 14 1.1 0.9 52.0900 2.8500 0.0000 0.0000; + 5382 2 0 0 0 0 5 1.0310511 -59.745994 13.8 14 1.1 0.9 9.7000 -13.2000 0.0000 0.0000; + 5383 2 0 0 0 0 5 1.0330827 -59.67877 13.8 14 1.1 0.9 9.7300 -13.1500 0.0000 0.0000; + 5384 1 0 0 0 0 5 1.0100859 -63.960217 500 16 1.1 0.9 -47.2700 -31.2700 0.0000 0.0000; + 5385 1 240.97 68.28 0 0 5 1.0073361 -66.522737 161 16 1.1 0.9 1294.1100 20.1600 0.0000 0.0000; + 5386 1 63.55 18 0 160 5 0.9996083 -69.720203 161 16 1.1 0.9 337.2600 40.3700 0.0000 0.0000; + 5387 1 77.75 22.03 0 0 5 0.9880517 -69.141357 161 17 1.1 0.9 314.3300 -33.3800 0.0000 0.0000; + 5388 1 0 0 0 0 5 1.0163 -54.040757 500 13 1.1 0.9 31.0400 -0.8300 0.0000 0.0000; + 5389 1 87.47 24.78 0 0 5 1.0120591 -55.345438 161 13 1.1 0.9 40.2100 3.4900 0.0000 0.0000; + 5390 1 0 0 0 0 5 1.0116505 -53.152522 161 13 1.1 0.9 108.9400 11.5800 0.0000 0.0000; + 5391 1 0 0 0 0 5 1.0109149 -54.525657 115 13 1.1 0.9 219.4200 36.9700 0.0000 0.0000; + 5392 1 7.49 2.12 0 0 5 1.0030516 -55.816976 115 13 1.1 0.9 221.5900 37.6400 0.0000 0.0000; + 5393 1 14.92 4.23 0 0 5 1.0039687 -57.33361 161 13 1.1 0.9 67.8500 9.6600 0.0000 0.0000; + 5394 1 0 0 0 0 5 1.023411 -39.922905 500 15 1.1 0.9 39.5000 -4.1900 0.0000 0.0000; + 5395 1 0 0 0 0 5 1.0224355 -37.828978 230 15 1.1 0.9 41.9500 -1.7800 0.0000 0.0000; + 5396 1 0 0 0 0 5 1.016742 -40.58104 161 15 1.1 0.9 -19.2800 16.5100 0.0000 0.0000; + 5397 1 0 0 0 0 5 1.0074631 -38.580803 115 15 1.1 0.9 -151.2400 44.6600 0.0000 0.0000; + 5398 1 0 0 0 0 5 1.0074631 -38.580803 115 15 1.1 0.9 -151.2400 44.6600 0.0000 0.0000; + 5399 2 0 0 0 0 5 1.0271095 -39.200917 13.8 15 1.1 0.9 39.6000 -4.1600 0.0000 0.0000; + 5400 1 108.27 30.68 0 0 5 0.9967846 -66.989098 161 16 1.1 0.9 176.4000 30.5100 0.0000 0.0000; + 5401 1 0 0 0 0 5 1.0088196 -55.416863 500 18 1.1 0.9 16.3500 -7.8900 0.0000 0.0000; + 5402 1 65.97 18.69 0 0 5 0.9998415 -58.911918 161 18 1.1 0.9 95.4000 9.6800 0.0000 0.0000; + 5403 2 0 0 0 0 5 1.0218991 -53.959079 18 18 1.1 0.9 16.7500 -7.7000 0.0000 0.0000; + 5404 2 0 0 0 0 5 1.0178483 -54.562186 18 18 1.1 0.9 16.6200 -7.7600 0.0000 0.0000; + 5405 2 0 0 0 0 5 1.0179518 -54.469941 18 18 1.1 0.9 16.6300 -7.7500 0.0000 0.0000; + 5406 2 0 0 0 0 5 1.0214877 -54.002106 18 18 1.1 0.9 16.7300 -7.7000 0.0000 0.0000; + 5407 1 21.28 6.03 0 0 5 1.0120751 -57.277271 161 18 1.1 0.9 50.3200 4.4700 0.0000 0.0000; + 5408 1 26.57 7.53 0 0 5 1.0064941 -66.912494 161 16 1.1 0.9 199.0600 31.6900 0.0000 0.0000; + 5409 1 92.56 26.22 0 0 5 0.9845484 -68.588503 161 17 1.1 0.9 202.7200 15.0500 0.0000 0.0000; + 5410 1 0 0 0 0 5 1.0241397 -50.990327 500 13 1.1 0.9 32.3200 -0.3300 0.0000 0.0000; + 5411 1 120.07 34.02 0 174.61 5 1.0246621 -53.838639 161 13 1.1 0.9 35.6800 0.0000 0.0000 0.0000; + 5412 1 144.59 40.97 0 0 5 0.9954182 -68.918059 161 16 1.1 0.9 289.2300 42.6000 0.0000 0.0000; + 5413 1 0 0 0 0 5 1.0054775 -51.157338 500 12 1.1 0.9 34.0400 -0.2700 0.0000 0.0000; + 5414 1 0 0 0 0 5 1.016942 -52.340595 161 12 1.1 0.9 37.4000 1.0000 0.0000 0.0000; + 5415 2 0 0 0 0 5 1.0009421 -48.946715 13.8 12 1.1 0.9 33.9900 0.0000 0.0000 0.0000; + 5416 2 0 0 0 0 5 1.0007665 -48.922063 13.8 12 1.1 0.9 34.0300 0.0000 0.0000 0.0000; + 5417 2 0 0 0 0 5 1.0013355 -49.188769 13.8 12 1.1 0.9 33.9900 0.0000 0.0000 0.0000; + 5418 2 0 0 0 0 5 1.0020184 -49.301197 13.8 12 1.1 0.9 34.0200 -17.6600 0.0000 0.0000; + 5419 2 0 0 0 0 5 1.0035218 -50.071315 13.8 12 1.1 0.9 34.0300 4.2300 0.0000 0.0000; + 5420 1 14.67 4.16 0 0 5 1.0009765 -66.722179 161 17 1.1 0.9 181.1800 15.9700 0.0000 0.0000; + 5421 1 2.01 0.57 0 167.52 5 1.0195162 -67.398382 161 16 1.1 0.9 226.2800 34.5700 0.0000 0.0000; + 5422 1 182.95 51.83 0 479.28 5 1.0255171 -69.921845 161 17 1.1 0.9 243.6500 0.0000 0.0000 0.0000; + 5423 2 0 0 0 0 5 1.0244054 -69.256698 13.8 17 1.1 0.9 243.4200 4.3700 0.0000 0.0000; + 5424 2 0 0 0 0 5 1.0255171 -69.921845 13.8 17 1.1 0.9 243.6500 4.3500 0.0000 0.0000; + 5425 1 52.93 15 0 0 5 0.9943402 -69.414592 161 16 1.1 0.9 302.5400 38.3400 0.0000 0.0000; + 5426 1 43.86 12.43 0 0 5 0.9923213 -64.927189 161 14 1.1 0.9 114.8800 12.6900 0.0000 0.0000; + 5427 1 25.31 7.17 0 0 5 0.9890491 -66.172663 161 14 1.1 0.9 302.7900 35.2500 0.0000 0.0000; + 5428 1 85.26 24.16 0 0 5 0.9981876 -67.709233 161 17 1.1 0.9 199.6100 24.1600 0.0000 0.0000; + 5429 1 106.17 30.08 0 0 5 0.9886279 -68.874948 161 17 1.1 0.9 266.2900 -50.3800 0.0000 0.0000; + 5430 1 60.59 17.17 0 0 5 1.0050924 -64.430388 161 12 1.1 0.9 117.3300 4.1800 0.0000 0.0000; + 5431 1 84.43 23.92 0 0 5 0.9934421 -69.174475 161 16 1.1 0.9 308.7400 44.0800 0.0000 0.0000; + 5432 1 42.02 11.91 0 0 5 0.9990176 -63.099008 161 12 1.1 0.9 99.9800 4.6300 0.0000 0.0000; + 5433 1 116.98 33.14 0 0 5 0.9934057 -69.662264 161 17 1.1 0.9 224.9400 14.6800 0.0000 0.0000; + 5434 1 9.96 2.82 0 0 5 1.0049218 -66.557569 161 17 1.1 0.9 276.4900 -168.5500 0.0000 0.0000; + 5435 1 4.5 1.27 0 0 5 1.0176369 -54.306376 161 12 1.1 0.9 40.4000 1.5500 0.0000 0.0000; + 5436 1 72.89 20.65 0 0 5 0.9961094 -70.602485 161 16 1.1 0.9 358.7000 39.6900 0.0000 0.0000; + 5437 1 9.01 2.55 0 0 5 0.9982816 -58.223188 161 13 1.1 0.9 76.4100 12.7200 0.0000 0.0000; + 5438 1 50.24 14.24 0 0 5 0.9952131 -68.276586 161 17 1.1 0.9 207.6000 -4.6600 0.0000 0.0000; + 5439 1 113.9 32.27 0 0 5 0.9994975 -63.033831 161 14 1.1 0.9 97.3800 11.7500 0.0000 0.0000; + 5440 1 167.12 47.35 0 200 5 1.0016324 -69.829473 161 17 1.1 0.9 231.4200 21.4400 0.0000 0.0000; + 5441 1 145.18 41.13 0 0 5 0.9958285 -66.432588 161 17 1.1 0.9 192.5700 6.2200 0.0000 0.0000; + 5442 1 43.72 12.39 0 0 5 0.9931796 -68.679625 161 17 1.1 0.9 215.8600 13.6800 0.0000 0.0000; + 5443 1 52.34 14.83 0 0 5 0.9965091 -68.028179 161 17 1.1 0.9 246.0000 -0.6300 0.0000 0.0000; + 5444 2 0 0 0 0 5 1.0100036 -59.522471 500 17 1.1 0.9 95.2400 0.0000 0.0000 0.0000; + 5445 1 0 0 0 0 5 0.9997415 -63.368958 161 17 1.1 0.9 236.9600 23.3900 0.0000 0.0000; + 5446 1 40.66 11.52 0 0 5 1.0032225 -57.62531 161 13 1.1 0.9 39.2800 2.0300 0.0000 0.0000; + 5447 1 154.46 43.76 0 0 5 0.9874028 -67.859701 161 17 1.1 0.9 192.2700 15.7700 0.0000 0.0000; + 5448 1 0 0 0 0 5 1.0088716 -63.464727 500 17 1.1 0.9 111.1800 10.6300 0.0000 0.0000; + 5449 1 266.99 75.65 0 0 5 1.0105325 -66.873579 161 17 1.1 0.9 190.4900 30.4600 0.0000 0.0000; + 5450 1 17.1 4.84 0 0 5 0.9914889 -67.634381 161 16 1.1 0.9 191.8400 34.3400 0.0000 0.0000; + 5451 1 0 0 0 0 5 1.0250281 -50.968733 500 13 1.1 0.9 31.4400 -1.1000 0.0000 0.0000; + 5452 1 106.6 30.2 0 0 5 1.0200069 -52.262391 161 13 1.1 0.9 32.2300 -0.5000 0.0000 0.0000; + 5453 1 67.92 19.24 0 0 5 0.9967829 -65.197586 161 17 1.1 0.9 1555.4000 -224.3900 0.0000 0.0000; + 5454 1 47.76 13.53 0 0 5 1.0027612 -65.598732 161 16 1.1 0.9 209.0100 36.9700 0.0000 0.0000; + 5455 1 9.47 2.68 0 0 5 0.9965209 -61.244066 161 12 1.1 0.9 187.2900 23.4600 0.0000 0.0000; + 5456 1 12.62 3.58 0 0 5 1.0187582 -47.965121 161 15 1.1 0.9 30.1000 1.6400 0.0000 0.0000; + 5457 1 103.54 29.34 0 0 5 0.9929463 -69.139385 161 17 1.1 0.9 223.1000 21.6800 0.0000 0.0000; + 5458 1 0 0 0 0 5 1.0105444 -53.522281 161 13 1.1 0.9 143.8100 13.4500 0.0000 0.0000; + 5459 1 0 0 0 0 5 1.0108119 -54.969414 115 13 1.1 0.9 274.3300 38.9000 0.0000 0.0000; + 5460 1 14.16 4.01 0 0 5 0.9928965 -57.73247 115 13 1.1 0.9 279.7400 40.7200 0.0000 0.0000; + 5461 1 72.8 20.63 0 0 5 1.0074313 -53.253612 161 13 1.1 0.9 43.5700 3.9400 0.0000 0.0000; + 5462 1 86.05 24.38 0 0 5 0.9939025 -69.251427 161 16 1.1 0.9 318.6100 37.5500 0.0000 0.0000; + 5463 1 160.33 45.43 0 0 5 0.992277 -70.395346 161 17 1.1 0.9 288.4500 30.5300 0.0000 0.0000; + 5464 1 0 0 0 0 5 1.0077144 -63.670182 500 16 1.1 0.9 128.8100 13.9300 0.0000 0.0000; + 5465 1 218.17 61.81 0 0 5 1.0110945 -67.474058 161 16 1.1 0.9 196.1700 19.5500 0.0000 0.0000; + 5466 1 7.44 2.11 0 0 5 1.0031814 -56.125279 161 13 1.1 0.9 38.3400 1.8400 0.0000 0.0000; + 5467 1 28.23 8 0 0 5 0.9986114 -70.533813 161 16 1.1 0.9 487.5000 26.3300 0.0000 0.0000; + 5468 1 42.13 11.94 0 0 5 0.9938499 -69.411778 161 17 1.1 0.9 394.4600 36.2600 0.0000 0.0000; + 5469 1 8.5 2.41 0 0 5 0.9927451 -68.455691 161 17 1.1 0.9 346.2400 -30.5100 0.0000 0.0000; + 5470 1 70.52 19.98 0 0 5 1.0090765 -57.327359 161 13 1.1 0.9 38.7100 1.8400 0.0000 0.0000; + 5471 1 1.44 0.41 0 0 5 1.0220386 -53.315702 161 12 1.1 0.9 40.2900 1.2200 0.0000 0.0000; + 5472 1 4.57 1.29 0 0 5 1.0004865 -45.751109 161 15 1.1 0.9 -133.4300 71.0500 0.0000 0.0000; + 5473 1 4.03 1.14 0 0 5 1.000825 -59.732954 161 18 1.1 0.9 908.9800 -237.4200 0.0000 0.0000; + 5474 1 3.11 0.88 0 0 5 0.9972705 -59.593273 161 14 1.1 0.9 109.7500 18.7300 0.0000 0.0000; + 5475 1 59.28 16.8 0 0 5 0.9961808 -67.892082 161 17 1.1 0.9 881.9400 -108.0200 0.0000 0.0000; + 5476 1 10.97 3.11 0 0 5 0.9901986 -62.192548 161 14 1.1 0.9 94.5000 13.3700 0.0000 0.0000; + 5477 1 79.03 22.39 0 0 5 1.0119711 -55.226426 161 13 1.1 0.9 36.5300 0.3800 0.0000 0.0000; + 5478 1 137.94 39.08 0 120 5 0.9966846 -69.829052 161 17 1.1 0.9 291.3600 31.6800 0.0000 0.0000; + 5479 1 0 0 0 0 5 1.0041888 -61.585248 500 17 1.1 0.9 101.2100 10.8700 0.0000 0.0000; + 5480 1 179.23 50.78 0 0 5 0.9941285 -65.11181 161 17 1.1 0.9 141.9000 14.7700 0.0000 0.0000; + 5481 1 58.18 16.49 0 0 5 0.9880417 -66.466133 161 17 1.1 0.9 347.2000 -17.1000 0.0000 0.0000; + 5482 1 69.18 19.6 0 260 5 1.0064908 -71.268309 161 16 1.1 0.9 425.9500 25.3800 0.0000 0.0000; + 5483 1 84.63 23.98 0 0 5 1.0059034 -67.846243 161 17 1.1 0.9 188.5400 19.2200 0.0000 0.0000; + 5484 1 6.29 1.78 0 0 5 1.0186841 -44.095725 161 15 1.1 0.9 38.2500 -4.7500 0.0000 0.0000; + 5485 1 4.69 1.33 0 0 5 1.0105305 -59.828799 161 14 1.1 0.9 39.1700 -1.3900 0.0000 0.0000; + 6001 1 103.81 29.41 0 237.22 6 1.030003 -56.814833 115 22 1.1 0.9 -9.4200 0.0000 0.0000 0.0000; + 6002 1 32.48 9.2 0 0 6 1.010498 -56.781966 115 26 1.1 0.9 421.0500 72.5600 0.0000 0.0000; + 6003 1 0 0 0 0 6 1.0317175 -46.230903 500 25 1.1 0.9 22.2800 -2.4300 0.0000 0.0000; + 6004 1 0 0 0 0 6 1.0193868 -42.657652 230 25 1.1 0.9 68.3200 5.5600 0.0000 0.0000; + 6005 1 75.48 21.39 0 0 6 1.0225736 -45.862614 115 25 1.1 0.9 196.3400 16.4000 0.0000 0.0000; + 6006 2 0 0 0 0 6 1.0400033 -44.831844 13.8 25 1.1 0.9 22.3700 0.0000 0.0000 0.0000; + 6007 2 0 0 0 0 6 1.0317175 -46.230903 13.8 25 1.1 0.9 22.2800 -2.4300 0.0000 0.0000; + 6008 2 0 0 0 0 6 1.0400033 -44.710648 13.8 25 1.1 0.9 22.3600 0.0000 0.0000 0.0000; + 6009 2 0 0 0 0 6 1.0400033 -43.682884 13.8 25 1.1 0.9 22.4000 0.0000 0.0000 0.0000; + 6010 2 0 0 0 0 6 1.0400033 -44.462254 13.8 25 1.1 0.9 22.3800 0.0000 0.0000 0.0000; + 6011 1 24.02 6.81 0 0 6 1.0128716 -52.277527 115 22 1.1 0.9 380.7300 41.0500 0.0000 0.0000; + 6012 1 13.51 3.83 0 93.73 6 1.0300031 -49.68929 115 25 1.1 0.9 372.3100 0.0000 0.0000 0.0000; + 6013 1 94.89 26.89 0 0 6 0.9945611 -57.786549 115 26 1.1 0.9 182.7100 22.2000 0.0000 0.0000; + 6014 1 5.51 1.56 0 0 6 1.0198763 -51.686553 115 24 1.1 0.9 717.8000 0.1900 0.0000 0.0000; + 6015 1 24.76 7.02 0 0 6 1.0089739 -56.102889 115 26 1.1 0.9 80.9000 15.8200 0.0000 0.0000; + 6016 1 176.43 49.99 0 0 6 1.0116521 -56.882593 115 26 1.1 0.9 193.1800 19.8300 0.0000 0.0000; + 6017 1 83.31 23.6 0 0 6 1.0073344 -55.146053 115 22 1.1 0.9 188.7100 -1.8800 0.0000 0.0000; + 6018 1 2.46 0.7 0 0 6 0.9932218 -56.520985 115 23 1.1 0.9 634.7600 147.1800 0.0000 0.0000; + 6019 1 59.07 16.74 0 0 6 0.9925 -57.188199 115 23 1.1 0.9 866.1400 129.1700 0.0000 0.0000; + 6020 1 16.53 4.68 0 0 6 1.0191373 -51.501554 115 23 1.1 0.9 37.4800 11.9200 0.0000 0.0000; + 6021 1 0 0 0 0 6 1.0273193 -48.908428 500 23 1.1 0.9 12.3400 -7.4500 0.0000 0.0000; + 6022 1 0 0 0 0 6 1.0161758 -51.604236 230 23 1.1 0.9 6.0900 -11.2400 0.0000 0.0000; + 6023 1 132.89 37.65 0 0 6 1.0004502 -55.381404 115 23 1.1 0.9 115.1100 40.7200 0.0000 0.0000; + 6024 1 84.99 24.08 0 250 6 1.0232905 -58.943677 115 23 1.1 0.9 1081.2400 68.7200 0.0000 0.0000; + 6025 1 64.63 18.31 0 370.2 6 1.030003 -57.140574 115 26 1.1 0.9 232.8200 0.0000 0.0000 0.0000; + 6026 1 22.12 6.27 0 0 6 1.0015763 -55.937232 115 26 1.1 0.9 114.9500 16.9500 0.0000 0.0000; + 6027 1 64.98 18.41 0 0 6 1.0180984 -52.389137 115 23 1.1 0.9 521.0200 31.5800 0.0000 0.0000; + 6028 1 103.35 29.28 0 0 6 0.9915569 -56.933238 115 23 1.1 0.9 132.9700 23.4600 0.0000 0.0000; + 6029 1 6.98 1.98 0 0 6 1.0211262 -46.553131 115 24 1.1 0.9 72.9600 3.3900 0.0000 0.0000; + 6030 1 0 0 0 0 6 1.0161134 -35.794559 230 24 1.1 0.9 85.7200 10.2600 0.0000 0.0000; + 6031 1 29.18 8.27 0 0 6 1.0120026 -38.444333 115 24 1.1 0.9 121.4600 22.3300 0.0000 0.0000; + 6032 1 36.4 10.31 0 0 6 0.99853 -59.542182 115 23 1.1 0.9 1145.2000 63.9300 0.0000 0.0000; + 6033 1 0 0 0 0 6 1.0168878 -50.644545 500 23 1.1 0.9 -7.7800 -12.4900 0.0000 0.0000; + 6034 1 0 0 0 0 6 1.0065201 -52.809688 230 23 1.1 0.9 -6.5600 -14.7100 0.0000 0.0000; + 6035 1 206.37 58.47 0 0 6 0.9956221 -55.833868 115 23 1.1 0.9 765.2900 139.2000 0.0000 0.0000; + 6036 1 0 0 0 0 6 1.0136542 -51.724249 230 22 1.1 0.9 50.4300 10.2100 0.0000 0.0000; + 6037 1 147.53 41.8 0 0 6 1.009548 -54.409134 115 22 1.1 0.9 138.7300 18.0300 0.0000 0.0000; + 6038 1 0 0 0 0 6 1.0258275 -49.217997 500 23 1.1 0.9 -1.8900 -12.0400 0.0000 0.0000; + 6039 1 0 0 0 0 6 1.0071441 -53.051146 230 23 1.1 0.9 -126.0300 -61.8200 0.0000 0.0000; + 6040 1 80.78 22.89 0 0 6 0.9937083 -56.940059 115 23 1.1 0.9 892.6100 131.9700 0.0000 0.0000; + 6041 2 0 0 0 0 6 1.0298227 -49.22244 13.8 23 1.1 0.9 -1.6400 -11.9500 0.0000 0.0000; + 6042 2 0 0 0 0 6 1.0400032 -49.228717 13.8 23 1.1 0.9 -0.5700 0.0000 0.0000 0.0000; + 6043 1 148.3 42.02 0 0 6 0.9993195 -55.445936 115 26 1.1 0.9 55.5600 14.0400 0.0000 0.0000; + 6044 1 18.3 5.18 0 0 6 0.9977212 -56.723462 115 26 1.1 0.9 166.4800 3.3000 0.0000 0.0000; + 6045 1 0 0 0 0 6 1.0261295 -48.861035 500 26 1.1 0.9 46.6000 6.5500 0.0000 0.0000; + 6046 1 0 0 0 0 6 1.0204439 -51.974847 230 26 1.1 0.9 106.6700 19.6400 0.0000 0.0000; + 6047 1 149.85 42.46 0 0 6 1.014223 -56.433836 115 26 1.1 0.9 283.1600 48.9200 0.0000 0.0000; + 6048 2 0 0 0 0 6 1.0261295 -48.861035 13.8 26 1.1 0.9 46.6000 6.5500 0.0000 0.0000; + 6049 2 0 0 0 0 6 1.0261295 -48.861035 13.8 26 1.1 0.9 46.6000 6.5500 0.0000 0.0000; + 6050 2 0 0 0 0 6 1.0261295 -48.861035 13.8 26 1.1 0.9 46.6000 6.5500 0.0000 0.0000; + 6051 2 0 0 0 0 6 1.0334103 -48.080938 13.8 26 1.1 0.9 46.4000 6.4500 0.0000 0.0000; + 6052 2 0 0 0 0 6 1.0261295 -48.861035 13.8 26 1.1 0.9 46.6000 6.5500 0.0000 0.0000; + 6053 2 0 0 0 0 6 1.0344124 -47.962543 13.8 26 1.1 0.9 46.3800 6.4400 0.0000 0.0000; + 6054 2 0 0 0 0 6 1.0400031 -47.158437 13.8 26 1.1 0.9 46.1800 6.3500 0.0000 0.0000; + 6055 1 4.93 1.4 0 0 6 1.0256681 -58.7195 115 26 1.1 0.9 322.1900 28.3400 0.0000 0.0000; + 6056 1 0 0 0 0 6 1.0245988 -46.460691 500 22 1.1 0.9 14.1200 -3.8800 0.0000 0.0000; + 6057 1 0 0 0 0 6 1.0192377 -49.311882 230 22 1.1 0.9 -66.3800 -29.6600 0.0000 0.0000; + 6058 1 178.64 50.61 0 0 6 1.0117268 -51.635948 115 22 1.1 0.9 746.0000 119.5100 0.0000 0.0000; + 6059 1 3.44 0.97 0 0 6 1.0261482 -55.36071 115 26 1.1 0.9 7.6600 0.9400 0.0000 0.0000; + 6060 1 74.53 21.12 0 0 6 1.008518 -57.819353 115 26 1.1 0.9 366.9900 46.5200 0.0000 0.0000; + 6061 1 147.9 41.91 0 0 6 0.990086 -57.706401 115 23 1.1 0.9 808.2300 132.0200 0.0000 0.0000; + 6062 1 0 0 0 0 6 1.0188419 -33.514735 500 25 1.1 0.9 50.1500 2.4100 0.0000 0.0000; + 6063 1 0 0 0 0 6 1.015382 -36.520879 230 25 1.1 0.9 77.7300 18.8500 0.0000 0.0000; + 6064 1 82.48 23.37 0 0 6 1.0087123 -39.746879 115 25 1.1 0.9 260.0600 106.4600 0.0000 0.0000; + 6065 1 14.86 4.21 0 0 6 0.9976626 -56.712888 115 23 1.1 0.9 98.5000 28.6800 0.0000 0.0000; + 6066 1 0 0 0 0 6 1.0262024 -47.070259 500 22 1.1 0.9 17.7300 -2.4400 0.0000 0.0000; + 6067 1 0 0 0 0 6 1.0199111 -49.389692 230 22 1.1 0.9 14.8700 -8.2300 0.0000 0.0000; + 6068 1 0 0 0 0 6 1.0127663 -53.218284 115 22 1.1 0.9 178.2000 12.1300 0.0000 0.0000; + 6069 2 0 0 0 0 6 1.0300031 -46.258545 18 22 1.1 0.9 17.8300 0.0000 0.0000 0.0000; + 6070 2 0 0 0 0 6 1.0300031 -44.977753 18 22 1.1 0.9 17.8900 0.0000 0.0000 0.0000; + 6071 2 0 0 0 0 6 1.0300031 -46.519631 18 22 1.1 0.9 17.8100 0.0000 0.0000 0.0000; + 6072 2 0 0 0 0 6 1.0262024 -47.070259 18 22 1.1 0.9 17.7300 -2.4400 0.0000 0.0000; + 6073 2 0 0 0 0 6 1.0300031 -45.923337 18 22 1.1 0.9 17.8400 0.0000 0.0000 0.0000; + 6074 2 0 0 0 0 6 1.0300031 -45.934448 18 22 1.1 0.9 17.8500 0.0000 0.0000 0.0000; + 6075 1 0 0 0 0 6 1.0200064 -31.994195 500 25 1.1 0.9 18.5000 -6.1200 0.0000 0.0000; + 6076 1 0 0 0 0 6 1.0208114 -34.179251 230 25 1.1 0.9 -15.5200 -13.3300 0.0000 0.0000; + 6077 1 0 0 0 0 6 1.0204816 -36.265067 115 25 1.1 0.9 1364.7400 -20.3200 0.0000 0.0000; + 6078 2 0 0 0 0 6 1.0113648 -28.900691 22 25 1.1 0.9 19.2900 -11.9300 0.0000 0.0000; + 6079 2 0 0 0 0 6 1.016481 -31.005485 22 25 1.1 0.9 18.7500 -6.1700 0.0000 0.0000; + 6080 2 0 0 0 0 6 1.0149714 -30.643862 22 25 1.1 0.9 18.8900 -6.2000 0.0000 0.0000; + 6081 1 0 0 0 0 6 1.0231031 -50.602648 115 23 1.1 0.9 1.0300 6.5000 0.0000 0.0000; + 6082 2 0 0 0 0 6 1.0400032 -48.051269 13.8 23 1.1 0.9 -0.0000 0.0000 0.0000 0.0000; + 6083 2 0 0 0 0 6 1.0400032 -41.702435 13.8 23 1.1 0.9 0.3000 0.0000 0.0000 0.0000; + 6084 1 0 0 0 0 6 1.0055868 -55.175793 115 23 1.1 0.9 207.8200 18.1400 0.0000 0.0000; + 6085 2 0 0 0 0 6 1.0056893 -54.906322 13.8 23 1.1 0.9 207.6100 18.1500 0.0000 0.0000; + 6086 2 0 0 0 0 6 1.0057247 -52.458509 13.8 23 1.1 0.9 205.5700 18.2500 0.0000 0.0000; + 6087 2 0 0 0 0 6 1.0055868 -55.175793 13.8 23 1.1 0.9 207.8200 18.1400 0.0000 0.0000; + 6088 2 0 0 0 0 6 1.0057899 -54.750193 13.8 23 1.1 0.9 207.4600 18.1500 0.0000 0.0000; + 6089 2 0 0 0 0 6 1.0058132 -53.660374 13.8 23 1.1 0.9 206.6200 18.1800 0.0000 0.0000; + 6090 2 0 0 0 0 6 1.0057837 -53.462654 13.8 23 1.1 0.9 206.4700 18.1900 0.0000 0.0000; + 6091 1 37.81 10.71 0 80 6 1.0091043 -58.394171 115 23 1.1 0.9 1381.7800 -2616.6800 0.0000 0.0000; + 6092 1 35.66 10.1 0 45.74 6 1.0300029 -47.948515 115 24 1.1 0.9 392.4100 0.0000 0.0000 0.0000; + 6093 1 40.54 11.49 0 0 6 1.0010975 -55.986895 115 22 1.1 0.9 290.2900 7.9200 0.0000 0.0000; + 6094 1 67.98 19.26 0 0 6 1.008691 -55.523976 115 22 1.1 0.9 182.5500 20.7800 0.0000 0.0000; + 6095 1 68.37 19.37 0 0 6 1.0045511 -57.447605 115 23 1.1 0.9 1149.4000 -26.8400 0.0000 0.0000; + 6096 1 25.78 7.3 0 78.21 6 1.030003 -53.258 115 24 1.1 0.9 650.3500 0.0000 0.0000 0.0000; + 6097 1 105.36 29.85 0 0 6 0.9988241 -56.518873 115 26 1.1 0.9 189.6500 5.1800 0.0000 0.0000; + 6098 1 132.22 37.46 0 0 6 0.9843412 -58.212244 115 23 1.1 0.9 747.2300 123.0600 0.0000 0.0000; + 6099 1 21.38 6.06 0 0 6 0.9989914 -56.693502 115 26 1.1 0.9 68.9300 14.5900 0.0000 0.0000; + 6100 1 37.71 10.69 0 0 6 1.0018955 -56.836141 115 22 1.1 0.9 54.1600 2.9700 0.0000 0.0000; + 6101 1 0 0 0 0 6 1.0227101 -32.992678 500 25 1.1 0.9 23.3900 -4.9400 0.0000 0.0000; + 6102 1 0 0 0 0 6 1.0211555 -36.129246 230 25 1.1 0.9 33.2400 -2.1500 0.0000 0.0000; + 6103 1 34.21 9.69 0 59.34 6 1.030003 -41.898554 115 25 1.1 0.9 99.9500 0.0000 0.0000 0.0000; + 6104 2 0 0 0 0 6 1.0300374 -32.202723 13.8 25 1.1 0.9 23.5300 -4.8700 0.0000 0.0000; + 6105 2 0 0 0 0 6 1.0342798 -31.724842 13.8 25 1.1 0.9 23.6200 -4.8300 0.0000 0.0000; + 6106 2 0 0 0 0 6 1.0286262 -32.365809 13.8 25 1.1 0.9 23.5000 -4.8800 0.0000 0.0000; + 6107 1 0 0 0 0 6 1.0309046 -47.758473 500 25 1.1 0.9 18.4600 -2.9200 0.0000 0.0000; + 6108 1 0 0 0 0 6 1.0113783 -47.779789 230 25 1.1 0.9 31.0400 2.9500 0.0000 0.0000; + 6109 1 14.44 4.09 0 0 6 1.0061778 -50.633128 115 25 1.1 0.9 64.0100 18.0000 0.0000 0.0000; + 6110 2 0 0 0 0 6 1.0400034 -46.028454 13.8 25 1.1 0.9 18.7400 0.0000 0.0000 0.0000; + 6111 2 0 0 0 0 6 1.0400034 -46.087286 13.8 25 1.1 0.9 18.7700 0.0000 0.0000 0.0000; + 6112 1 16.16 4.58 0 0 6 1.0031137 -54.957382 115 26 1.1 0.9 66.8500 16.4100 0.0000 0.0000; + 6113 1 20.52 5.81 0 0 6 0.9896233 -57.586058 115 23 1.1 0.9 838.0100 133.8600 0.0000 0.0000; + 6114 1 70.54 19.99 0 0 6 0.9907242 -58.261205 115 26 1.1 0.9 1186.1500 322.6400 0.0000 0.0000; + 6115 1 131.13 37.15 0 0 6 0.9982816 -56.994334 115 22 1.1 0.9 337.5300 -35.8800 0.0000 0.0000; + 6116 1 56.85 16.11 0 0 6 0.9977359 -58.063467 115 23 1.1 0.9 1010.4500 41.5700 0.0000 0.0000; + 6117 1 27.2 7.71 0 0 6 1.02423 -44.252919 115 25 1.1 0.9 152.5300 10.2800 0.0000 0.0000; + 6118 1 0 0 0 0 6 1.0267593 -49.347787 500 23 1.1 0.9 10.6300 -8.3000 0.0000 0.0000; + 6119 1 0 0 0 0 6 1.0096663 -52.838702 230 23 1.1 0.9 70.4200 10.2300 0.0000 0.0000; + 6120 1 195.3 55.33 0 0 6 0.9984039 -56.0602 115 23 1.1 0.9 278.3000 71.3200 0.0000 0.0000; + 6121 1 120.8 34.23 0 0 6 1.0091454 -56.646212 115 26 1.1 0.9 290.3300 -15.8900 0.0000 0.0000; + 6122 1 22.71 6.43 0 0 6 1.0107884 -39.261591 115 24 1.1 0.9 452.3900 71.9800 0.0000 0.0000; + 6123 1 45.11 12.78 0 0 6 0.9869161 -57.487821 115 23 1.1 0.9 752.3400 133.0200 0.0000 0.0000; + 6124 1 57.42 16.27 0 0 6 1.0054779 -53.812102 115 22 1.1 0.9 633.2700 107.1500 0.0000 0.0000; + 6125 1 2.59 0.73 0 0 6 0.9996087 -54.066899 115 22 1.1 0.9 57.9300 2.2900 0.0000 0.0000; + 6126 1 50.38 14.27 0 0 6 0.9938512 -56.948725 115 23 1.1 0.9 214.5200 37.9700 0.0000 0.0000; + 6127 1 25.24 7.15 0 9.38 6 1.0017935 -52.624558 115 25 1.1 0.9 126.0700 21.6200 0.0000 0.0000; + 6128 1 52.8 14.96 0 0 6 0.994906 -58.271377 115 26 1.1 0.9 140.1000 16.6200 0.0000 0.0000; + 6129 1 9.86 2.79 0 0 6 1.0032534 -57.183234 115 26 1.1 0.9 729.9400 86.5600 0.0000 0.0000; + 6130 1 13.4 3.8 0 0 6 0.9957144 -56.636013 115 23 1.1 0.9 268.2500 54.9000 0.0000 0.0000; + 6131 1 43.85 12.43 0 0 6 0.9938605 -57.224799 115 22 1.1 0.9 1612.6100 622.3300 0.0000 0.0000; + 6132 1 64.74 18.34 0 0 6 0.9833626 -58.478369 115 23 1.1 0.9 1468.7900 154.0700 0.0000 0.0000; + 6133 1 10.44 2.96 0 0 6 1.0173988 -49.727871 115 25 1.1 0.9 772.4300 -6.3700 0.0000 0.0000; + 6134 1 7.62 2.16 0 0 6 1.0195404 -57.23997 115 23 1.1 0.9 562.1100 24.2300 0.0000 0.0000; + 6135 1 21.71 6.15 0 0 6 1.0075467 -37.706132 115 25 1.1 0.9 1308.4100 -1.2000 0.0000 0.0000; + 6136 1 71.18 20.17 0 0 6 1.0108688 -57.357693 115 23 1.1 0.9 463.4800 29.6400 0.0000 0.0000; + 6137 1 42.18 11.95 0 0 6 0.984582 -59.478922 115 23 1.1 0.9 1344.9900 99.7800 0.0000 0.0000; + 6138 1 27.68 7.84 0 0 6 1.0118154 -59.036871 115 26 1.1 0.9 345.3100 45.4200 0.0000 0.0000; + 6139 1 9.61 2.72 0 0 6 1.0122037 -52.58389 115 25 1.1 0.9 716.4000 22.6700 0.0000 0.0000; + 6140 1 11.69 3.31 0 0 6 1.0137125 -56.23386 115 23 1.1 0.9 416.6800 35.4000 0.0000 0.0000; + 6141 1 0 0 0 0 6 1.0261424 -46.137656 500 22 1.1 0.9 18.3400 2.8700 0.0000 0.0000; + 6142 1 0 0 0 0 6 1.0192444 -49.676188 230 22 1.1 0.9 -29.3000 10.3400 0.0000 0.0000; + 6143 1 0 0 0 0 6 1.0171234 -53.174288 115 22 1.1 0.9 -198.8200 29.0800 0.0000 0.0000; + 6144 2 0 0 0 0 6 1.0261424 -46.137656 13.8 22 1.1 0.9 18.3400 2.8700 0.0000 0.0000; + 6145 2 0 0 0 0 6 1.030003 -43.010431 13.8 22 1.1 0.9 18.2500 0.0000 0.0000 0.0000; + 6146 2 0 0 0 0 6 1.030003 -43.125807 13.8 22 1.1 0.9 18.2500 0.0000 0.0000 0.0000; + 6147 2 0 0 0 0 6 1.030003 -43.847572 13.8 22 1.1 0.9 18.1700 0.0000 0.0000 0.0000; + 6148 2 0 0 0 0 6 1.0261424 -46.137656 13.8 22 1.1 0.9 18.3400 2.8700 0.0000 0.0000; + 6149 2 0 0 0 0 6 1.030003 -45.575601 13.8 22 1.1 0.9 18.2800 0.0000 0.0000 0.0000; + 6150 1 117.27 33.23 0 0 6 1.0185698 -57.565766 115 26 1.1 0.9 259.7100 25.5200 0.0000 0.0000; + 6151 1 16.14 4.57 0 55.01 6 1.0300029 -43.056652 115 25 1.1 0.9 912.1300 0.0000 0.0000 0.0000; + 6152 1 0 0 0 0 6 1.0182455 -52.786732 230 26 1.1 0.9 94.5600 2.3900 0.0000 0.0000; + 6153 1 107.97 30.59 0 0 6 0.9965087 -54.909299 115 26 1.1 0.9 390.5200 -34.6700 0.0000 0.0000; + 6154 1 43.1 12.21 0 0 6 0.9974214 -56.013124 115 23 1.1 0.9 131.0400 26.7000 0.0000 0.0000; + 6155 1 37.02 10.49 0 0 6 0.9934379 -55.854394 115 26 1.1 0.9 45.7000 18.6200 0.0000 0.0000; + 6156 1 52.66 14.92 0 0 6 1.0162741 -51.472445 115 23 1.1 0.9 870.1900 31.7800 0.0000 0.0000; + 6157 1 28.81 8.16 0 0 6 1.0056316 -58.780755 115 26 1.1 0.9 359.2300 48.6300 0.0000 0.0000; + 6158 1 5.64 1.6 0 66.9 6 1.0296053 -43.109524 115 25 1.1 0.9 583.8100 0.0000 0.0000 0.0000; + 6159 1 91.04 25.79 0 0 6 1.0066373 -56.025468 115 22 1.1 0.9 194.1900 -10.3900 0.0000 0.0000; + 6160 1 98.28 27.85 0 0 6 0.9898856 -57.253665 115 23 1.1 0.9 718.1900 148.7800 0.0000 0.0000; + 6161 1 0 0 0 0 6 1.0255902 -45.256391 500 22 1.1 0.9 16.0800 -2.0900 0.0000 0.0000; + 6162 1 0 0 0 0 6 1.0216693 -48.821253 230 22 1.1 0.9 -0.7400 -10.1600 0.0000 0.0000; + 6163 1 0 0 0 0 6 1.0154167 -51.3408 115 22 1.1 0.9 523.2500 61.0900 0.0000 0.0000; + 6164 2 0 0 0 0 6 1.030003 -44.619446 13.8 22 1.1 0.9 16.1300 0.0000 0.0000 0.0000; + 6165 2 0 0 0 0 6 1.030003 -44.547378 13.8 22 1.1 0.9 16.1400 0.0000 0.0000 0.0000; + 6166 2 0 0 0 0 6 1.030003 -44.959527 13.8 22 1.1 0.9 16.1200 0.0000 0.0000 0.0000; + 6167 2 0 0 0 0 6 1.030003 -44.699009 13.8 22 1.1 0.9 16.1300 0.0000 0.0000 0.0000; + 6168 1 138.23 39.17 0 0 6 0.9984947 -57.829652 115 26 1.1 0.9 239.9800 32.0100 0.0000 0.0000; + 6169 1 0 0 0 0 6 1.0286209 -45.784469 500 26 1.1 0.9 31.2100 0.8900 0.0000 0.0000; + 6170 1 0 0 0 0 6 1.0229032 -49.983069 230 26 1.1 0.9 18.6700 -0.2800 0.0000 0.0000; + 6171 1 113.76 32.23 0 0 6 1.0095233 -53.162529 115 26 1.1 0.9 38.6100 8.3500 0.0000 0.0000; + 6172 1 0 0 0 0 6 1.0146463 -36.638151 230 24 1.1 0.9 102.5400 12.1500 0.0000 0.0000; + 6173 1 35.48 10.05 0 0 6 1.0152227 -38.823805 115 24 1.1 0.9 144.8700 20.0600 0.0000 0.0000; + 6174 1 95.75 27.13 0 0 6 1.0052281 -56.8548 115 22 1.1 0.9 659.5700 -163.3300 0.0000 0.0000; + 6175 1 96.6 27.37 0 0 6 0.9884029 -57.675849 115 23 1.1 0.9 796.4200 133.3500 0.0000 0.0000; + 6176 1 45.32 12.84 0 0 6 1.0021531 -56.409849 115 23 1.1 0.9 163.2800 27.3100 0.0000 0.0000; + 6177 1 0 0 0 409.4 6 1.030003 -51.894768 230 26 1.1 0.9 -23.2000 0.0000 0.0000 0.0000; + 6178 1 134.45 38.09 0 0 6 1.0155585 -55.001773 115 26 1.1 0.9 1123.1200 198.5600 0.0000 0.0000; + 6179 1 11.85 3.36 0 0 6 1.0104727 -56.749683 115 26 1.1 0.9 337.9200 38.1300 0.0000 0.0000; + 6180 1 34.14 9.67 0 0 6 0.9973509 -55.388246 115 22 1.1 0.9 56.6800 2.5700 0.0000 0.0000; + 6181 1 49.13 13.92 0 0 6 1.0102369 -56.710505 115 23 1.1 0.9 851.9000 67.0100 0.0000 0.0000; + 6182 1 95.83 27.15 0 0 6 0.9988885 -58.181536 115 26 1.1 0.9 211.4200 8.7200 0.0000 0.0000; + 6183 1 26.97 7.64 0 0 6 1.0163648 -43.348566 115 25 1.1 0.9 93.9200 3.3300 0.0000 0.0000; + 6184 1 48.39 13.71 0 0 6 0.9873133 -58.501773 115 23 1.1 0.9 419.9600 86.3800 0.0000 0.0000; + 6185 1 20.84 5.9 0 0 6 0.989699 -58.295692 115 23 1.1 0.9 556.7000 80.8800 0.0000 0.0000; + 6186 1 39.37 11.15 0 0 6 0.9953878 -56.715288 115 23 1.1 0.9 998.5900 140.0200 0.0000 0.0000; + 6187 1 80.44 22.79 0 0 6 0.9927893 -57.283893 115 23 1.1 0.9 948.8400 130.3200 0.0000 0.0000; + 6188 1 0 0 0 0 6 1.018473 -33.593582 230 25 1.1 0.9 39.2300 4.6000 0.0000 0.0000; + 6189 1 27.37 7.75 0 0 6 1.0163245 -36.304637 115 25 1.1 0.9 481.0900 59.8200 0.0000 0.0000; + 6190 1 18.47 5.23 0 0 6 1.0195159 -46.822077 115 24 1.1 0.9 841.6400 -8.5600 0.0000 0.0000; + 6191 1 16.77 4.75 0 0 6 1.00069 -55.936835 115 22 1.1 0.9 377.8300 9.7400 0.0000 0.0000; + 6192 1 0 0 0 0 6 1.0090611 -43.072088 230 25 1.1 0.9 57.0400 11.5500 0.0000 0.0000; + 6193 1 35.69 10.11 0 0 6 1.0044604 -44.860111 115 25 1.1 0.9 72.3100 12.0800 0.0000 0.0000; + 6194 1 44.42 12.59 0 0 6 0.993237 -56.350042 115 23 1.1 0.9 628.9900 89.2900 0.0000 0.0000; + 6195 1 2.66 0.75 0 0 6 0.9951812 -39.220054 115 25 1.1 0.9 1206.1200 32.1800 0.0000 0.0000; + 6196 1 21.28 6.03 0 0 6 1.0063642 -55.324926 115 23 1.1 0.9 642.6800 46.1800 0.0000 0.0000; + 6197 1 0 0 0 0 6 1.023295 -48.40975 500 26 1.1 0.9 33.9000 5.7500 0.0000 0.0000; + 6198 1 0 0 0 0 6 1.0150387 -52.962708 230 26 1.1 0.9 110.0100 15.4700 0.0000 0.0000; + 6199 1 239.74 67.93 0 0 6 1.013068 -55.72182 115 26 1.1 0.9 161.7900 19.8000 0.0000 0.0000; + 6200 1 46.28 13.11 0 0 6 0.9926281 -57.011147 115 26 1.1 0.9 255.5300 -25.0300 0.0000 0.0000; + 6201 1 39.07 11.07 0 0 6 1.0067347 -58.266373 115 26 1.1 0.9 260.6900 -2.4700 0.0000 0.0000; + 6202 1 16.63 4.71 0 0 6 1.0167792 -52.332174 115 22 1.1 0.9 629.6400 36.1900 0.0000 0.0000; + 6203 1 117.59 33.32 0 0 6 0.9963022 -57.638171 115 26 1.1 0.9 413.1300 -58.2700 0.0000 0.0000; + 6204 1 7.81 2.21 0 0 6 0.9997981 -56.880824 115 26 1.1 0.9 141.2200 11.4000 0.0000 0.0000; + 6205 1 121.95 34.55 0 0 6 0.9896711 -57.01324 115 23 1.1 0.9 19.6200 6.2400 0.0000 0.0000; + 6206 1 18.83 5.34 0 0 6 1.0078807 -44.435266 115 25 1.1 0.9 84.4300 7.4700 0.0000 0.0000; + 6207 1 29.32 8.31 0 155.15 6 1.0300032 -58.145835 115 23 1.1 0.9 920.8600 0.0000 0.0000 0.0000; + 6208 1 140.96 39.94 0 0 6 0.9889471 -58.415843 115 23 1.1 0.9 731.2600 101.4400 0.0000 0.0000; + 6209 1 7.52 2.13 0 0 6 1.0100542 -55.776182 115 26 1.1 0.9 826.8100 135.5900 0.0000 0.0000; + 6210 1 0 0 0 0 6 1.0348101 -46.19123 500 23 1.1 0.9 21.1700 -2.3400 0.0000 0.0000; + 6211 1 0 0 0 0 6 1.0290615 -48.169626 230 23 1.1 0.9 18.5400 -4.5600 0.0000 0.0000; + 6212 1 0 0 0 0 6 1.0236419 -50.837125 115 23 1.1 0.9 27.8300 9.1100 0.0000 0.0000; + 6213 2 0 0 0 0 6 1.0400033 -41.951777 13.8 23 1.1 0.9 21.3500 0.0000 0.0000 0.0000; + 6214 2 0 0 0 0 6 1.0400033 -38.069094 13.8 23 1.1 0.9 21.4800 0.0000 0.0000 0.0000; + 6215 2 0 0 0 0 6 1.0400033 -44.107263 13.8 23 1.1 0.9 21.2700 0.0000 0.0000 0.0000; + 6216 2 0 0 0 0 6 1.0400033 -41.49862 13.8 23 1.1 0.9 21.3600 0.0000 0.0000 0.0000; + 6217 1 52.96 15.01 0 0 6 0.9881199 -59.84522 115 23 1.1 0.9 1249.9200 92.9200 0.0000 0.0000; + 6218 1 51.24 14.52 0 0 6 0.9921182 -56.374047 115 23 1.1 0.9 735.0100 237.6800 0.0000 0.0000; + 6219 1 63.93 18.11 0 0 6 0.995836 -58.320577 115 23 1.1 0.9 905.7700 99.5500 0.0000 0.0000; + 6220 1 96.5 27.34 0 0 6 1.0056706 -55.620011 115 22 1.1 0.9 190.2300 7.3500 0.0000 0.0000; + 6221 1 9.16 2.6 0 62.01 6 1.030003 -49.653699 115 22 1.1 0.9 58.7500 0.0000 0.0000 0.0000; + 6222 1 0 0 0 0 6 1.0028922 -53.683174 230 23 1.1 0.9 -31.4800 -19.9200 0.0000 0.0000; + 6223 1 166.84 47.27 0 0 6 0.9939468 -56.229863 115 23 1.1 0.9 -51.6400 -16.1000 0.0000 0.0000; + 6224 1 116.67 33.06 0 0 6 0.9868659 -58.331715 115 23 1.1 0.9 748.9400 123.9000 0.0000 0.0000; + 6225 1 85.25 24.15 0 0 6 0.9937059 -57.165421 115 26 1.1 0.9 183.7300 -3.1500 0.0000 0.0000; + 6226 1 18.02 5.11 0 0 6 1.0183211 -60.213441 115 26 1.1 0.9 312.7700 31.7200 0.0000 0.0000; + 6227 1 126.35 35.8 0 0 6 0.9874013 -57.587112 115 23 1.1 0.9 1374.3100 200.7900 0.0000 0.0000; + 6228 1 0 0 0 0 6 1.0234798 -47.196884 500 22 1.1 0.9 23.0900 -2.8600 0.0000 0.0000; + 6229 1 0 0 0 323.03 6 1.0300031 -51.32337 230 22 1.1 0.9 46.4300 0.0000 0.0000 0.0000; + 6230 1 191.51 54.26 0 0 6 1.0076853 -55.216819 115 22 1.1 0.9 107.0400 10.1000 0.0000 0.0000; + 6231 1 70.51 19.98 0 0 6 0.9900394 -56.974753 115 23 1.1 0.9 454.6600 94.5400 0.0000 0.0000; + 6232 1 66.63 18.88 0 0 6 1.0005415 -54.140983 115 23 1.1 0.9 693.3600 81.3500 0.0000 0.0000; + 6233 1 65.09 18.44 0 0 6 0.9846305 -57.791406 115 23 1.1 0.9 739.6700 142.1800 0.0000 0.0000; + 6234 1 0 0 0 0 6 1.0234382 -49.126653 500 26 1.1 0.9 36.9500 5.6800 0.0000 0.0000; + 6235 1 0 0 0 0 6 1.0214838 -50.609239 230 26 1.1 0.9 29.2900 4.2500 0.0000 0.0000; + 6236 1 169.53 48.03 0 0 6 1.0060055 -54.679523 115 26 1.1 0.9 69.7900 14.8900 0.0000 0.0000; + 6237 1 1.88 0.53 0 0 6 1.0074305 -52.97529 115 25 1.1 0.9 163.5100 28.4000 0.0000 0.0000; + 6238 1 134.8 38.19 0 0 6 0.9843392 -58.138903 115 23 1.1 0.9 1273.7000 184.7600 0.0000 0.0000; + 6239 1 0 0 0 0 6 1.0330154 -43.960776 500 22 1.1 0.9 36.5400 1.5200 0.0000 0.0000; + 6240 1 0 0 0 0 6 1.0164739 -48.325164 230 22 1.1 0.9 100.6100 6.5200 0.0000 0.0000; + 6241 1 175.73 49.79 0 0 6 0.9992721 -53.355865 115 22 1.1 0.9 281.0400 -2.9900 0.0000 0.0000; + 6242 2 0 0 0 0 6 1.040003 -42.434916 13.8 22 1.1 0.9 36.4700 0.0000 0.0000 0.0000; + 6243 2 0 0 0 0 6 1.040003 -42.083008 13.8 22 1.1 0.9 36.4500 0.0000 0.0000 0.0000; + 6244 2 0 0 0 0 6 1.040003 -41.371375 13.8 22 1.1 0.9 36.4100 0.0000 0.0000 0.0000; + 6245 2 0 0 0 0 6 1.040003 -41.774325 13.8 22 1.1 0.9 36.4300 0.0000 0.0000 0.0000; + 6246 2 0 0 0 0 6 1.040003 -42.839727 13.8 22 1.1 0.9 36.4700 0.0000 0.0000 0.0000; + 6247 2 0 0 0 0 6 1.040003 -43.121522 13.8 22 1.1 0.9 36.4800 227.0000 0.0000 0.0000; + 6248 2 0 0 0 0 6 1.040003 -42.259248 13.8 22 1.1 0.9 36.4600 0.0000 0.0000 0.0000; + 6249 2 0 0 0 0 6 1.040003 -41.499382 13.8 22 1.1 0.9 36.4000 0.0000 0.0000 0.0000; + 6250 1 86.21 24.43 0 0 6 0.9987051 -57.265007 115 22 1.1 0.9 493.8000 -101.9900 0.0000 0.0000; + 6251 1 51.25 14.52 0 0 6 0.99651 -58.668206 115 22 1.1 0.9 2422.6400 275.9100 0.0000 0.0000; + 6252 1 13.48 3.82 0 0 6 1.0095241 -53.184358 115 23 1.1 0.9 67.7400 18.9800 0.0000 0.0000; + 6253 1 13.2 3.74 0 0 6 1.0175154 -41.889868 115 24 1.1 0.9 90.3400 10.4300 0.0000 0.0000; + 6254 1 0 0 0 0 6 1.0225993 -48.701606 500 23 1.1 0.9 17.5500 -4.3800 0.0000 0.0000; + 6255 1 0 0 0 0 6 1.0149074 -50.835131 230 23 1.1 0.9 63.4500 11.4200 0.0000 0.0000; + 6256 1 18.25 5.17 0 0 6 0.998347 -55.493484 115 23 1.1 0.9 518.3800 141.9000 0.0000 0.0000; + 6257 2 0 0 0 0 6 1.0202207 -48.328889 13.8 23 1.1 0.9 17.6800 0.0000 0.0000 0.0000; + 6258 2 0 0 0 0 6 1.0200032 -47.414454 13.8 23 1.1 0.9 17.7900 0.0000 0.0000 0.0000; + 6259 2 0 0 0 0 6 1.0225993 -48.701606 13.8 23 1.1 0.9 17.5500 -4.3800 0.0000 0.0000; + 6260 2 0 0 0 0 6 1.0200032 -48.253611 13.8 23 1.1 0.9 17.6600 0.0000 0.0000 0.0000; + 6261 1 31.18 8.83 0 0 6 0.9955252 -57.993908 115 26 1.1 0.9 1199.6100 324.6400 0.0000 0.0000; + 6262 1 28.4 8.05 0 0 6 0.9958387 -56.348906 115 23 1.1 0.9 106.0800 35.3500 0.0000 0.0000; + 6263 1 0 0 0 0 6 1.0110056 -42.169113 230 24 1.1 0.9 27.9600 -5.3300 0.0000 0.0000; + 6264 1 34.97 9.91 0 0 6 1.0081809 -43.733283 115 24 1.1 0.9 875.1800 6.1100 0.0000 0.0000; + 6265 1 0 0 0 0 6 1.0178534 -39.507123 115 24 1.1 0.9 168.5700 20.5900 0.0000 0.0000; + 6266 2 0 0 0 0 6 1.022154 -38.917712 13.8 24 1.1 0.9 168.0400 20.4000 0.0000 0.0000; + 6267 2 0 0 0 0 6 1.033053 -37.37043 13.8 24 1.1 0.9 166.6100 19.9300 0.0000 0.0000; + 6268 2 0 0 0 0 6 1.0211182 -39.083091 13.8 24 1.1 0.9 168.1400 20.4300 0.0000 0.0000; + 6269 2 0 0 0 0 6 1.0340477 -37.224304 13.8 24 1.1 0.9 166.4700 19.8900 0.0000 0.0000; + 6270 2 0 0 0 0 6 1.0178534 -39.507123 13.8 24 1.1 0.9 168.5700 20.5900 0.0000 0.0000; + 6271 2 0 0 0 0 6 1.0178534 -39.507123 13.8 24 1.1 0.9 168.5700 20.5900 0.0000 0.0000; + 6272 2 0 0 0 0 6 1.0178534 -39.507123 13.8 24 1.1 0.9 168.5700 20.5900 0.0000 0.0000; + 6273 2 0 0 0 0 6 1.0178534 -39.507123 13.8 24 1.1 0.9 168.5700 20.5900 0.0000 0.0000; + 6274 2 0 0 0 0 6 1.0309912 -37.607752 13.8 24 1.1 0.9 166.9700 20.0400 0.0000 0.0000; + 6275 1 110.59 31.34 0 0 6 0.9916305 -57.042607 115 26 1.1 0.9 432.9900 -68.8800 0.0000 0.0000; + 6276 1 39.92 11.31 0 0 6 1.0020132 -58.357453 115 26 1.1 0.9 120.5300 18.4700 0.0000 0.0000; + 6277 1 0 0 0 0 6 1.0192968 -51.742692 230 23 1.1 0.9 53.8500 4.0300 0.0000 0.0000; + 6278 1 135.68 38.44 0 0 6 1.0040711 -54.981323 115 23 1.1 0.9 851.6200 285.6400 0.0000 0.0000; + 6279 1 0 0 0 0 6 1.0203919 -49.1371 230 22 1.1 0.9 -17.9900 -18.3700 0.0000 0.0000; + 6280 1 136.02 38.54 0 0 6 1.012131 -51.632799 115 22 1.1 0.9 683.7900 68.6800 0.0000 0.0000; + 6281 1 60.45 17.13 0 0 6 1.0137453 -56.524959 115 22 1.1 0.9 115.5900 -4.6600 0.0000 0.0000; + 6282 1 26.19 7.42 0 0 6 1.0217423 -55.610715 115 23 1.1 0.9 899.9300 21.4600 0.0000 0.0000; + 6283 1 6.88 1.95 0 0 6 1.0141945 -56.803257 115 22 1.1 0.9 24.7400 -1.6700 0.0000 0.0000; + 6284 1 71.09 20.14 0 0 6 1.0011896 -55.686757 115 26 1.1 0.9 37.2600 21.2500 0.0000 0.0000; + 6285 1 0 0 0 0 6 1.0210436 -55.375127 230 26 1.1 0.9 101.1800 7.4700 0.0000 0.0000; + 6286 1 82.67 23.42 0 90.7 6 1.0300031 -57.897859 115 26 1.1 0.9 326.0900 0.0000 0.0000 0.0000; + 6287 1 0 0 0 0 6 1.0122418 -52.447934 230 26 1.1 0.9 85.0900 9.3400 0.0000 0.0000; + 6288 1 166.54 47.19 0 0 6 0.9961049 -56.447697 115 26 1.1 0.9 144.0100 8.6400 0.0000 0.0000; + 6289 1 73.84 20.92 0 0 6 0.9857928 -57.937221 115 23 1.1 0.9 734.6000 124.3600 0.0000 0.0000; + 6290 1 67.61 19.16 0 0 6 0.9945737 -57.597438 115 23 1.1 0.9 506.9700 96.1200 0.0000 0.0000; + 6291 1 20.57 5.83 0 0 6 1.0119264 -56.652153 115 26 1.1 0.9 348.2300 57.5800 0.0000 0.0000; + 6292 1 0 0 0 0 6 1.0244472 -48.029047 500 23 1.1 0.9 13.2200 -6.4100 0.0000 0.0000; + 6293 1 0 0 0 0 6 1.0133925 -51.025421 230 23 1.1 0.9 -70.1000 -49.5000 0.0000 0.0000; + 6294 1 0 0 0 0 6 1.0046155 -53.414818 115 23 1.1 0.9 703.5400 80.4300 0.0000 0.0000; + 6295 2 0 0 0 0 6 1.0225307 -47.719737 13.8 23 1.1 0.9 13.2900 -6.4300 0.0000 0.0000; + 6296 2 0 0 0 0 6 1.0228017 -47.764877 13.8 23 1.1 0.9 13.2800 -6.4300 0.0000 0.0000; + 6297 2 0 0 0 0 6 1.0200032 -47.308913 13.8 23 1.1 0.9 13.3900 0.0000 0.0000 0.0000; + 6298 1 0 0 0 0 6 1.023703 -46.364217 500 22 1.1 0.9 18.4000 -3.2800 0.0000 0.0000; + 6299 1 0 0 0 0 6 1.0233727 -48.555241 230 22 1.1 0.9 66.0100 6.1000 0.0000 0.0000; + 6300 1 0 0 0 0 6 1.0152724 -50.959812 115 22 1.1 0.9 588.3200 116.7600 0.0000 0.0000; + 6301 2 0 0 0 0 6 1.023703 -46.364217 22 22 1.1 0.9 18.4000 -3.2800 0.0000 0.0000; + 6302 2 0 0 0 0 6 1.0172276 -43.425429 22 22 1.1 0.9 18.6500 -3.3300 0.0000 0.0000; + 6303 2 0 0 0 0 6 1.0218286 -45.504143 22 22 1.1 0.9 18.4700 -3.3000 0.0000 0.0000; + 6304 2 0 0 0 0 6 1.0184923 -43.898882 22 22 1.1 0.9 18.5700 -3.3200 0.0000 0.0000; + 6305 2 0 0 0 0 6 1.0173184 -43.389165 22 22 1.1 0.9 18.6500 -3.3300 0.0000 0.0000; + 6306 1 54.19 15.35 0 0 6 0.9888693 -57.2354 115 23 1.1 0.9 837.3600 141.8400 0.0000 0.0000; + 6307 1 130.73 37.04 0 0 6 0.9925605 -56.98044 115 26 1.1 0.9 151.8200 7.1300 0.0000 0.0000; + 6308 1 0 0 0 0 6 1.0239619 -51.287603 230 26 1.1 0.9 -22.4400 -12.7600 0.0000 0.0000; + 6309 1 41.1 11.65 0 0 6 1.0137735 -54.825239 115 26 1.1 0.9 861.0800 135.4900 0.0000 0.0000; + 6310 1 92.27 26.14 0 0 6 1.0103858 -55.328022 115 22 1.1 0.9 -241.1200 57.6400 0.0000 0.0000; + 6311 1 8.58 2.43 0 0 6 1.0210712 -38.691133 115 25 1.1 0.9 1212.0400 -30.5400 0.0000 0.0000; + 6312 1 45.68 12.94 0 0 6 1.0160345 -54.561126 115 22 1.1 0.9 -326.2800 57.8800 0.0000 0.0000; + 6313 1 26.29 7.45 0 0 6 0.9973457 -57.692677 115 23 1.1 0.9 704.2000 75.9800 0.0000 0.0000; + 6314 1 29.51 8.36 0 0 6 1.004168 -57.129861 115 26 1.1 0.9 437.8000 60.2100 0.0000 0.0000; + 6315 1 0 0 0 0 6 1.0135155 -52.48174 230 23 1.1 0.9 -17.5200 -15.2600 0.0000 0.0000; + 6316 1 0 0 0 0 6 1.0160058 -53.215025 161 23 1.1 0.9 28.2700 0.5900 0.0000 0.0000; + 6317 1 0 0 0 0 6 1.0055183 -54.650624 161 23 1.1 0.9 46.5100 11.3900 0.0000 0.0000; + 6318 1 0 0 0 0 6 0.994043 -56.386079 161 23 1.1 0.9 69.3200 22.9700 0.0000 0.0000; + 6319 1 70.22 19.9 0 0 6 0.9859871 -57.663433 115 23 1.1 0.9 86.8400 30.2100 0.0000 0.0000; + 6320 1 47.89 13.57 0 221.36 6 1.0173552 -55.499532 115 22 1.1 0.9 1073.7100 -273.1600 0.0000 0.0000; + 6321 1 0 0 0 0 6 1.0109006 -47.032695 230 22 1.1 0.9 64.8000 2.7700 0.0000 0.0000; + 6322 1 66.07 18.72 0 0 6 1.0102176 -49.70916 115 22 1.1 0.9 62.0200 1.7600 0.0000 0.0000; + 6323 1 33.38 9.46 0 0 6 0.996336 -56.603809 115 26 1.1 0.9 152.6700 6.6400 0.0000 0.0000; + 6324 1 58.22 16.5 0 0 6 0.9979793 -56.166417 115 22 1.1 0.9 593.3000 -103.3500 0.0000 0.0000; + 6325 1 4.74 1.34 0 0 6 1.008186 -53.94687 115 25 1.1 0.9 212.9200 32.7400 0.0000 0.0000; + 6326 1 15.43 4.37 0 0 6 0.9978726 -45.95932 115 25 1.1 0.9 82.5800 10.3100 0.0000 0.0000; + 6327 1 17.61 4.99 0 0 6 1.0174467 -39.65579 115 25 1.1 0.9 588.5700 62.2300 0.0000 0.0000; + 6328 1 27.95 7.92 0 0 6 1.0099616 -58.742238 115 26 1.1 0.9 452.2900 20.8500 0.0000 0.0000; + 6329 1 1.79 0.51 0 0 6 1.018426 -44.046146 115 24 1.1 0.9 82.6200 6.8500 0.0000 0.0000; + 6330 1 133.75 37.9 0 0 6 0.9882031 -58.785702 115 23 1.1 0.9 1597.3200 40.1000 0.0000 0.0000; + 6331 1 81.32 23.04 0 147.19 6 0.9945548 -58.186501 115 23 1.1 0.9 627.7300 104.1800 0.0000 0.0000; + 6332 1 73 20.68 0 0 6 1.009184 -56.281103 115 26 1.1 0.9 839.5800 135.0600 0.0000 0.0000; + 6333 1 0 0 0 0 6 1.0229701 -48.63956 500 26 1.1 0.9 31.9200 5.5700 0.0000 0.0000; + 6334 1 0 0 0 0 6 1.0226098 -51.297523 230 26 1.1 0.9 8.9300 3.1800 0.0000 0.0000; + 6335 1 164.71 46.67 0 0 6 1.0003399 -55.267074 115 26 1.1 0.9 46.9800 13.4800 0.0000 0.0000; + 6336 1 26.07 7.39 0 0 6 1.0008638 -58.444345 115 26 1.1 0.9 627.8500 56.2900 0.0000 0.0000; + 6337 1 121.19 34.34 0 0 6 1.0146035 -56.592925 115 26 1.1 0.9 182.5300 12.6300 0.0000 0.0000; + 6338 1 33.61 9.52 0 0 6 0.9941681 -52.529355 115 25 1.1 0.9 101.4700 17.8100 0.0000 0.0000; + 6339 1 34.37 9.74 0 0 6 1.0022333 -53.630921 115 23 1.1 0.9 710.5700 67.5800 0.0000 0.0000; + 6340 1 29.18 8.27 0 0 6 1.0190508 -51.493229 115 24 1.1 0.9 552.1300 15.1700 0.0000 0.0000; + 6341 1 6.3 1.79 0 0 6 1.0097343 -41.78351 115 25 1.1 0.9 554.6700 136.9000 0.0000 0.0000; + 6342 1 0 0 0 0 6 1.0159697 -50.830427 500 23 1.1 0.9 -12.5700 -13.3300 0.0000 0.0000; + 6343 1 0 0 0 0 6 1.0074867 -53.193965 230 23 1.1 0.9 -72.2900 -24.3300 0.0000 0.0000; + 6344 1 158.8 44.99 0 0 6 1.0027467 -55.246475 115 23 1.1 0.9 -271.7200 -63.9400 0.0000 0.0000; + 6345 1 17.7 5.02 0 0 6 0.9891926 -57.9615 115 23 1.1 0.9 963.8300 136.3200 0.0000 0.0000; + 6346 1 2.3 0.65 0 0 6 1.0022903 -52.677585 115 26 1.1 0.9 51.9700 10.7000 0.0000 0.0000; + 6349 2 0 0 0 0 6 1.0293489 -49.336533 500 23 1.1 0.9 0.0700 -12.2500 0.0000 0.0000; + 6350 1 0 0 0 0 6 1.0174336 -51.521787 230 23 1.1 0.9 -60.2000 -41.7300 0.0000 0.0000; + 6351 1 23.86 6.76 0 0 6 0.9990794 -55.996436 115 23 1.1 0.9 1048.9500 150.6200 0.0000 0.0000; + 6352 1 121.76 34.5 0 0 6 1.0131142 -56.461501 115 26 1.1 0.9 201.5800 17.4800 0.0000 0.0000; + 6353 1 107.96 30.59 0 0 6 1.0000177 -56.44529 115 23 1.1 0.9 1328.8800 -27.0500 0.0000 0.0000; + 6354 1 0 0 0 0 6 1.0064169 -53.486274 230 23 1.1 0.9 17.1700 -6.0000 0.0000 0.0000; + 6355 1 151.82 43.02 0 0 6 1.0030083 -54.898614 115 23 1.1 0.9 109.7700 16.9100 0.0000 0.0000; + 6356 1 135.92 38.51 0 363.1 6 1.030003 -58.019736 115 26 1.1 0.9 230.8000 0.0000 0.0000 0.0000; + 6357 1 30.83 8.74 0 0 6 1.0211213 -54.032565 115 26 1.1 0.9 4.0300 0.8400 0.0000 0.0000; + 6358 1 77.99 22.1 0 156.58 6 1.0300033 -58.346763 115 23 1.1 0.9 759.3100 0.0000 0.0000 0.0000; + 6359 1 0 0 0 0 6 1.0228871 -49.242556 230 23 1.1 0.9 6.0200 -15.6200 0.0000 0.0000; + 6360 1 38.93 11.03 0 0 6 1.0018715 -49.557488 115 23 1.1 0.9 76.2400 4.2300 0.0000 0.0000; + 7001 1 9.3 2.64 0 0 7 1.002794 -35.697219 115 6 1.1 0.9 128.9600 18.5800 0.0000 0.0000; + 7002 1 0 0 0 0 7 1.031626 -25.043179 500 4 1.1 0.9 50.1500 -1.4500 0.0000 0.0000; + 7003 1 0 0 0 0 7 1.0173944 -29.324421 230 4 1.1 0.9 168.3400 32.4100 0.0000 0.0000; + 7004 1 221.92 62.88 0 0 7 1.011398 -33.985977 115 4 1.1 0.9 358.9000 80.4000 0.0000 0.0000; + 7005 2 0 0 0 0 7 1.0400028 -22.886275 13.8 4 1.1 0.9 50.1700 0.0000 0.0000 0.0000; + 7006 2 0 0 0 0 7 1.0400028 -23.816976 13.8 4 1.1 0.9 50.1700 0.0000 0.0000 0.0000; + 7007 2 0 0 0 0 7 1.0400028 -23.196917 13.8 4 1.1 0.9 50.1700 0.0000 0.0000 0.0000; + 7008 2 0 0 0 0 7 1.0400028 -23.103165 13.8 4 1.1 0.9 50.1700 0.0000 0.0000 0.0000; + 7009 2 0 0 0 0 7 1.0400028 -22.882417 13.8 4 1.1 0.9 50.1700 0.0000 0.0000 0.0000; + 7010 1 15.65 4.43 0 0 7 0.9907729 -42.669552 115 5 1.1 0.9 953.3800 175.9300 0.0000 0.0000; + 7011 1 35.79 10.14 0 0 7 1.0231097 -42.132856 115 5 1.1 0.9 316.6100 8.4200 0.0000 0.0000; + 7012 1 0.94 0.27 0 0 7 0.9822041 -38.735235 115 3 1.1 0.9 448.1200 114.8100 0.0000 0.0000; + 7013 1 138.05 39.11 0 0 7 0.9975297 -40.439026 115 5 1.1 0.9 1936.4600 38.1100 0.0000 0.0000; + 7014 1 52.81 14.96 0 0 7 0.9913004 -38.17932 115 4 1.1 0.9 876.4700 57.8800 0.0000 0.0000; + 7015 2 0 0 0 0 7 0.9913004 -38.17932 18 4 1.1 0.9 876.4700 57.8800 0.0000 0.0000; + 7016 1 85.56 24.24 0 0 7 1.0025695 -35.307126 115 4 1.1 0.9 285.3100 51.4600 0.0000 0.0000; + 7017 1 135.83 38.48 0 0 7 0.9987305 -39.360777 115 3 1.1 0.9 680.6700 95.4600 0.0000 0.0000; + 7018 1 0 0 0 0 7 1.0246775 -32.635538 500 6 1.1 0.9 41.7800 -1.1500 0.0000 0.0000; + 7019 1 0 0 0 0 7 1.0180906 -33.674529 230 6 1.1 0.9 57.3600 4.9600 0.0000 0.0000; + 7020 1 75.38 21.36 0 0 7 1.0141452 -36.419145 115 6 1.1 0.9 81.2900 17.8200 0.0000 0.0000; + 7021 2 0 0 0 0 7 1.0306486 -31.994921 18 6 1.1 0.9 41.8000 -0.3100 0.0000 0.0000; + 7022 2 0 0 0 0 7 1.0378511 -31.201247 18 6 1.1 0.9 41.8500 37.4600 0.0000 0.0000; + 7023 2 0 0 0 0 7 1.032955 -31.750814 18 6 1.1 0.9 41.8000 0.1500 0.0000 0.0000; + 7024 2 0 0 0 0 7 1.0302576 -32.042224 18 6 1.1 0.9 41.8000 2.7800 0.0000 0.0000; + 7025 2 0 0 0 0 7 1.0246775 -32.635538 18 6 1.1 0.9 41.7800 -1.1500 0.0000 0.0000; + 7026 1 43.39 12.29 0 0 7 1.0137233 -35.337793 115 4 1.1 0.9 171.6500 2.5500 0.0000 0.0000; + 7027 1 109.22 30.95 0 0 7 0.9970786 -39.722688 115 5 1.1 0.9 371.7200 59.0400 0.0000 0.0000; + 7028 1 77.01 21.82 0 481.69 7 1.013589 -38.677292 115 3 1.1 0.9 1306.4200 -764.2800 0.0000 0.0000; + 7029 1 0 0 0 0 7 1.0175822 -32.165212 230 6 1.1 0.9 96.6300 -1.9600 0.0000 0.0000; + 7030 1 0 0 0 0 7 1.0154034 -35.843092 115 6 1.1 0.9 131.9300 32.8600 0.0000 0.0000; + 7031 2 0 0 0 0 7 1.0173863 -29.174755 13.8 6 1.1 0.9 96.6400 -1.9600 0.0000 0.0000; + 7032 2 0 0 0 0 7 1.0179529 -31.202886 13.8 6 1.1 0.9 96.6100 -1.9600 0.0000 0.0000; + 7033 2 0 0 0 0 7 1.0178766 -31.275717 13.8 6 1.1 0.9 96.6200 -1.9600 0.0000 0.0000; + 7034 2 0 0 0 0 7 1.0175822 -32.165212 13.8 6 1.1 0.9 96.6300 -1.9600 0.0000 0.0000; + 7035 1 0 0 0 0 7 1.014441 -36.86151 230 5 1.1 0.9 65.4500 -0.8800 0.0000 0.0000; + 7036 1 92.31 26.15 0 0 7 1.0029473 -39.347698 115 5 1.1 0.9 441.0700 111.2000 0.0000 0.0000; + 7037 1 0 0 0 0 7 1.0228053 -31.127182 500 3 1.1 0.9 -17.6300 -21.1500 0.0000 0.0000; + 7038 1 0 0 0 0 7 1.0103709 -32.644691 230 3 1.1 0.9 -58.0300 -35.3100 0.0000 0.0000; + 7039 1 235.5 66.73 0 0 7 1.0032153 -37.086434 115 3 1.1 0.9 1232.4600 94.6700 0.0000 0.0000; + 7040 1 0 0 0 0 7 1.0159299 -30.931559 230 4 1.1 0.9 85.4200 18.4100 0.0000 0.0000; + 7041 1 93.88 26.6 0 0 7 1.0062694 -34.586523 115 4 1.1 0.9 175.5000 49.0700 0.0000 0.0000; + 7042 1 0 0 0 0 7 1.0244234 -31.408134 500 6 1.1 0.9 38.4000 1.3700 0.0000 0.0000; + 7043 1 0 0 0 0 7 1.0202015 -32.78092 230 6 1.1 0.9 51.7000 4.1700 0.0000 0.0000; + 7044 1 124.64 35.32 0 0 7 1.002184 -35.573634 115 6 1.1 0.9 93.9900 14.1500 0.0000 0.0000; + 7045 2 0 0 0 0 7 1.0300026 -29.421467 20 6 1.1 0.9 38.3100 0.0000 0.0000 0.0000; + 7046 2 0 0 0 0 7 1.0300026 -30.494071 20 6 1.1 0.9 38.3500 0.0000 0.0000 0.0000; + 7047 1 0 0 0 0 7 1.0214289 -31.568594 500 3 1.1 0.9 -13.3100 -22.2300 0.0000 0.0000; + 7048 1 0 0 0 0 7 1.0121491 -33.719016 230 3 1.1 0.9 -37.1800 -40.2000 0.0000 0.0000; + 7049 1 283.15 80.22 0 0 7 1.0080421 -38.410859 115 3 1.1 0.9 1377.3800 47.6100 0.0000 0.0000; + 7050 1 72.03 20.41 0 0 7 0.9902975 -42.340998 115 5 1.1 0.9 1341.0300 202.8300 0.0000 0.0000; + 7051 1 140.79 39.89 0 0 7 0.9957598 -39.137729 115 3 1.1 0.9 486.1100 35.7400 0.0000 0.0000; + 7052 1 106.66 30.22 0 0 7 0.9984259 -37.427863 115 3 1.1 0.9 1042.1100 38.8400 0.0000 0.0000; + 7053 1 105.96 30.02 0 0 7 1.0071842 -32.770316 115 3 1.1 0.9 1323.6200 69.5000 0.0000 0.0000; + 7054 1 92.85 26.31 0 0 7 0.9855692 -39.084746 115 4 1.1 0.9 312.3800 42.9500 0.0000 0.0000; + 7055 1 98.08 27.79 0 0 7 0.9990693 -37.053875 115 3 1.1 0.9 667.3100 78.2300 0.0000 0.0000; + 7056 1 0 0 0 0 7 1.0090563 -36.17609 230 5 1.1 0.9 49.2100 -12.1400 0.0000 0.0000; + 7057 1 106.11 30.06 0 0 7 0.9912754 -40.749296 115 5 1.1 0.9 295.5600 65.0900 0.0000 0.0000; + 7058 1 0 0 0 0 7 1.0202463 -28.383046 500 6 1.1 0.9 17.5200 4.6800 0.0000 0.0000; + 7059 1 0 0 0 0 7 1.0204897 -29.716565 230 6 1.1 0.9 -41.3500 15.7500 0.0000 0.0000; + 7060 1 0 0 0 0 7 1.0242836 -31.905899 115 6 1.1 0.9 46.0400 44.5200 0.0000 0.0000; + 7061 2 0 0 0 0 7 1.0172462 -27.473787 13.8 6 1.1 0.9 17.2600 44.3800 0.0000 0.0000; + 7062 2 0 0 0 0 7 1.0175312 -27.551813 13.8 6 1.1 0.9 17.2800 48.1900 0.0000 0.0000; + 7063 2 0 0 0 0 7 1.0173491 -27.485099 13.8 6 1.1 0.9 17.2600 44.9200 0.0000 0.0000; + 7064 2 0 0 0 0 7 1.0179544 -27.532421 13.8 6 1.1 0.9 17.3300 57.5000 0.0000 0.0000; + 7065 2 0 0 0 0 7 1.0178142 -27.446862 13.8 6 1.1 0.9 17.3000 52.6500 0.0000 0.0000; + 7066 2 0 0 0 0 7 1.0176 -27.558479 13.8 6 1.1 0.9 17.2900 49.2300 0.0000 0.0000; + 7067 1 82.69 23.43 0 0 7 0.9800165 -41.133366 115 3 1.1 0.9 580.4100 75.2500 0.0000 0.0000; + 7068 1 0 0 0 0 7 1.014778 -29.871113 230 1 1.1 0.9 -21.8400 -11.1000 0.0000 0.0000; + 7069 1 51.16 14.5 0 0 7 1.0040275 -33.749893 115 1 1.1 0.9 812.0900 124.4200 0.0000 0.0000; + 7070 1 101.03 28.63 0 0 7 0.9932183 -36.399526 115 4 1.1 0.9 904.4800 130.0000 0.0000 0.0000; + 7071 1 3.76 1.07 0 0 7 0.9964456 -31.785104 115 6 1.1 0.9 93.1300 6.8600 0.0000 0.0000; + 7072 1 116.42 32.99 0 0 7 1.0083745 -34.866314 115 4 1.1 0.9 112.3100 -4.6200 0.0000 0.0000; + 7073 1 0 0 0 0 7 1.0172224 -31.098208 230 2 1.1 0.9 22.5700 -23.7600 0.0000 0.0000; + 7074 1 69.13 19.59 0 0 7 1.0143681 -33.651084 115 2 1.1 0.9 71.5800 -7.3900 0.0000 0.0000; + 7075 1 160.86 45.58 0 342.5 7 1.0161298 -35.163722 115 4 1.1 0.9 379.9500 76.4600 0.0000 0.0000; + 7076 1 0 0 0 0 7 1.0344048 -25.171907 500 4 1.1 0.9 16.3300 -1.6000 0.0000 0.0000; + 7077 1 0 0 0 0 7 1.0273272 -27.485453 230 4 1.1 0.9 32.4900 0.7000 0.0000 0.0000; + 7078 1 0 0 0 0 7 1.0169178 -31.996858 115 4 1.1 0.9 217.0400 21.2600 0.0000 0.0000; + 7079 2 0 0 0 0 7 1.0400028 -23.749733 13.8 4 1.1 0.9 16.3800 0.0000 0.0000 0.0000; + 7080 2 0 0 0 0 7 1.0400028 -23.28414 13.8 4 1.1 0.9 16.3900 0.0000 0.0000 0.0000; + 7081 2 0 0 0 0 7 1.0400028 -23.26643 13.8 4 1.1 0.9 16.3900 0.0000 0.0000 0.0000; + 7082 2 0 0 0 0 7 1.0400028 -23.661277 13.8 4 1.1 0.9 16.3800 0.0000 0.0000 0.0000; + 7083 1 0 0 0 0 7 1.0160802 -30.182306 230 4 1.1 0.9 -34.9700 -46.2900 0.0000 0.0000; + 7084 1 214.74 60.84 0 0 7 1.0081888 -33.567165 115 4 1.1 0.9 43.6100 -15.8300 0.0000 0.0000; + 7085 1 4.1 1.16 0 0 7 0.9983918 -34.833162 115 2 1.1 0.9 1570.8100 233.6700 0.0000 0.0000; + 7086 1 53.44 15.14 0 0 7 0.9916556 -37.226318 115 4 1.1 0.9 565.8600 45.6800 0.0000 0.0000; + 7087 1 74.22 21.03 0 0 7 1.0031112 -36.066024 115 3 1.1 0.9 381.0300 181.7600 0.0000 0.0000; + 7088 1 101.05 28.63 0 0 7 0.9789157 -39.984104 115 3 1.1 0.9 586.5600 244.3900 0.0000 0.0000; + 7089 1 70.07 19.85 0 316.53 7 1.015342 -40.158372 115 3 1.1 0.9 933.5300 75.1700 0.0000 0.0000; + 7090 1 13.8 3.91 0 0 7 0.9921421 -41.850973 115 5 1.1 0.9 1349.9200 219.2500 0.0000 0.0000; + 7091 1 210.68 59.69 0 307.42 7 1.026318 -39.572988 115 3 1.1 0.9 674.5600 0.0000 0.0000 0.0000; + 7092 1 39.23 11.11 0 0 7 0.9927246 -38.506514 115 3 1.1 0.9 777.4000 64.8100 0.0000 0.0000; + 7093 1 109.15 30.93 0 0 7 0.9888617 -39.283273 115 3 1.1 0.9 852.6200 50.2200 0.0000 0.0000; + 7094 1 76.69 21.73 0 0 7 1.0039242 -39.984956 115 3 1.1 0.9 722.2000 67.2400 0.0000 0.0000; + 7095 1 0 0 0 0 7 1.0089056 -21.426615 500 1 1.1 0.9 9.9500 5.4300 0.0000 0.0000; + 7096 1 0 0 0 0 7 1.0151521 -23.654601 230 1 1.1 0.9 7.6400 14.1600 0.0000 0.0000; + 7097 1 0 0 0 0 7 1.0152672 -25.34719 115 1 1.1 0.9 20.0000 19.5600 0.0000 0.0000; + 7098 3 0 0 0 0 7 1 0 13.8 1 1.1 0.9 7.4600 0.0000 0.0000 0.0000; + 7099 2 0 0 0 0 7 1.0000018 -12.934667 13.8 1 1.1 0.9 9.0000 0.0000 0.0000 0.0000; + 7100 1 62.16 17.61 0 0 7 0.9933479 -37.054905 115 4 1.1 0.9 1012.2500 56.4100 0.0000 0.0000; + 7101 1 212.51 60.21 0 0 7 1.0014243 -38.272216 115 3 1.1 0.9 1116.4500 96.9000 0.0000 0.0000; + 7102 1 118.05 33.45 0 0 7 0.9853947 -40.619602 115 5 1.1 0.9 354.3000 59.8900 0.0000 0.0000; + 7103 1 58.64 16.61 0 0 7 0.994076 -37.39993 115 4 1.1 0.9 903.5900 48.0200 0.0000 0.0000; + 7104 1 0 0 0 0 7 1.0318283 -24.582129 500 4 1.1 0.9 48.1800 -2.5700 0.0000 0.0000; + 7105 1 0 0 0 0 7 1.018642 -29.073514 230 4 1.1 0.9 27.7600 -21.7200 0.0000 0.0000; + 7106 1 92.07 26.09 0 0 7 1.0127503 -33.296444 115 4 1.1 0.9 299.4200 73.5500 0.0000 0.0000; + 7107 2 0 0 0 0 7 1.0393913 -23.779877 24 4 1.1 0.9 48.2300 -2.5500 0.0000 0.0000; + 7108 2 0 0 0 0 7 1.0400028 -23.355704 24 4 1.1 0.9 48.2500 0.0000 0.0000 0.0000; + 7109 2 0 0 0 0 7 1.0400028 -23.563693 24 4 1.1 0.9 48.2400 0.0000 0.0000 0.0000; + 7110 2 0 0 0 0 7 1.0400028 -22.608527 24 4 1.1 0.9 48.2700 0.0000 0.0000 0.0000; + 7111 2 0 0 0 0 7 1.0400028 -22.559818 24 4 1.1 0.9 48.2700 0.0000 0.0000 0.0000; + 7112 2 0 0 0 0 7 1.0400028 -23.361909 24 4 1.1 0.9 48.2500 0.0000 0.0000 0.0000; + 7113 2 0 0 0 0 7 1.0400028 -22.218855 24 4 1.1 0.9 48.2700 0.0000 0.0000 0.0000; + 7114 2 0 0 0 0 7 1.0400028 -23.443473 24 4 1.1 0.9 48.2500 0.0000 0.0000 0.0000; + 7115 2 0 0 0 0 7 1.0400028 -23.442691 24 4 1.1 0.9 48.2400 0.0000 0.0000 0.0000; + 7116 1 12.16 3.45 0 0 7 0.982072 -39.46659 115 1 1.1 0.9 641.8300 151.1500 0.0000 0.0000; + 7117 1 84.03 23.81 0 0 7 0.9949012 -39.130991 115 3 1.1 0.9 755.8300 53.8700 0.0000 0.0000; + 7118 1 121.15 34.33 0 0 7 0.9855934 -40.207644 115 5 1.1 0.9 406.2200 62.9100 0.0000 0.0000; + 7119 1 49.7 14.08 0 0 7 0.9938716 -36.946857 115 4 1.1 0.9 1007.3500 30.5000 0.0000 0.0000; + 7120 1 149.7 42.41 0 0 7 0.9850769 -40.254847 115 3 1.1 0.9 1247.7900 113.9800 0.0000 0.0000; + 7121 2 0 0 0 0 7 0.9850769 -40.254847 18 3 1.1 0.9 1247.7900 113.9800 0.0000 0.0000; + 7122 2 0 0 0 0 7 0.9850769 -40.254847 18 3 1.1 0.9 1247.7900 113.9800 0.0000 0.0000; + 7123 1 6.63 1.88 0 0 7 0.9956521 -31.299405 115 6 1.1 0.9 85.7400 9.4700 0.0000 0.0000; + 7124 1 164.66 46.65 0 0 7 0.9916059 -38.407572 115 3 1.1 0.9 728.0100 86.0600 0.0000 0.0000; + 7125 1 0 0 0 0 7 1.0278363 -25.424889 500 3 1.1 0.9 36.0600 2.6800 0.0000 0.0000; + 7126 1 0 0 0 0 7 1.0118672 -31.704013 230 3 1.1 0.9 90.4300 44.9500 0.0000 0.0000; + 7127 1 223.54 63.34 0 0 7 1.0076727 -34.369308 115 3 1.1 0.9 249.1500 138.1800 0.0000 0.0000; + 7128 1 63.94 18.12 0 0 7 1.0021478 -39.722233 115 5 1.1 0.9 572.5000 140.4000 0.0000 0.0000; + 7129 1 5.15 1.46 0 0 7 1.0219495 -33.908714 115 6 1.1 0.9 131.3500 48.3900 0.0000 0.0000; + 7130 1 0 0 0 0 7 1.0289051 -24.303722 500 4 1.1 0.9 46.8800 -3.7600 0.0000 0.0000; + 7131 1 0 0 0 0 7 1.0162005 -29.140235 230 4 1.1 0.9 99.3600 -2.6700 0.0000 0.0000; + 7132 1 72.75 20.61 0 0 7 1.0028842 -32.776512 115 4 1.1 0.9 255.9000 6.0100 0.0000 0.0000; + 7133 2 0 0 0 0 7 1.0279995 -23.831473 13.8 4 1.1 0.9 46.9400 -3.7700 0.0000 0.0000; + 7134 2 0 0 0 0 7 1.0259394 -22.795056 13.8 4 1.1 0.9 47.0500 -3.7800 0.0000 0.0000; + 7135 2 0 0 0 0 7 1.0250387 -22.406997 13.8 4 1.1 0.9 47.0900 -3.7900 0.0000 0.0000; + 7136 2 0 0 0 0 7 1.0245632 -22.217795 13.8 4 1.1 0.9 47.1200 -3.8000 0.0000 0.0000; + 7137 2 0 0 0 0 7 1.0247215 -22.139703 13.8 4 1.1 0.9 47.1000 -3.7900 0.0000 0.0000; + 7138 2 0 0 0 0 7 1.0260802 -22.865164 13.8 4 1.1 0.9 47.0400 -3.7800 0.0000 0.0000; + 7139 2 0 0 0 0 7 1.0261554 -22.81208 13.8 4 1.1 0.9 47.0300 -3.7800 0.0000 0.0000; + 7140 2 0 0 0 0 7 1.026391 -23.045314 13.8 4 1.1 0.9 47.0300 -3.7800 0.0000 0.0000; + 7141 2 0 0 0 0 7 1.0273628 -23.478289 13.8 4 1.1 0.9 46.9700 -3.7700 0.0000 0.0000; + 7142 2 0 0 0 0 7 1.0267994 -23.212984 13.8 4 1.1 0.9 47.0000 -3.7800 0.0000 0.0000; + 7143 1 59.96 16.99 0 0 7 0.9994946 -40.922053 115 5 1.1 0.9 563.6500 26.5300 0.0000 0.0000; + 7144 1 97.68 27.68 0 0 7 0.9953186 -36.398996 115 4 1.1 0.9 1148.3400 57.8000 0.0000 0.0000; + 7145 1 143.78 40.74 0 314.22 7 1.0300027 -40.972553 115 4 1.1 0.9 487.0000 0.0000 0.0000 0.0000; + 7146 2 0 0 0 0 7 1.0278976 -39.797985 13.8 4 1.1 0.9 486.5700 0.0600 0.0000 0.0000; + 7147 1 47.29 13.4 0 0 7 1.004257 -38.119383 115 3 1.1 0.9 384.3900 363.9600 0.0000 0.0000; + 7148 1 59.46 16.85 0 0 7 0.989317 -40.007743 115 3 1.1 0.9 547.4600 67.4000 0.0000 0.0000; + 7149 1 12.25 3.47 0 0 7 1.0019453 -34.669523 115 6 1.1 0.9 120.3700 9.9600 0.0000 0.0000; + 7150 1 0 0 0 165.54 7 1.0300028 -38.322316 230 5 1.1 0.9 33.6000 0.0000 0.0000 0.0000; + 7151 1 44.05 12.48 0 0 7 1.0221745 -40.778212 115 5 1.1 0.9 137.8800 20.5800 0.0000 0.0000; + 7152 1 3.59 1.02 0 0 7 0.9950581 -38.086032 115 3 1.1 0.9 767.0700 28.2700 0.0000 0.0000; + 7153 1 26.21 7.42 0 0 7 0.998063 -28.150028 115 1 1.1 0.9 44.1400 18.6800 0.0000 0.0000; + 7154 1 58.6 16.6 0 0 7 1.0050109 -40.720082 115 5 1.1 0.9 353.1400 40.2700 0.0000 0.0000; + 7155 1 78.41 22.22 0 0 7 0.9870723 -38.355222 115 3 1.1 0.9 852.9000 83.9800 0.0000 0.0000; + 7156 1 0 0 0 0 7 1.0047581 -35.267382 230 5 1.1 0.9 164.7400 21.7400 0.0000 0.0000; + 7157 1 163.83 46.42 0 0 7 0.99886 -38.577076 115 5 1.1 0.9 309.6400 57.9200 0.0000 0.0000; + 7158 1 78.37 22.2 0 0 7 0.9832623 -39.394783 115 4 1.1 0.9 332.2000 68.8800 0.0000 0.0000; + 7159 1 0 0 0 0 7 1.0273608 -31.185765 500 3 1.1 0.9 17.1200 -10.4700 0.0000 0.0000; + 7160 1 0 0 0 0 7 1.0152071 -33.46738 230 3 1.1 0.9 9.7500 -18.9600 0.0000 0.0000; + 7161 1 137.54 38.97 0 0 7 1.0060052 -36.828308 115 3 1.1 0.9 -77.8100 -45.7500 0.0000 0.0000; + 7162 2 0 0 0 0 7 1.0361652 -30.240762 18 3 1.1 0.9 17.1800 -10.2900 0.0000 0.0000; + 7163 2 0 0 0 0 7 1.0400028 -29.723065 18 3 1.1 0.9 17.2000 -10.2000 0.0000 0.0000; + 7164 2 0 0 0 0 7 1.0371569 -30.120923 18 3 1.1 0.9 17.1800 -10.2700 0.0000 0.0000; + 7165 2 0 0 0 0 7 1.0362215 -30.22683 18 3 1.1 0.9 17.1800 -10.2900 0.0000 0.0000; + 7166 2 0 0 0 0 7 1.0400028 -29.474773 18 3 1.1 0.9 17.2900 0.0000 0.0000 0.0000; + 7167 2 0 0 0 0 7 1.0400028 -29.104574 18 3 1.1 0.9 17.3100 0.0000 0.0000 0.0000; + 7168 2 0 0 0 0 7 1.0374839 -30.088033 18 3 1.1 0.9 17.1800 -10.2600 0.0000 0.0000; + 7169 2 0 0 0 0 7 1.0356302 -30.286973 18 3 1.1 0.9 17.1700 -10.3000 0.0000 0.0000; + 7170 2 0 0 0 0 7 1.0400028 -28.971481 18 3 1.1 0.9 17.3800 0.0000 0.0000 0.0000; + 7171 1 0 0 0 0 7 1.0167416 -31.488638 230 2 1.1 0.9 -3.3900 -34.2600 0.0000 0.0000; + 7172 1 91.12 25.82 0 0 7 1.0196878 -33.636372 115 2 1.1 0.9 67.2300 -11.7200 0.0000 0.0000; + 7173 1 112.54 31.89 0 0 7 0.9818274 -40.272371 115 4 1.1 0.9 934.4700 26.2900 0.0000 0.0000; + 7174 1 124.67 35.32 0 0 7 0.99135 -35.722606 115 4 1.1 0.9 1811.3900 362.0700 0.0000 0.0000; + 7175 1 0 0 0 0 7 1.0259895 -32.327494 500 5 1.1 0.9 31.0400 -7.6400 0.0000 0.0000; + 7176 1 0 0 0 0 7 1.0117798 -34.687933 230 5 1.1 0.9 72.7400 -2.3100 0.0000 0.0000; + 7177 1 211.63 59.96 0 0 7 0.9901848 -39.463486 115 5 1.1 0.9 343.9200 59.6200 0.0000 0.0000; + 7178 1 122.49 34.71 0 0 7 0.9864173 -40.433178 115 3 1.1 0.9 549.9100 73.3500 0.0000 0.0000; + 7179 1 58.29 16.52 0 0 7 0.9911449 -37.35842 115 3 1.1 0.9 949.7700 216.0800 0.0000 0.0000; + 7180 1 91.45 25.91 0 0 7 0.9923428 -38.882438 115 3 1.1 0.9 744.2200 83.8900 0.0000 0.0000; + 7181 1 148.98 42.21 0 0 7 0.9863418 -40.350726 115 3 1.1 0.9 1096.6800 157.8200 0.0000 0.0000; + 7182 1 2.07 0.59 0 0 7 0.9881471 -40.31296 115 3 1.1 0.9 779.0900 197.8200 0.0000 0.0000; + 7183 1 215.91 61.17 0 452.29 7 1.0300027 -39.964432 115 3 1.1 0.9 852.2500 0.0000 0.0000 0.0000; + 7184 1 0 0 0 0 7 1.0184389 -28.462465 230 3 1.1 0.9 -86.8600 -71.4600 0.0000 0.0000; + 7185 1 168.93 47.86 0 0 7 1.0080531 -30.944562 115 3 1.1 0.9 1268.2600 219.8900 0.0000 0.0000; + 7186 1 0 0 0 0 7 1.0237994 -26.702729 500 3 1.1 0.9 94.9700 7.1000 0.0000 0.0000; + 7187 1 0 0 0 0 7 1.0105083 -31.122929 230 3 1.1 0.9 203.1900 25.5700 0.0000 0.0000; + 7188 1 76.58 21.7 0 0 7 1.0008612 -36.211097 115 3 1.1 0.9 634.4100 83.0400 0.0000 0.0000; + 7189 2 0 0 0 0 7 1.0252826 -26.545341 13.8 3 1.1 0.9 94.9300 7.0800 0.0000 0.0000; + 7190 2 0 0 0 0 7 1.0300027 -25.315981 13.8 3 1.1 0.9 94.6800 0.0000 0.0000 0.0000; + 7191 2 0 0 0 0 7 1.0237994 -26.702729 13.8 3 1.1 0.9 94.9700 7.1000 0.0000 0.0000; + 7192 2 0 0 0 0 7 1.0300027 -26.013467 13.8 3 1.1 0.9 94.7700 7.0000 0.0000 0.0000; + 7193 2 0 0 0 0 7 1.0248424 -26.592881 13.8 3 1.1 0.9 94.9400 7.0800 0.0000 0.0000; + 7194 2 0 0 0 0 7 1.0300027 -24.819968 13.8 3 1.1 0.9 94.5700 0.0000 0.0000 0.0000; + 7195 2 0 0 0 0 7 1.0300027 -24.520608 13.8 3 1.1 0.9 94.4700 0.0000 0.0000 0.0000; + 7196 2 0 0 0 0 7 1.0300027 -25.531077 13.8 3 1.1 0.9 94.6700 0.0000 0.0000 0.0000; + 7197 2 0 0 0 0 7 1.0300027 -25.951395 13.8 3 1.1 0.9 94.7500 6.9900 0.0000 0.0000; + 7198 1 86.12 24.4 0 230.61 7 1.0300027 -39.885629 115 5 1.1 0.9 2099.2600 0.0000 0.0000 0.0000; + 7199 1 0 0 0 0 7 1.0240298 -31.258491 500 5 1.1 0.9 -0.2600 -17.2300 0.0000 0.0000; + 7200 1 0 0 0 0 7 1.0138467 -35.371796 230 5 1.1 0.9 -141.2900 -61.2600 0.0000 0.0000; + 7201 1 216.79 61.42 0 0 7 1.0134768 -39.01965 115 5 1.1 0.9 2211.4500 17.5500 0.0000 0.0000; + 7202 1 35.93 10.18 0 0 7 0.9928285 -42.759079 115 5 1.1 0.9 848.6000 171.6500 0.0000 0.0000; + 7203 1 20.55 5.82 0 0 7 0.9969892 -33.947291 115 1 1.1 0.9 558.1100 170.6100 0.0000 0.0000; + 7204 1 0 0 0 0 7 1.0342474 -24.391505 500 4 1.1 0.9 25.6400 -2.8800 0.0000 0.0000; + 7205 1 0 0 0 0 7 1.0258271 -27.510777 230 4 1.1 0.9 33.4000 -9.8100 0.0000 0.0000; + 7206 1 0 0 0 0 7 1.0242257 -31.603853 115 4 1.1 0.9 157.4300 13.4700 0.0000 0.0000; + 7207 2 0 0 0 0 7 1.0342474 -24.391505 18 4 1.1 0.9 25.6400 -2.8800 0.0000 0.0000; + 7208 2 0 0 0 0 7 1.0400028 -20.643417 18 4 1.1 0.9 25.7300 0.0000 0.0000 0.0000; + 7209 2 0 0 0 0 7 1.0400028 -21.797675 18 4 1.1 0.9 25.7100 0.0000 0.0000 0.0000; + 7210 2 0 0 0 0 7 1.0400028 -22.323044 18 4 1.1 0.9 25.7200 0.0000 0.0000 0.0000; + 7211 2 0 0 0 0 7 1.0400028 -22.904785 18 4 1.1 0.9 25.7000 0.0000 0.0000 0.0000; + 7212 2 0 0 0 0 7 1.0400028 -21.971265 18 4 1.1 0.9 25.7200 0.0000 0.0000 0.0000; + 7213 1 68.5 19.41 0 0 7 1.0069205 -35.608106 115 2 1.1 0.9 1287.0000 464.2200 0.0000 0.0000; + 7214 1 83.89 23.77 0 0 7 0.9892128 -37.57658 115 3 1.1 0.9 883.3200 131.7300 0.0000 0.0000; + 7215 1 104.88 29.72 0 0 7 0.9911386 -41.002616 115 5 1.1 0.9 336.1500 69.0300 0.0000 0.0000; + 7216 1 92.56 26.23 0 0 7 0.9893478 -38.905095 115 3 1.1 0.9 780.1400 104.1300 0.0000 0.0000; + 7217 1 76.39 21.64 0 0 7 0.9927775 -39.002547 115 4 1.1 0.9 760.1600 70.4700 0.0000 0.0000; + 7218 1 48.11 13.63 0 0 7 0.9910241 -42.506976 115 5 1.1 0.9 1212.5700 210.9600 0.0000 0.0000; + 7219 1 1.25 0.36 0 0 7 1.0018891 -36.599197 115 1 1.1 0.9 731.1200 165.1800 0.0000 0.0000; + 7220 1 141.27 40.03 0 0 7 0.9930716 -38.967396 115 3 1.1 0.9 967.9600 -89.2400 0.0000 0.0000; + 7221 1 169.58 48.05 0 0 7 0.9921054 -38.648329 115 3 1.1 0.9 825.3100 32.6200 0.0000 0.0000; + 7222 1 86.99 24.65 0 0 7 0.9910781 -37.57721 115 3 1.1 0.9 887.6500 53.1300 0.0000 0.0000; + 7223 1 49.62 14.06 0 0 7 0.9968796 -38.908139 115 5 1.1 0.9 923.4900 57.9600 0.0000 0.0000; + 7224 1 30.77 8.72 0 0 7 0.9908009 -39.179003 115 3 1.1 0.9 792.8700 124.1100 0.0000 0.0000; + 7225 1 111.44 31.57 0 0 7 0.9880072 -40.870455 115 3 1.1 0.9 1271.9700 69.3400 0.0000 0.0000; + 7226 1 45.25 12.82 0 0 7 0.9985224 -38.414418 115 3 1.1 0.9 925.7500 -63.9400 0.0000 0.0000; + 7227 1 0 0 0 0 7 1.0273034 -29.738729 500 3 1.1 0.9 18.5400 -7.0500 0.0000 0.0000; + 7228 1 0 0 0 0 7 1.0109201 -33.678405 230 3 1.1 0.9 54.4200 -9.7700 0.0000 0.0000; + 7229 1 285.41 80.87 0 0 7 1.004637 -36.058845 115 3 1.1 0.9 235.6000 50.7500 0.0000 0.0000; + 7230 1 7.37 2.09 0 0 7 1.0075927 -38.220984 115 1 1.1 0.9 884.6800 167.4500 0.0000 0.0000; + 7231 1 50.85 14.41 0 0 7 0.9978768 -34.637768 115 4 1.1 0.9 216.8200 -9.7600 0.0000 0.0000; + 7232 1 42.92 12.16 0 0 7 1.0230171 -34.434779 115 2 1.1 0.9 112.1300 -5.9500 0.0000 0.0000; + 7233 1 33.2 9.41 0 0 7 0.990549 -42.818364 115 5 1.1 0.9 1059.4100 170.3100 0.0000 0.0000; + 7234 1 77.31 21.9 0 0 7 0.9990666 -40.716925 115 5 1.1 0.9 443.9100 39.4600 0.0000 0.0000; + 7235 1 151.62 42.96 0 221.03 7 1.0300027 -42.158809 115 3 1.1 0.9 1316.4800 0.0000 0.0000 0.0000; + 7236 1 38.27 10.84 0 247.16 7 1.0300028 -40.878677 115 5 1.1 0.9 586.8100 0.0000 0.0000 0.0000; + 7237 1 15.09 4.28 0 0 7 0.9873254 -38.63837 115 1 1.1 0.9 660.8400 203.4600 0.0000 0.0000; + 7238 1 47.85 13.56 0 88.8 7 1.0209741 -36.30707 115 4 1.1 0.9 261.5000 38.4600 0.0000 0.0000; + 7239 1 42.4 12.01 0 0 7 1.0005543 -35.264978 115 4 1.1 0.9 207.3400 18.4600 0.0000 0.0000; + 7240 1 107.69 30.51 0 0 7 1.0014366 -39.131091 115 3 1.1 0.9 1200.1900 -507.3300 0.0000 0.0000; + 7241 1 104.32 29.56 0 0 7 0.9885259 -39.707564 115 3 1.1 0.9 778.8300 81.4100 0.0000 0.0000; + 7242 1 80.14 22.71 0 0 7 0.9899878 -39.758802 115 3 1.1 0.9 627.2900 53.4200 0.0000 0.0000; + 7243 1 78.71 22.3 0 0 7 0.9987961 -37.846447 115 4 1.1 0.9 316.8000 44.7000 0.0000 0.0000; + 7244 1 38.02 10.77 0 0 7 0.9927243 -36.694318 115 3 1.1 0.9 1227.8100 159.0800 0.0000 0.0000; + 7245 1 98.79 27.99 0 0 7 0.9991022 -40.972069 115 5 1.1 0.9 532.9700 43.9500 0.0000 0.0000; + 7246 1 199.51 56.53 0 0 7 0.9825628 -41.156279 115 3 1.1 0.9 1509.8000 99.3800 0.0000 0.0000; + 7247 1 9.2 2.61 0 0 7 0.9965269 -34.370248 115 1 1.1 0.9 478.7600 158.6800 0.0000 0.0000; + 7248 1 220.52 62.48 0 0 7 0.9867458 -39.863295 115 3 1.1 0.9 771.3800 192.4400 0.0000 0.0000; + 7249 1 71.82 20.35 0 0 7 0.989979 -38.838833 115 3 1.1 0.9 725.0100 84.5000 0.0000 0.0000; + 7250 1 32.62 9.24 0 0 7 1.0009014 -37.958679 115 3 1.1 0.9 708.0300 62.1100 0.0000 0.0000; + 7251 1 35.62 10.09 0 0 7 0.9974407 -42.513252 115 5 1.1 0.9 1270.8200 117.0600 0.0000 0.0000; + 7252 1 0 0 0 0 7 1.0191213 -29.827463 230 2 1.1 0.9 -219.9200 -105.5300 0.0000 0.0000; + 7253 1 90.93 25.76 0 0 7 1.0051041 -33.0525 115 2 1.1 0.9 1858.8600 316.9600 0.0000 0.0000; + 7254 1 50.13 14.2 0 0 7 1.0189635 -41.818058 115 5 1.1 0.9 216.0500 20.0600 0.0000 0.0000; + 7255 1 58.99 16.71 0 0 7 0.9985601 -36.857623 115 3 1.1 0.9 671.3100 80.0100 0.0000 0.0000; + 7256 1 86.86 24.61 0 0 7 0.9935603 -37.977832 115 3 1.1 0.9 1014.9500 47.6600 0.0000 0.0000; + 7257 1 127.15 36.03 0 0 7 0.9897062 -36.686965 115 4 1.1 0.9 1305.9600 235.2800 0.0000 0.0000; + 7258 1 42.99 12.18 0 0 7 0.9939123 -37.953866 115 3 1.1 0.9 752.4400 77.1800 0.0000 0.0000; + 7259 1 146.05 41.38 0 0 7 1.0025731 -37.600168 115 4 1.1 0.9 594.7300 45.0600 0.0000 0.0000; + 7260 1 124.64 35.31 0 0 7 1.0011852 -35.693839 115 4 1.1 0.9 265.3200 49.1600 0.0000 0.0000; + 7261 1 0 0 0 0 7 1.0205503 -26.303651 230 1 1.1 0.9 107.0800 4.6900 0.0000 0.0000; + 7262 1 72.03 20.41 0 70.93 7 1.0288694 -28.39449 115 1 1.1 0.9 140.8500 0.0000 0.0000 0.0000; + 7263 1 0 0 0 0 7 1.0280798 -24.64466 500 4 1.1 0.9 37.7700 -5.8500 0.0000 0.0000; + 7264 1 0 0 0 0 7 1.0206883 -27.636311 230 4 1.1 0.9 40.1100 -15.5100 0.0000 0.0000; + 7265 1 62.91 17.82 0 0 7 1.0043784 -32.972872 115 4 1.1 0.9 169.5000 -2.9600 0.0000 0.0000; + 7266 2 0 0 0 0 7 1.0256687 -23.369601 13.8 4 1.1 0.9 37.8600 -5.8800 0.0000 0.0000; + 7267 2 0 0 0 0 7 1.0235243 -22.436347 13.8 4 1.1 0.9 38.1900 -5.9100 0.0000 0.0000; + 7268 2 0 0 0 0 7 1.0268112 -23.957194 13.8 4 1.1 0.9 37.9000 -5.8700 0.0000 0.0000; + 7269 2 0 0 0 0 7 1.0238371 -22.658806 13.8 4 1.1 0.9 38.1600 -5.9100 0.0000 0.0000; + 7270 2 0 0 0 0 7 1.0258358 -23.46098 13.8 4 1.1 0.9 37.8900 -5.8800 0.0000 0.0000; + 7271 1 28.45 8.06 0 0 7 0.9947876 -40.69341 115 3 1.1 0.9 1174.2100 74.7100 0.0000 0.0000; + 7272 1 45.88 13 0 0 7 0.9930027 -37.431946 115 3 1.1 0.9 1059.9800 43.5400 0.0000 0.0000; + 7273 1 39.39 11.16 0 215.81 7 1.0300027 -35.164559 115 2 1.1 0.9 170.7800 0.0000 0.0000 0.0000; + 7274 1 0 0 0 0 7 1.0156687 -34.054269 230 6 1.1 0.9 60.8000 2.0000 0.0000 0.0000; + 7275 1 42.31 11.99 0 0 7 1.0135852 -35.81218 115 6 1.1 0.9 65.1400 4.6100 0.0000 0.0000; + 7276 1 88.67 25.12 0 457.62 7 1.0137846 -39.490635 115 3 1.1 0.9 685.5000 54.4400 0.0000 0.0000; + 7277 1 15.99 4.53 0 37.77 7 1.0300026 -36.061212 115 6 1.1 0.9 172.2000 0.0000 0.0000 0.0000; + 7278 1 0 0 0 0 7 1.0153657 -29.800905 230 4 1.1 0.9 103.2000 6.9100 0.0000 0.0000; + 7279 1 148.52 42.08 0 0 7 1.0118517 -33.029681 115 4 1.1 0.9 222.2000 22.3900 0.0000 0.0000; + 7280 2 0 0 0 0 7 1.0153657 -29.800905 13.8 4 1.1 0.9 103.2000 6.9100 0.0000 0.0000; + 7281 2 0 0 0 0 7 1.0153657 -29.800905 13.8 4 1.1 0.9 103.2000 6.9100 0.0000 0.0000; + 7282 1 0 0 0 0 7 1.0220341 -28.280284 230 4 1.1 0.9 32.4600 -10.4400 0.0000 0.0000; + 7283 1 109.47 31.02 0 0 7 1.0010982 -32.720783 115 4 1.1 0.9 206.3200 9.7300 0.0000 0.0000; + 7284 2 0 0 0 0 7 1.0220341 -28.280284 13.2 4 1.1 0.9 32.4600 -10.4400 0.0000 0.0000; + 7285 2 0 0 0 0 7 1.0221494 -27.237781 13.2 4 1.1 0.9 32.8300 -10.4500 0.0000 0.0000; + 7286 2 0 0 0 0 7 1.0222695 -25.881089 13.2 4 1.1 0.9 33.2800 -10.4800 0.0000 0.0000; + 7287 2 0 0 0 0 7 1.0220436 -26.20322 13.2 4 1.1 0.9 33.1900 -10.4700 0.0000 0.0000; + 7288 2 0 0 0 0 7 1.0222422 -26.068537 13.2 4 1.1 0.9 33.2200 -10.4700 0.0000 0.0000; + 7289 2 0 0 0 0 7 1.0222545 -26.631152 13.2 4 1.1 0.9 33.0300 -10.4600 0.0000 0.0000; + 7290 1 63.77 18.07 0 0 7 0.9875749 -41.340226 115 5 1.1 0.9 368.6700 56.7200 0.0000 0.0000; + 7291 1 101.91 28.88 0 0 7 0.977313 -40.850608 115 5 1.1 0.9 452.1900 73.1000 0.0000 0.0000; + 7292 1 94.1 26.66 0 0 7 1.0020552 -37.897639 115 5 1.1 0.9 858.5200 51.2700 0.0000 0.0000; + 7293 1 15.94 4.52 0 0 7 1.0037643 -34.958739 115 2 1.1 0.9 1568.1300 410.2300 0.0000 0.0000; + 7294 1 7.25 2.05 0 30 7 1.0273797 -32.915193 115 4 1.1 0.9 151.8500 0.0000 0.0000 0.0000; + 7295 1 104.37 29.57 0 0 7 0.9893437 -39.832963 115 5 1.1 0.9 432.1000 74.3800 0.0000 0.0000; + 7296 1 93.84 26.59 0 0 7 0.984002 -40.410429 115 3 1.1 0.9 2043.7600 379.4400 0.0000 0.0000; + 7297 1 93.77 26.57 0 0 7 0.9869762 -38.349751 115 3 1.1 0.9 938.9200 92.1800 0.0000 0.0000; + 7298 1 101.23 28.68 0 0 7 0.9904072 -39.6189 115 3 1.1 0.9 741.7100 76.6700 0.0000 0.0000; + 7299 1 18.4 5.21 0 0 7 0.9899927 -37.224577 115 1 1.1 0.9 675.6200 149.5900 0.0000 0.0000; + 7300 1 54.35 15.4 0 194.22 7 1.0300028 -41.873396 115 5 1.1 0.9 376.7700 0.0000 0.0000 0.0000; + 7301 1 69.18 19.6 0 0 7 0.9875543 -36.465412 115 4 1.1 0.9 2374.9000 494.7600 0.0000 0.0000; + 7302 1 24.43 6.92 0 0 7 1.0099673 -31.146336 115 1 1.1 0.9 253.5200 101.9700 0.0000 0.0000; + 7303 1 6.49 1.84 0 0 7 1.0156153 -34.145565 115 1 1.1 0.9 203.8300 76.8800 0.0000 0.0000; + 7304 1 0 0 0 0 7 1.0226979 -24.721325 500 1 1.1 0.9 27.1700 3.3800 0.0000 0.0000; + 7305 1 0 0 0 0 7 1.0196647 -28.787377 230 1 1.1 0.9 32.1600 12.0400 0.0000 0.0000; + 7306 1 7.69 2.18 0 0 7 1.0086997 -33.302664 115 1 1.1 0.9 579.7000 117.0700 0.0000 0.0000; + 7307 2 0 0 0 0 7 1.0331586 -23.596597 24 1 1.1 0.9 27.0100 3.3100 0.0000 0.0000; + 7308 2 0 0 0 0 7 1.0325419 -23.648171 24 1 1.1 0.9 27.0300 3.3100 0.0000 0.0000; + 7309 2 0 0 0 0 7 1.0226979 -24.721325 24 1 1.1 0.9 27.1700 3.3800 0.0000 0.0000; + 7310 2 0 0 0 0 7 1.0400022 -22.76495 24 1 1.1 0.9 26.9000 3.2600 0.0000 0.0000; + 7311 2 0 0 0 0 7 1.0339783 -23.506785 24 1 1.1 0.9 27.0000 3.3000 0.0000 0.0000; + 7312 1 0 0 0 0 7 1.0244197 -29.083232 230 2 1.1 0.9 -19.3700 -26.4700 0.0000 0.0000; + 7313 1 86.22 24.43 0 0 7 1.0061405 -32.695148 115 2 1.1 0.9 938.3500 251.3200 0.0000 0.0000; + 7314 1 28.76 8.15 0 0 7 0.9857607 -40.381984 115 5 1.1 0.9 1122.3800 63.7200 0.0000 0.0000; + 7315 1 69.31 19.64 0 0 7 1.0110248 -40.073269 115 3 1.1 0.9 1335.0100 34.9300 0.0000 0.0000; + 7316 1 63.23 17.92 0 0 7 0.9885943 -37.586772 115 3 1.1 0.9 1000.2600 84.4600 0.0000 0.0000; + 7317 1 142.91 40.49 0 0 7 0.9954782 -35.524835 115 4 1.1 0.9 1548.0000 301.3300 0.0000 0.0000; + 7318 1 112.16 31.78 0 0 7 0.9850881 -37.813726 115 4 1.1 0.9 1801.8700 300.1400 0.0000 0.0000; + 7319 1 30.19 8.55 0 0 7 0.9894426 -39.659246 115 5 1.1 0.9 442.2900 58.5100 0.0000 0.0000; + 7320 1 0 0 0 0 7 1.0347238 -27.357443 500 2 1.1 0.9 -35.9300 -2.8100 0.0000 0.0000; + 7321 1 0 0 0 0 7 1.0280999 -28.648251 230 2 1.1 0.9 -6.6300 -6.8600 0.0000 0.0000; + 7322 1 0 0 0 0 7 1.0161251 -31.943167 115 2 1.1 0.9 185.7400 65.5900 0.0000 0.0000; + 7323 2 0 0 0 0 7 1.0319679 -26.92161 13.8 2 1.1 0.9 -35.8700 -2.8300 0.0000 0.0000; + 7324 2 0 0 0 0 7 1.0309205 -26.769068 13.8 2 1.1 0.9 -35.8600 -2.8400 0.0000 0.0000; + 7325 2 0 0 0 0 7 1.0308924 -26.766152 13.8 2 1.1 0.9 -35.8600 -2.8400 0.0000 0.0000; + 7326 2 0 0 0 0 7 1.0328824 -27.069625 13.8 2 1.1 0.9 -35.8900 -2.8200 0.0000 0.0000; + 7327 1 0 0 0 0 7 1.0221369 -29.346258 230 1 1.1 0.9 -1.5400 -4.4600 0.0000 0.0000; + 7328 1 0 0 0 0 7 1.0159226 -31.007864 115 1 1.1 0.9 113.4000 66.0800 0.0000 0.0000; + 7329 2 0 0 0 0 7 1.0400025 -28.565227 13.8 1 1.1 0.9 -1.2600 0.0000 0.0000 0.0000; + 7330 1 196.05 55.55 0 0 7 0.9927563 -38.80765 115 3 1.1 0.9 849.8400 -32.0300 0.0000 0.0000; + 7331 1 0 0 0 0 7 1.0273033 -26.740179 500 4 1.1 0.9 18.6200 -11.1900 0.0000 0.0000; + 7332 1 0 0 0 0 7 1.0151778 -29.604372 230 4 1.1 0.9 -140.3700 -82.2800 0.0000 0.0000; + 7333 1 29.21 8.27 0 0 7 0.9997779 -35.199862 115 4 1.1 0.9 1354.7500 77.8500 0.0000 0.0000; + 7334 2 0 0 0 0 7 1.0273033 -26.740179 20 4 1.1 0.9 18.6200 -11.1900 0.0000 0.0000; + 7335 2 0 0 0 0 7 1.0400028 -26.065539 20 4 1.1 0.9 18.9300 0.0000 0.0000 0.0000; + 7336 1 107.69 30.51 0 0 7 1.0027689 -37.166272 115 3 1.1 0.9 416.0400 254.2500 0.0000 0.0000; + 7337 1 24.56 6.96 0 0 7 1.0100685 -37.130351 115 6 1.1 0.9 232.6900 17.8000 0.0000 0.0000; + 7338 1 109.2 30.94 0 0 7 0.9915095 -37.703388 115 4 1.1 0.9 836.2400 76.4900 0.0000 0.0000; + 7339 1 32.04 9.08 0 0 7 1.0021564 -33.062349 115 1 1.1 0.9 284.3900 118.0100 0.0000 0.0000; + 7340 1 38.64 10.95 0 0 7 0.9849448 -40.647462 115 3 1.1 0.9 1000.6000 103.4600 0.0000 0.0000; + 7341 1 0 0 0 0 7 1.0189533 -27.373793 500 3 1.1 0.9 39.7500 -8.6800 0.0000 0.0000; + 7342 1 0 0 0 0 7 1.0089995 -32.61388 230 3 1.1 0.9 -57.4500 -52.4300 0.0000 0.0000; + 7343 1 184.8 52.36 0 0 7 0.9824264 -37.86463 115 3 1.1 0.9 225.8100 67.5200 0.0000 0.0000; + 7344 1 101.41 28.73 0 0 7 0.9846474 -40.210953 115 3 1.1 0.9 673.5300 71.3500 0.0000 0.0000; + 7345 1 73.37 20.79 0 0 7 0.9931515 -37.113093 115 4 1.1 0.9 772.5400 109.7500 0.0000 0.0000; + 7346 1 0 0 0 0 7 1.0328524 -24.007066 500 3 1.1 0.9 19.2300 -4.7800 0.0000 0.0000; + 7347 1 0 0 0 0 7 1.021348 -27.747684 230 3 1.1 0.9 -80.5700 -68.8500 0.0000 0.0000; + 7348 1 0 0 0 0 7 1.0123994 -31.404218 115 3 1.1 0.9 1386.1300 79.9800 0.0000 0.0000; + 7349 2 0 0 0 0 7 1.0400027 -23.072726 13.8 3 1.1 0.9 19.3700 0.0000 0.0000 0.0000; + 7350 2 0 0 0 0 7 1.0400027 -21.766127 13.8 3 1.1 0.9 19.4800 0.0000 0.0000 0.0000; + 7351 2 0 0 0 0 7 1.0400027 -21.034917 13.8 3 1.1 0.9 19.5400 0.0000 0.0000 0.0000; + 7352 2 0 0 0 0 7 1.0400027 -21.251547 13.8 3 1.1 0.9 19.5300 0.0000 0.0000 0.0000; + 7353 2 0 0 0 0 7 1.0400027 -20.194405 13.8 3 1.1 0.9 19.6400 0.0000 0.0000 0.0000; + 7354 2 0 0 0 0 7 1.0400027 -21.894712 13.8 3 1.1 0.9 19.4700 0.0000 0.0000 0.0000; + 7355 2 0 0 0 0 7 1.0400027 -21.875755 13.8 3 1.1 0.9 19.4700 0.0000 0.0000 0.0000; + 7356 2 0 0 0 0 7 1.0400027 -22.094458 13.8 3 1.1 0.9 19.4900 0.0000 0.0000 0.0000; + 7357 2 0 0 0 0 7 1.0361943 -23.656071 13.8 3 1.1 0.9 19.2800 -4.7500 0.0000 0.0000; + 7358 2 0 0 0 0 7 1.0400027 -21.46175 13.8 3 1.1 0.9 19.4900 0.0000 0.0000 0.0000; + 7359 2 0 0 0 0 7 1.0400027 -22.927306 13.8 3 1.1 0.9 19.3800 0.0000 0.0000 0.0000; + 7360 2 0 0 0 0 7 1.0400027 -22.198673 13.8 3 1.1 0.9 19.4300 0.0000 0.0000 0.0000; + 7361 2 0 0 0 0 7 1.0400027 -22.665073 13.8 3 1.1 0.9 19.3800 0.0000 0.0000 0.0000; + 7362 1 56.02 15.87 0 0 7 0.9877936 -39.446389 115 3 1.1 0.9 805.3800 80.2800 0.0000 0.0000; + 7363 1 26.59 7.53 0 0 7 1.0032193 -35.478859 115 2 1.1 0.9 1209.8900 478.8800 0.0000 0.0000; + 7364 1 14.27 4.04 0 0 7 0.9855051 -38.612754 115 1 1.1 0.9 659.6300 149.8200 0.0000 0.0000; + 7365 1 80.97 22.94 0 0 7 0.9952937 -38.5897 115 4 1.1 0.9 463.0400 51.3800 0.0000 0.0000; + 7366 1 0 0 0 0 7 1.0305925 -25.364394 500 4 1.1 0.9 48.8500 -1.9700 0.0000 0.0000; + 7367 1 0 0 0 0 7 1.0166454 -29.802881 230 4 1.1 0.9 106.8000 14.4000 0.0000 0.0000; + 7368 1 0 0 0 0 7 1.0055832 -34.483163 115 4 1.1 0.9 245.0700 49.1400 0.0000 0.0000; + 7369 2 0 0 0 0 7 1.0400028 -23.518086 18 4 1.1 0.9 48.9000 0.0000 0.0000 0.0000; + 7370 2 0 0 0 0 7 1.0400028 -23.017264 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7371 2 0 0 0 0 7 1.0400028 -23.425025 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7372 2 0 0 0 0 7 1.0400028 -23.564 18 4 1.1 0.9 48.9000 0.0000 0.0000 0.0000; + 7373 2 0 0 0 0 7 1.0368587 -24.688175 18 4 1.1 0.9 48.8900 -1.9500 0.0000 0.0000; + 7374 2 0 0 0 0 7 1.0400028 -23.914142 18 4 1.1 0.9 48.9000 0.0000 0.0000 0.0000; + 7375 2 0 0 0 0 7 1.0400028 -22.721053 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7376 2 0 0 0 0 7 1.0400028 -22.925466 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7377 2 0 0 0 0 7 1.0400028 -23.514295 18 4 1.1 0.9 48.9000 0.0000 0.0000 0.0000; + 7378 2 0 0 0 0 7 1.0400028 -23.037683 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7379 2 0 0 0 0 7 1.0400028 -23.215437 18 4 1.1 0.9 48.9100 0.0000 0.0000 0.0000; + 7380 1 52.24 14.8 0 0 7 1.0084931 -33.083932 115 2 1.1 0.9 903.2800 512.2600 0.0000 0.0000; + 7381 1 94.75 26.85 0 0 7 0.9970172 -39.40431 115 4 1.1 0.9 548.3800 48.1300 0.0000 0.0000; + 7382 1 78.13 22.14 0 0 7 0.9887354 -38.153162 115 3 1.1 0.9 937.3000 138.2500 0.0000 0.0000; + 7383 1 85.59 24.25 0 0 7 0.9951655 -33.888996 115 2 1.1 0.9 1186.0700 170.6400 0.0000 0.0000; + 7384 1 66.87 18.95 0 0 7 0.9888157 -38.958399 115 3 1.1 0.9 828.6300 98.3500 0.0000 0.0000; + 7385 1 135.24 38.32 0 0 7 0.9907025 -40.241978 115 3 1.1 0.9 765.5200 123.2200 0.0000 0.0000; + 7386 1 111.8 31.68 0 0 7 0.9939336 -39.116008 115 3 1.1 0.9 634.1600 262.2000 0.0000 0.0000; + 7387 1 160.73 45.54 0 0 7 0.9841147 -39.487781 115 4 1.1 0.9 169.4600 46.3000 0.0000 0.0000; + 7388 1 125.97 35.69 0 0 7 0.9966853 -39.776472 115 3 1.1 0.9 782.8600 80.2900 0.0000 0.0000; + 7389 2 0 0 0 0 7 1.0367512 -34.445379 500 5 1.1 0.9 42.9200 -4.0700 0.0000 0.0000; + 7390 1 0 0 0 0 7 1.0282107 -37.155822 230 5 1.1 0.9 26.6000 -11.3800 0.0000 0.0000; + 7391 1 42.84 12.14 0 0 7 1.0121663 -39.020053 115 5 1.1 0.9 772.7300 215.5800 0.0000 0.0000; + 7392 1 52.03 14.74 0 0 7 1.0094366 -34.806489 115 4 1.1 0.9 234.8400 26.7900 0.0000 0.0000; + 7393 1 7.31 2.07 0 0 7 1.0012132 -34.257211 115 1 1.1 0.9 438.8700 146.9900 0.0000 0.0000; + 7394 1 37.41 10.6 0 0 7 0.9873534 -38.342415 115 4 1.1 0.9 293.5600 66.5000 0.0000 0.0000; + 7395 1 70.42 19.95 0 0 7 0.9956667 -39.739066 115 3 1.1 0.9 788.4500 64.0800 0.0000 0.0000; + 7396 1 25.49 7.22 0 0 7 0.9891939 -38.927758 115 3 1.1 0.9 1530.6900 132.0200 0.0000 0.0000; + 7397 1 105.72 29.95 0 100 7 1.0162396 -39.799997 115 3 1.1 0.9 1048.9200 150.5400 0.0000 0.0000; + 7398 1 73.59 20.85 0 0 7 0.9990103 -35.828818 115 4 1.1 0.9 556.6800 82.0900 0.0000 0.0000; + 7399 1 56.83 16.1 0 0 7 0.9969729 -37.529907 115 3 1.1 0.9 703.2900 72.5100 0.0000 0.0000; + 7400 2 0 0 0 0 7 1.0269829 -25.97347 500 4 1.1 0.9 33.4300 -7.7300 0.0000 0.0000; + 7401 1 0 0 0 0 7 1.0178573 -29.07464 230 4 1.1 0.9 29.9300 -20.3200 0.0000 0.0000; + 7402 1 0 0 0 0 7 1.0080092 -33.744931 115 4 1.1 0.9 216.5400 44.6900 0.0000 0.0000; + 7403 1 69.67 19.74 0 0 7 0.9983346 -35.407817 115 4 1.1 0.9 399.0100 33.8200 0.0000 0.0000; + 7404 1 177.73 50.36 0 0 7 0.9869937 -40.658622 115 5 1.1 0.9 648.3000 67.6200 0.0000 0.0000; + 7405 1 53.26 15.09 0 0 7 1.0151963 -34.302084 115 2 1.1 0.9 101.2500 -6.1300 0.0000 0.0000; + 7406 2 0 0 0 0 7 1.0218191 -28.843978 500 6 1.1 0.9 75.4400 3.4500 0.0000 0.0000; + 7407 1 0 0 0 0 7 1.019883 -29.921463 230 6 1.1 0.9 128.8700 -15.0800 0.0000 0.0000; + 7408 1 53.66 15.2 0 0 7 1.0008913 -33.042019 115 6 1.1 0.9 114.1300 -1.9100 0.0000 0.0000; + 7409 1 0 0 0 0 7 1.0077839 -33.243876 230 3 1.1 0.9 -100.6300 -67.0300 0.0000 0.0000; + 7410 1 215.67 61.11 0 0 7 0.9923129 -38.007666 115 3 1.1 0.9 1785.4300 176.6700 0.0000 0.0000; + 7411 1 69.41 19.67 0 0 7 0.9948022 -41.252187 115 5 1.1 0.9 376.2700 54.1500 0.0000 0.0000; + 7412 1 8.59 2.43 0 0 7 1.0002475 -34.275085 115 2 1.1 0.9 1667.7400 259.9100 0.0000 0.0000; + 7413 1 42.91 12.16 0 0 7 1.0015679 -35.304194 115 1 1.1 0.9 682.5700 143.2800 0.0000 0.0000; + 7414 2 0 0 0 0 7 1.0237228 -31.919643 500 6 1.1 0.9 58.5500 -5.0300 0.0000 0.0000; + 7415 1 0 0 0 0 7 1.0182699 -32.36394 230 6 1.1 0.9 86.7800 -0.7000 0.0000 0.0000; + 7416 1 0 0 0 0 7 1.0123544 -34.533923 115 6 1.1 0.9 89.4100 9.4400 0.0000 0.0000; + 7417 1 97.88 27.73 0 0 7 1.0047252 -38.691863 115 3 1.1 0.9 698.7900 119.2800 0.0000 0.0000; + 7418 1 48.22 13.66 0 0 7 1.0051305 -38.258018 115 3 1.1 0.9 588.0800 168.3900 0.0000 0.0000; + 7419 2 107 30.32 0 0 7 1.0000027 -33.522698 115 4 1.1 0.9 306.4200 0.0000 0.0000 0.0000; + 7420 1 0 0 0 0 7 1.0093205 -36.652252 230 5 1.1 0.9 -39.2100 -46.0000 0.0000 0.0000; + 7421 1 90.64 25.68 0 0 7 0.9943574 -41.329129 115 5 1.1 0.9 1356.7900 233.1800 0.0000 0.0000; + 7422 2 0 0 0 0 7 1.0400028 -27.416988 500 2 1.1 0.9 -49.7100 0.0000 0.0000 0.0000; + 7423 1 0 0 0 0 7 1.0216486 -30.178074 230 2 1.1 0.9 -215.0100 -105.4200 0.0000 0.0000; + 7424 1 139.88 39.63 0 0 7 1.0036824 -34.222454 115 2 1.1 0.9 1780.6900 367.3400 0.0000 0.0000; + 7425 1 105.98 30.03 0 0 7 0.9881105 -40.843773 115 3 1.1 0.9 1528.7900 66.8900 0.0000 0.0000; + 7426 1 41.8 11.84 0 0 7 0.9940253 -33.070355 115 2 1.1 0.9 385.6800 137.7900 0.0000 0.0000; + 7427 1 156.45 44.33 0 0 7 0.986157 -40.552681 115 3 1.1 0.9 1164.9800 97.5900 0.0000 0.0000; + 7428 2 0 0 0 0 7 1.0400027 -27.480479 500 2 1.1 0.9 12.4400 0.0000 0.0000 0.0000; + 7429 1 0 0 0 0 7 1.0288833 -28.411379 230 2 1.1 0.9 28.9000 -6.5400 0.0000 0.0000; + 7430 1 46.92 13.29 0 0 7 1.0092213 -32.181141 115 2 1.1 0.9 767.2400 232.2700 0.0000 0.0000; + 7431 1 35.57 10.08 0 0 7 0.9969641 -40.175357 115 5 1.1 0.9 393.9700 89.3300 0.0000 0.0000; + 7432 1 22.94 6.5 0 0 7 1.0113532 -59.548956 115 5 1.1 0.9 169.1100 12.6300 0.0000 0.0000; + 8001 1 10.82 3.07 0 0 8 1.0229121 -57.489613 115 7 1.1 0.9 101.5000 12.0400 0.0000 0.0000; + 8002 1 11.81 3.35 0 0 8 1.0165544 -70.526638 115 8 1.1 0.9 629.1800 -42.9100 0.0000 0.0000; + 8003 1 11.99 3.4 0 37.97 8 1.0300034 -58.854885 115 7 1.1 0.9 128.4400 0.0000 0.0000 0.0000; + 8004 1 0 0 0 0 8 1.0256336 -58.229126 230 8 1.1 0.9 230.5000 -0.9700 0.0000 0.0000; + 8005 1 102.01 28.9 0 140.21 8 1.0300034 -59.456515 115 8 1.1 0.9 259.5100 0.0000 0.0000 0.0000; + 8006 1 37.4 10.6 0 71 8 1.027022 -67.547643 115 8 1.1 0.9 14.9100 0.0000 0.0000 0.0000; + 8007 1 30.07 8.52 0 0 8 1.0117128 -68.495317 115 8 1.1 0.9 123.2500 21.7600 0.0000 0.0000; + 8008 1 39.22 11.11 0 0 8 0.9883101 -71.257296 115 8 1.1 0.9 340.6600 23.9300 0.0000 0.0000; + 8009 1 9.81 2.78 0 0 8 0.9985149 -43.129697 115 7 1.1 0.9 924.2200 202.4500 0.0000 0.0000; + 8010 1 5.39 1.53 0 0 8 1.0202252 -56.223115 115 7 1.1 0.9 81.0500 13.4200 0.0000 0.0000; + 8011 1 27.25 7.72 0 0 8 1.0043286 -61.506058 115 7 1.1 0.9 340.1400 50.9500 0.0000 0.0000; + 8012 1 7.6 2.15 0 0 8 1.0168369 -42.323274 115 7 1.1 0.9 358.7800 84.7300 0.0000 0.0000; + 8013 1 60.03 17.01 0 50 8 1.0055883 -71.751164 115 8 1.1 0.9 466.4500 9.6600 0.0000 0.0000; + 8014 1 15.15 4.29 0 0 8 0.9997178 -64.21724 115 7 1.1 0.9 264.3600 24.4400 0.0000 0.0000; + 8015 1 23.93 6.78 0 0 8 1.0086374 -63.951676 115 8 1.1 0.9 463.1500 -27.0100 0.0000 0.0000; + 8016 1 69.86 19.79 0 54.97 8 1.030003 -47.69866 115 7 1.1 0.9 1256.5200 0.0000 0.0000 0.0000; + 8017 1 18.44 5.22 0 0 8 1.0041348 -68.676358 115 8 1.1 0.9 213.3800 27.7300 0.0000 0.0000; + 8018 1 0 0 0 0 8 1.0216998 -64.186095 230 8 1.1 0.9 394.3400 12.7500 0.0000 0.0000; + 8019 1 103.12 29.22 0 177.92 8 1.0300036 -68.466808 115 8 1.1 0.9 467.8100 0.0000 0.0000 0.0000; + 8020 1 17.35 4.92 0 0 8 0.9931819 -70.747704 115 8 1.1 0.9 415.3600 31.0700 0.0000 0.0000; + 8021 1 10.73 3.04 0 0 8 1.0196725 -63.721631 115 8 1.1 0.9 1035.4600 -183.4500 0.0000 0.0000; + 8022 1 6.89 1.95 0 16.68 8 1.0257431 -64.53758 115 8 1.1 0.9 778.9900 -117.2600 0.0000 0.0000; + 8023 1 0 0 0 0 8 1.0232461 -60.792374 115 8 1.1 0.9 303.9900 2.8500 0.0000 0.0000; + 8024 2 0 0 0 0 8 1.0250122 -57.401446 13.8 8 1.1 0.9 301.5400 3.0000 0.0000 0.0000; + 8025 1 50.76 14.38 0 51.21 8 1.0264944 -66.959357 115 8 1.1 0.9 447.6800 33.5500 0.0000 0.0000; + 8026 1 55.08 15.61 0 0 8 0.9947352 -72.133532 115 8 1.1 0.9 472.5100 12.0700 0.0000 0.0000; + 8027 1 39.38 11.16 0 0 8 1.0198753 -68.07415 115 8 1.1 0.9 -199.1100 68.3800 0.0000 0.0000; + 8028 1 24.06 6.82 0 0 8 1.0067769 -71.596252 115 8 1.1 0.9 634.0500 -32.0200 0.0000 0.0000; + 8029 1 25.65 7.27 0 0 8 0.9895107 -71.64037 115 8 1.1 0.9 426.2600 24.9500 0.0000 0.0000; + 8030 1 0 0 0 0 8 1.0326995 -36.707128 500 7 1.1 0.9 63.8400 2.3500 0.0000 0.0000; + 8031 1 0 0 0 0 8 1.0285487 -37.560525 230 7 1.1 0.9 86.9000 12.5100 0.0000 0.0000; + 8032 1 77.96 22.09 0 0 8 1.0212245 -41.532215 115 7 1.1 0.9 201.1600 55.9100 0.0000 0.0000; + 8033 2 0 0 0 0 8 1.0326995 -36.707127 13.8 7 1.1 0.9 63.8400 2.3500 0.0000 0.0000; + 8034 2 0 0 0 0 8 1.0326995 -36.707127 13.8 7 1.1 0.9 63.8400 2.3500 0.0000 0.0000; + 8035 2 0 0 0 0 8 1.0326995 -36.707128 13.8 7 1.1 0.9 63.8400 2.3500 0.0000 0.0000; + 8036 2 0 0 0 0 8 1.0326995 -36.707127 13.8 7 1.1 0.9 63.8400 2.3500 0.0000 0.0000; + 8037 1 11.29 3.2 0 0 8 1.0040627 -61.695885 115 7 1.1 0.9 208.8900 19.3000 0.0000 0.0000; + 8038 1 73.15 20.73 0 0 8 0.9951131 -64.070683 115 8 1.1 0.9 382.9900 44.8600 0.0000 0.0000; + 8039 1 12.61 3.57 0 0 8 1.0001988 -71.506078 115 8 1.1 0.9 434.3500 10.7300 0.0000 0.0000; + 8040 1 18.09 5.13 0 0 8 0.9930898 -68.213534 115 8 1.1 0.9 424.7100 37.3900 0.0000 0.0000; + 8041 1 52.77 14.95 0 50 8 1.0196968 -65.994408 115 8 1.1 0.9 871.5100 -161.9000 0.0000 0.0000; + 8042 1 27.31 7.74 0 0 8 1.001679 -64.45495 115 8 1.1 0.9 358.7400 13.9100 0.0000 0.0000; + 8043 1 0 0 0 0 8 1.0168011 -54.510367 500 7 1.1 0.9 33.6300 -1.3100 0.0000 0.0000; + 8044 1 0 0 0 0 8 1.0151643 -56.691542 230 7 1.1 0.9 38.0800 1.9000 0.0000 0.0000; + 8045 1 0 0 0 0 8 1.0132356 -59.864725 115 7 1.1 0.9 326.1900 49.7400 0.0000 0.0000; + 8046 2 0 0 0 0 8 1.0141975 -53.211547 18 7 1.1 0.9 33.6800 -1.3100 0.0000 0.0000; + 8047 2 0 0 0 0 8 1.0168011 -54.510367 18 7 1.1 0.9 33.6300 -1.3100 0.0000 0.0000; + 8048 2 0 0 0 0 8 1.0395073 -52.023918 18 7 1.1 0.9 33.6300 -110.3900 0.0000 0.0000; + 8049 2 0 0 0 0 8 1.0152685 -53.645511 18 7 1.1 0.9 33.6500 -1.3100 0.0000 0.0000; + 8050 2 0 0 0 0 8 1.0168011 -54.510367 18 7 1.1 0.9 33.6300 -1.3100 0.0000 0.0000; + 8051 2 0 0 0 0 8 1.0168011 -54.510367 18 7 1.1 0.9 33.6300 -1.3100 0.0000 0.0000; + 8052 1 15.19 4.3 0 0 8 1.0194075 -69.473497 115 8 1.1 0.9 448.2900 0.6700 0.0000 0.0000; + 8053 1 20.96 5.94 0 0 8 0.9898547 -70.02842 115 8 1.1 0.9 227.1700 12.9800 0.0000 0.0000; + 8054 1 16.16 4.58 0 0 8 0.9977824 -66.168003 115 7 1.1 0.9 299.7100 59.8300 0.0000 0.0000; + 8055 1 33.79 9.57 0 0 8 1.0196936 -64.773507 115 8 1.1 0.9 522.3700 5.9800 0.0000 0.0000; + 8056 1 10.55 2.99 0 0 8 1.0258525 -70.142867 115 8 1.1 0.9 552.5800 1.1100 0.0000 0.0000; + 8057 1 0 0 0 0 8 1.0257252 -57.766462 500 7 1.1 0.9 30.6600 -2.2900 0.0000 0.0000; + 8058 1 0 0 0 0 8 1.0184844 -57.498033 230 7 1.1 0.9 43.9100 6.7500 0.0000 0.0000; + 8059 1 0 0 0 0 8 1.0143207 -59.460598 115 7 1.1 0.9 117.9800 44.3400 0.0000 0.0000; + 8060 2 0 0 0 0 8 1.0257252 -57.766462 13.8 7 1.1 0.9 30.6600 -2.2900 0.0000 0.0000; + 8061 2 0 0 0 0 8 1.0257252 -57.766462 13.8 7 1.1 0.9 30.6600 -2.2900 0.0000 0.0000; + 8062 1 10.19 2.89 0 0 8 1.021633 -61.055603 115 8 1.1 0.9 635.4700 -24.9100 0.0000 0.0000; + 8063 1 69.38 19.66 0 0 8 1.0051362 -66.573969 115 8 1.1 0.9 706.8800 -83.1200 0.0000 0.0000; + 8064 1 21.23 6.01 0 0 8 1.0113515 -60.021289 115 7 1.1 0.9 143.3200 49.2100 0.0000 0.0000; + 8065 1 6.85 1.94 0 0 8 1.0006446 -66.333045 115 7 1.1 0.9 -25.9800 -18.4500 0.0000 0.0000; + 8066 1 3.23 0.92 0 0 8 0.9977296 -62.520835 115 8 1.1 0.9 529.6800 33.4100 0.0000 0.0000; + 8067 1 0 0 0 0 8 1.0132624 -51.882703 500 7 1.1 0.9 33.5800 -0.2900 0.0000 0.0000; + 8068 1 0 0 0 0 8 1.0193018 -52.702978 230 7 1.1 0.9 40.5400 4.6000 0.0000 0.0000; + 8069 1 0 0 0 0 8 1.0215831 -54.070607 115 7 1.1 0.9 54.5500 10.4600 0.0000 0.0000; + 8070 2 0 0 0 0 8 1.0132624 -51.882703 13.8 7 1.1 0.9 33.5800 -0.2900 0.0000 0.0000; + 8071 2 0 0 0 0 8 1.0000036 -46.395709 13.8 7 1.1 0.9 33.5400 0.0000 0.0000 0.0000; + 8072 1 70.08 19.86 0 0 8 0.9905165 -65.068278 115 8 1.1 0.9 373.9900 51.1300 0.0000 0.0000; + 8073 1 19.05 5.4 0 0 8 0.9961717 -71.35868 115 8 1.1 0.9 432.2800 15.7500 0.0000 0.0000; + 8074 1 0 0 0 0 8 1.0290596 -50.904302 500 8 1.1 0.9 68.0200 -1.5300 0.0000 0.0000; + 8075 1 0 0 0 0 8 1.0289245 -54.069821 230 8 1.1 0.9 34.5200 -17.6800 0.0000 0.0000; + 8076 1 0 0 0 0 8 1.0263568 -57.964344 115 8 1.1 0.9 410.4000 -62.4700 0.0000 0.0000; + 8077 2 0 0 0 0 8 1.0300037 -48.543958 13.8 8 1.1 0.9 68.0500 0.0000 0.0000 0.0000; + 8078 2 0 0 0 0 8 1.0300037 -48.417551 13.8 8 1.1 0.9 68.0300 0.0000 0.0000 0.0000; + 8079 2 0 0 0 0 8 1.0300037 -48.967288 13.8 8 1.1 0.9 68.0400 0.0000 0.0000 0.0000; + 8080 2 0 0 0 0 8 1.0300037 -48.67338 13.8 8 1.1 0.9 68.0400 0.0000 0.0000 0.0000; + 8081 1 26.05 7.38 0 0 8 1.0004248 -70.821694 115 8 1.1 0.9 413.4400 9.8800 0.0000 0.0000; + 8082 1 0 0 0 0 8 1.0326176 -46.457084 500 7 1.1 0.9 31.4300 0.1500 0.0000 0.0000; + 8083 1 0 0 0 0 8 1.0265714 -49.215951 230 7 1.1 0.9 36.7500 3.2300 0.0000 0.0000; + 8084 1 0 0 0 0 8 1.0145531 -53.55991 161 7 1.1 0.9 53.4200 9.8200 0.0000 0.0000; + 8085 1 0 0 0 0 8 1.0146683 -54.073106 161 7 1.1 0.9 57.3000 10.8700 0.0000 0.0000; + 8086 1 21.25 6.02 0 0 8 1.0155946 -55.438976 115 7 1.1 0.9 67.7300 13.2500 0.0000 0.0000; + 8087 2 0 0 0 0 8 1.0326176 -46.457084 18 7 1.1 0.9 31.4300 0.1500 0.0000 0.0000; + 8088 2 0 0 0 0 8 1.0400035 -43.63915 18 7 1.1 0.9 31.3900 0.0000 0.0000 0.0000; + 8089 1 21.47 6.08 0 0 8 1.0239769 -69.664558 115 8 1.1 0.9 499.9100 2.2700 0.0000 0.0000; + 8090 1 15.21 4.31 0 0 8 1.0152228 -67.531442 115 7 1.1 0.9 339.5600 48.8000 0.0000 0.0000; + 8091 1 11.87 3.36 0 35 8 1.029654 -63.12966 115 7 1.1 0.9 444.5300 0.0000 0.0000 0.0000; + 8092 1 7.11 2.01 0 0 8 1.0038364 -66.844169 115 7 1.1 0.9 315.9300 56.7300 0.0000 0.0000; + 8093 1 4.91 1.39 0 0 8 1.0135561 -59.045652 115 8 1.1 0.9 650.1400 9.9700 0.0000 0.0000; + 8094 1 0 0 0 0 8 1.0084979 -42.851696 230 7 1.1 0.9 81.0400 7.8200 0.0000 0.0000; + 8095 1 146.81 41.6 0 0 8 0.9982946 -45.809274 115 7 1.1 0.9 85.7700 8.8300 0.0000 0.0000; + 8096 1 11.17 3.16 0 0 8 0.9963482 -69.809251 115 8 1.1 0.9 354.7000 30.4100 0.0000 0.0000; + 8097 1 0 0 0 0 8 1.0276473 -57.808079 230 8 1.1 0.9 3.6200 -23.0000 0.0000 0.0000; + 8098 1 0 0 0 0 8 1.0222849 -61.265258 115 8 1.1 0.9 708.6800 -12.5900 0.0000 0.0000; + 8099 2 0 0 0 0 8 1.026992 -53.300946 13.8 8 1.1 0.9 7.3500 -23.2900 0.0000 0.0000; + 8100 1 41.13 11.65 0 0 8 1.0220752 -69.540681 115 8 1.1 0.9 631.0600 -49.1600 0.0000 0.0000; + 8101 1 12.54 3.55 0 0 8 1.0049675 -64.854057 115 8 1.1 0.9 544.4700 -45.2800 0.0000 0.0000; + 8102 1 4.76 1.35 0 0 8 1.0116826 -51.091927 115 7 1.1 0.9 111.1300 20.9900 0.0000 0.0000; + 8103 1 8.15 2.31 0 0 8 1.0194488 -55.280031 115 7 1.1 0.9 68.3600 12.1100 0.0000 0.0000; + 8104 1 46.53 13.18 0 0 8 1.0120466 -43.342949 115 7 1.1 0.9 611.4200 120.6400 0.0000 0.0000; + 8105 1 0 0 0 0 8 1.0200295 -55.99312 230 8 1.1 0.9 12.7700 -55.4100 0.0000 0.0000; + 8106 1 99.89 28.3 0 0 8 1.0043308 -59.92696 115 8 1.1 0.9 792.9900 30.9500 0.0000 0.0000; + 8107 1 9.21 2.61 0 30 8 1.0271647 -60.663718 115 8 1.1 0.9 523.5700 0.0000 0.0000 0.0000; + 8108 1 43.93 12.45 0 0 8 1.0039714 -72.204053 115 8 1.1 0.9 394.7900 12.3900 0.0000 0.0000; + 8109 1 51.76 14.67 0 0 8 0.9914129 -67.33047 115 8 1.1 0.9 694.1200 38.1000 0.0000 0.0000; + 8110 1 20.41 5.78 0 40 8 1.016374 -67.114796 115 8 1.1 0.9 336.5100 39.1700 0.0000 0.0000; + 8111 1 87.11 24.68 0 0 8 1.0140917 -62.970615 115 8 1.1 0.9 366.9800 2.9800 0.0000 0.0000; + 8112 1 0 0 0 0 8 1.0322691 -58.64923 500 8 1.1 0.9 22.7300 -2.6200 0.0000 0.0000; + 8113 1 0 0 0 0 8 1.0289294 -59.492689 230 8 1.1 0.9 20.1800 -4.0000 0.0000 0.0000; + 8114 1 24.41 6.92 0 0 8 1.0247931 -61.457637 115 8 1.1 0.9 245.1800 49.3500 0.0000 0.0000; + 8115 2 0 0 0 0 8 1.0322691 -58.64923 13.8 8 1.1 0.9 22.7300 -2.6200 0.0000 0.0000; + 8116 2 0 0 0 0 8 1.0322691 -58.64923 13.8 8 1.1 0.9 22.7300 -2.6200 0.0000 0.0000; + 8117 2 0 0 0 0 8 1.0400037 -57.300793 13.8 8 1.1 0.9 22.9100 0.0000 0.0000 0.0000; + 8118 1 36.62 10.38 0 0 8 1.0044775 -66.147424 115 7 1.1 0.9 319.9600 28.9200 0.0000 0.0000; + 8119 1 48 13.6 0 0 8 1.0225002 -59.969016 115 8 1.1 0.9 378.0900 -64.3000 0.0000 0.0000; + 8120 1 31.9 9.04 0 98.53 8 1.030003 -48.76716 115 7 1.1 0.9 122.1400 0.0000 0.0000 0.0000; + 8121 1 79.16 22.43 0 0 8 1.0151324 -65.349742 115 8 1.1 0.9 414.0200 52.4400 0.0000 0.0000; + 8122 1 29.41 8.33 0 0 8 1.0221169 -48.829359 115 7 1.1 0.9 1176.1200 -102.0300 0.0000 0.0000; + 8123 1 17.53 4.97 0 0 8 0.9954285 -66.757444 115 8 1.1 0.9 840.1000 53.5900 0.0000 0.0000; + 8124 1 20.2 5.72 0 0 8 1.0038419 -64.917204 115 8 1.1 0.9 328.0200 44.4200 0.0000 0.0000; + 8125 1 45.16 12.8 0 30 8 1.0154026 -66.006715 115 8 1.1 0.9 540.2400 -18.8700 0.0000 0.0000; + 8126 1 0 0 0 0 8 1.0323198 -53.110161 500 8 1.1 0.9 121.5700 1.8600 0.0000 0.0000; + 8127 1 0 0 0 0 8 1.0308054 -54.266526 230 8 1.1 0.9 121.0300 -2.5900 0.0000 0.0000; + 8128 1 0 0 0 0 8 1.0311164 -56.576662 115 8 1.1 0.9 553.4200 -8.2100 0.0000 0.0000; + 8129 2 0 0 0 0 8 1.0300038 -51.380518 18 8 1.1 0.9 121.3700 0.0000 0.0000 0.0000; + 8130 2 0 0 0 0 8 1.0300038 -48.795623 18 8 1.1 0.9 121.0200 0.0000 0.0000 0.0000; + 8131 2 0 0 0 0 8 1.0300038 -50.905173 18 8 1.1 0.9 121.3300 0.0000 0.0000 0.0000; + 8132 1 21.93 6.21 0 0 8 0.9955454 -64.728283 115 7 1.1 0.9 277.7500 60.8600 0.0000 0.0000; + 8133 1 0 0 0 0 8 1.0217658 -63.131001 230 8 1.1 0.9 -2.3000 5.7100 0.0000 0.0000; + 8134 1 111.5 31.59 0 0 8 1.0216485 -66.125124 115 8 1.1 0.9 -52.0500 19.1600 0.0000 0.0000; + 8135 1 81.21 23.01 0 0 8 1.0245253 -69.247489 115 8 1.1 0.9 475.9300 1.7200 0.0000 0.0000; + 8136 1 10.05 2.85 0 0 8 1.0021666 -69.385486 115 8 1.1 0.9 468.8400 8.1800 0.0000 0.0000; + 8137 1 24.32 6.89 0 0 8 1.0096317 -62.817604 115 8 1.1 0.9 408.3900 -21.1700 0.0000 0.0000; + 8138 1 6.5 1.84 0 58.77 8 1.0300036 -70.430916 115 8 1.1 0.9 611.7900 0.0000 0.0000 0.0000; + 8139 1 0 0 0 0 8 1.005414 -43.568567 230 7 1.1 0.9 82.9800 7.8000 0.0000 0.0000; + 8140 1 168.51 47.75 0 0 8 0.9993519 -46.282576 115 7 1.1 0.9 89.6500 7.7800 0.0000 0.0000; + 8141 1 20.94 5.93 0 0 8 1.0149793 -51.983802 115 7 1.1 0.9 134.7000 3.5900 0.0000 0.0000; + 8142 1 22.36 6.34 0 0 8 0.9966649 -61.958578 115 8 1.1 0.9 626.5800 30.5600 0.0000 0.0000; + 8143 1 22.94 6.5 0 0 8 1.0199346 -45.683536 115 7 1.1 0.9 162.3800 26.6600 0.0000 0.0000; + 8144 1 6.04 1.71 0 0 8 1.0073183 -61.330994 115 7 1.1 0.9 238.8800 56.7600 0.0000 0.0000; + 8145 1 6.16 1.74 0 0 8 1.0078965 -66.264209 115 8 1.1 0.9 488.2300 -0.8500 0.0000 0.0000; + 8146 1 49.91 14.14 0 0 8 1.0037208 -72.360602 115 8 1.1 0.9 634.0400 -17.6900 0.0000 0.0000; + 8147 2 0 0 0 0 8 1.0118935 -59.489212 230 7 1.1 0.9 32.4600 2.0400 0.0000 0.0000; + 8148 1 0 0 0 0 8 1.007094 -61.825492 161 7 1.1 0.9 30.6800 -0.9700 0.0000 0.0000; + 8149 1 0 0 0 0 8 1.0006368 -66.066429 115 7 1.1 0.9 -49.1000 -24.4100 0.0000 0.0000; + 8150 1 8.51 2.41 0 0 8 1.0126974 -64.253619 115 8 1.1 0.9 557.5900 -38.4800 0.0000 0.0000; + 8151 1 17.38 4.92 0 46.4 8 1.0300035 -67.479228 115 7 1.1 0.9 357.7100 0.0000 0.0000 0.0000; + 8152 2 46.35 13.13 0 0 8 1.0273114 -46.775553 115 7 1.1 0.9 80.8400 0.7000 0.0000 0.0000; + 8153 1 38.55 10.92 0 0 8 0.9945546 -71.284572 115 8 1.1 0.9 360.7900 23.1800 0.0000 0.0000; + 8154 1 26.31 7.46 0 0 8 1.0077189 -70.841476 115 8 1.1 0.9 465.0200 9.4700 0.0000 0.0000; + 8155 2 0 0 0 0 8 1.0283478 -47.16163 500 7 1.1 0.9 33.5100 0.4800 0.0000 0.0000; + 8156 1 0 0 0 0 8 1.0216632 -45.944387 230 7 1.1 0.9 63.7300 8.0000 0.0000 0.0000; + 8157 1 0 0 0 0 8 1.0156746 -49.989462 115 7 1.1 0.9 93.7300 18.4600 0.0000 0.0000; + 8158 2 0 0 0 0 8 1.0304051 -38.776549 500 7 1.1 0.9 66.9400 1.3600 0.0000 0.0000; + 8159 1 0 0 0 108.63 8 1.0300029 -42.135409 230 7 1.1 0.9 71.6800 0.0000 0.0000 0.0000; + 8160 1 90.76 25.71 0 0 8 1.0267196 -45.295659 115 7 1.1 0.9 76.6500 0.8800 0.0000 0.0000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf mu_Pmax mu_Pmin mu_Qmax mu_Qmin +mpc.gen = [ + 1004 158.25 -30.38 44.94 -30.38 1.01 253.2 1 158.25 158.25 0 0 0 0 0 0 0 0 0 0 211 0.0000 0.0000 0.0000 0.0000; + 1006 25.73 -4.94 7.31 -4.94 1 41.16 1 25.73 25.73 0 0 0 0 0 0 0 0 0 0 34.3 0.0000 0.0000 0.0000 0.0000; + 1009 61.87 -11.88 17.57 -11.88 1 99 1 61.87 61.87 0 0 0 0 0 0 0 0 0 0 82.5 0.0000 0.0000 0.0000 0.0000; + 1011 9.97 0 0 0 1 12 1 10 3 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 1021 149.63 -28.73 42.49 -28.73 1 239.4 1 149.63 149.63 0 0 0 0 0 0 0 0 0 0 199.5 0.0000 0.0000 0.0000 0.0000; + 1023 135 -0.55 38.34 -25.92 1.01 216 1 135 135 0 0 0 0 0 0 0 0 0 0 180 0.0000 0.0000 0.0000 0.0000; + 1026 93.15 -6.13 26.45 -17.88 1 149.04 1 93.15 93.15 0 0 0 0 0 0 0 0 0 0 124.2 0.0000 0.0000 0.0000 0.0000; + 1033 208.5 -40.03 59.21 -40.03 1 333.6 1 208.5 208.5 0 0 0 0 0 0 0 0 0 0 278 0.0000 0.0000 0.0000 0.0000; + 1035 67.5 -9.15 19.17 -12.96 1 108 1 67.5 67.5 0 0 0 0 0 0 0 0 0 0 90 0.0000 0.0000 0.0000 0.0000; + 1039 110.63 -20.76 31.42 -21.24 1 177 1 110.63 110.63 0 0 0 0 0 0 0 0 0 0 147.5 0.0000 0.0000 0.0000 0.0000; + 1042 0 0 25.96 -17.55 1 146.28 0 121.9 36.57 0 0 0 0 0 0 0 0 0 0 121.9 0.0000 0.0000 0.0000 0.0000; + 1043 44.1 -3.61 12.52 -8.47 1 70.56 1 44.1 44.1 0 0 0 0 0 0 0 0 0 0 58.8 0.0000 0.0000 0.0000 0.0000; + 1048 0 0 165.53 -36.1 1 390.24 0 325.2 97.56 0 0 0 0 0 0 0 0 0 0 325.2 0.0000 0.0000 0.0000 0.0000; + 1049 0 0 165.53 -36.1 1 390.24 0 325.2 97.56 0 0 0 0 0 0 0 0 0 0 325.2 0.0000 0.0000 0.0000 0.0000; + 1050 89.15 -7.52 45.5 -9.92 1 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 1051 89.15 -5.5 45.5 -9.92 1 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 1052 89.15 -9.92 45.5 -9.92 1 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 1053 0 0 91.01 -19.85 1 214.56 0 178.8 53.64 0 0 0 0 0 0 0 0 0 0 178.8 0.0000 0.0000 0.0000 0.0000; + 1057 0 0 25.56 -17.28 1 144 0 120 36 0 0 0 0 0 0 0 0 0 0 120 0.0000 0.0000 0.0000 0.0000; + 1059 0 0 2.85 -0.62 1.04 6.72 0 5.6 1.68 0 0 0 0 0 0 0 0 0 0 5.6 0.0000 0.0000 0.0000 0.0000; + 1060 0 0 1.02 -0.22 1.04 2.4 0 2 0.6 0 0 0 0 0 0 0 0 0 0 2 0.0000 0.0000 0.0000 0.0000; + 1062 0 0 0 0 1.01 1.8 0 1.5 0.45 0 0 0 0 0 0 0 0 0 0 1.5 0.0000 0.0000 0.0000 0.0000; + 1063 0 0 0 0 1.01 276 0 230 69 0 0 0 0 0 0 0 0 0 0 230 0.0000 0.0000 0.0000 0.0000; + 1066 106.88 -3.74 30.35 -20.52 1 171 1 106.88 106.88 0 0 0 0 0 0 0 0 0 0 142.5 0.0000 0.0000 0.0000 0.0000; + 1070 120.38 18.58 34.19 -23.11 1.04 192.6 1 120.38 120.38 0 0 0 0 0 0 0 0 0 0 160.5 0.0000 0.0000 0.0000 0.0000; + 1072 191.6 25.79 97.8 -21.33 1.01 230.56 1 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1073 191.6 32.88 97.8 -21.33 1.01 230.56 1 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1074 191.6 29.18 97.8 -21.33 1.01 230.56 1 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1075 191.6 30.03 97.8 -21.33 1.01 230.56 1 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1076 0 0 97.8 -21.33 1.01 230.56 0 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1077 0 0 97.8 -21.33 1.01 230.56 0 192.13 57.64 0 0 0 0 0 0 0 0 0 0 192.13 0.0000 0.0000 0.0000 0.0000; + 1078 95.24 15.89 48.61 -10.6 1.01 114.6 1 95.5 28.65 0 0 0 0 0 0 0 0 0 0 95.5 0.0000 0.0000 0.0000 0.0000; + 1079 95.24 -10.6 48.61 -10.6 1.01 114.6 1 95.5 28.65 0 0 0 0 0 0 0 0 0 0 95.5 0.0000 0.0000 0.0000 0.0000; + 1080 95.24 12.77 48.61 -10.6 1.01 114.6 1 95.5 28.65 0 0 0 0 0 0 0 0 0 0 95.5 0.0000 0.0000 0.0000 0.0000; + 1081 0 0 145.83 -31.8 1.01 343.8 0 286.5 85.95 0 0 0 0 0 0 0 0 0 0 286.5 0.0000 0.0000 0.0000 0.0000; + 1082 112.5 -21.6 31.95 -21.6 1 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 1084 86.62 24.6 24.6 -16.63 1.04 138.6 1 86.62 86.62 0 0 0 0 0 0 0 0 0 0 115.5 0.0000 0.0000 0.0000 0.0000; + 1088 56.25 -3.26 15.97 -10.8 1 90 1 56.25 56.25 0 0 0 0 0 0 0 0 0 0 75 0.0000 0.0000 0.0000 0.0000; + 1090 114.37 23.48 32.48 -21.96 1.02 183 1 114.37 114.37 0 0 0 0 0 0 0 0 0 0 152.5 0.0000 0.0000 0.0000 0.0000; + 1090 27 7.67 7.67 -5.18 1.02 43.2 1 27 27 0 0 0 0 0 0 0 0 0 0 36 0.0000 0.0000 0.0000 0.0000; + 2004 0 0 199.43 -43.49 1.02 470.16 0 391.8 117.54 0 0 0 0 0 0 0 0 0 0 391.8 0.0000 0.0000 0.0000 0.0000; + 2005 0 0 199.43 -43.49 1.02 470.16 0 391.8 117.54 0 0 0 0 0 0 0 0 0 0 391.8 0.0000 0.0000 0.0000 0.0000; + 2006 0 0 199.43 -43.49 1.02 470.16 0 391.8 117.54 0 0 0 0 0 0 0 0 0 0 391.8 0.0000 0.0000 0.0000 0.0000; + 2013 150.45 -28.89 42.73 -28.89 1 240.72 1 150.45 150.45 0 0 0 0 0 0 0 0 0 0 200.6 0.0000 0.0000 0.0000 0.0000; + 2019 0 0 46.43 -31.39 1.04 261.6 0 218 65.4 0 0 0 0 0 0 0 0 0 0 218 0.0000 0.0000 0.0000 0.0000; + 2023 83.1 15.44 42.42 -9.25 1.02 100 1 83.33 25 0 0 0 0 0 0 0 0 0 0 83.33 0.0000 0.0000 0.0000 0.0000; + 2024 166.21 22.7 84.83 -18.5 1.02 200 1 166.67 50 0 0 0 0 0 0 0 0 0 0 166.67 0.0000 0.0000 0.0000 0.0000; + 2042 59.7 -11.46 16.95 -11.46 1.01 95.52 1 59.7 59.7 0 0 0 0 0 0 0 0 0 0 79.6 0.0000 0.0000 0.0000 0.0000; + 2056 0 0 2.8 -0.73 0.99 7.2 0 6 1.8 0 0 0 0 0 0 0 0 0 0 6 0.0000 0.0000 0.0000 0.0000; + 2057 573.59 -57.99 335.52 -87.84 0.99 864 1 720 216 0 0 0 0 0 0 0 0 0 0 720 0.0000 0.0000 0.0000 0.0000; + 2059 60 -11.52 17.04 -11.52 1 96 1 60 60 0 0 0 0 0 0 0 0 0 0 80 0.0000 0.0000 0.0000 0.0000; + 2062 101.55 -12.3 28.84 -19.5 1.02 162.48 1 101.55 101.55 0 0 0 0 0 0 0 0 0 0 135.4 0.0000 0.0000 0.0000 0.0000; + 2071 112.5 -2.46 31.95 -21.6 1 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 2076 22.5 6.39 6.39 -4.32 1.04 36 1 22.5 22.5 0 0 0 0 0 0 0 0 0 0 30 0.0000 0.0000 0.0000 0.0000; + 2078 84.38 -4.82 23.96 -16.2 1.02 135 1 84.38 84.38 0 0 0 0 0 0 0 0 0 0 112.5 0.0000 0.0000 0.0000 0.0000; + 2083 19.94 10.07 10.18 -2.22 1.02 24 1 20 6 0 0 0 0 0 0 0 0 0 0 20 0.0000 0.0000 0.0000 0.0000; + 2084 0 0 10.18 -2.22 1.02 24 0 20 6 0 0 0 0 0 0 0 0 0 0 20 0.0000 0.0000 0.0000 0.0000; + 2085 0 0 20.36 -4.44 1.02 48 0 40 12 0 0 0 0 0 0 0 0 0 0 40 0.0000 0.0000 0.0000 0.0000; + 2089 50.7 -0.29 14.4 -9.73 1 81.12 1 50.7 50.7 0 0 0 0 0 0 0 0 0 0 67.6 0.0000 0.0000 0.0000 0.0000; + 2094 0 0 2.13 -1.44 1 12 0 10 3 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 2095 0 0 16.93 -11.45 1 95.4 0 79.5 23.85 0 0 0 0 0 0 0 0 0 0 79.5 0.0000 0.0000 0.0000 0.0000; + 2099 7.5 -1.44 2.13 -1.44 1.02 12 1 7.5 7.5 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 2100 112.5 -21.6 31.95 -21.6 1.02 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 2103 0 0 136.28 -29.72 1 321.28 0 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 2104 0 0 136.28 -29.72 1 321.28 0 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 2105 0 0 136.28 -29.72 1 321.28 0 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 2115 184.21 -20.5 94.02 -20.5 1 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2116 184.21 -20.5 94.02 -20.5 1 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2117 184.21 -20.5 94.02 -20.5 1 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2118 184.21 -20.5 94.02 -20.5 1 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2119 184.21 -20.5 94.02 -20.5 1 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2120 184.21 -4.83 94.02 -20.5 1.01 221.66 1 184.72 55.41 0 0 0 0 0 0 0 0 0 0 184.72 0.0000 0.0000 0.0000 0.0000; + 2123 136.28 -26.16 38.7 -26.16 1 218.04 1 136.28 136.28 0 0 0 0 0 0 0 0 0 0 181.7 0.0000 0.0000 0.0000 0.0000; + 2127 216.45 -1 61.47 -41.56 1.04 346.32 1 216.45 216.45 0 0 0 0 0 0 0 0 0 0 288.6 0.0000 0.0000 0.0000 0.0000; + 3004 28.13 -5.4 7.99 -5.4 1 45 1 28.13 28.13 0 0 0 0 0 0 0 0 0 0 37.5 0.0000 0.0000 0.0000 0.0000; + 3017 127.13 -0.17 36.1 -24.41 1.01 203.4 1 127.13 127.13 0 0 0 0 0 0 0 0 0 0 169.5 0.0000 0.0000 0.0000 0.0000; + 3020 112.5 1.34 31.95 -21.6 1.03 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 3028 150 36.96 42.6 -28.8 1.04 240 1 150 150 0 0 0 0 0 0 0 0 0 0 200 0.0000 0.0000 0.0000 0.0000; + 3034 97.87 17.14 27.8 -18.79 1.03 156.6 1 97.87 97.87 0 0 0 0 0 0 0 0 0 0 130.5 0.0000 0.0000 0.0000 0.0000; + 3039 156.75 43.36 44.52 -30.1 1.04 250.8 1 156.75 156.75 0 0 0 0 0 0 0 0 0 0 209 0.0000 0.0000 0.0000 0.0000; + 3043 0 0 0.66 -0.14 1.04 1.56 0 1.3 0.39 0 0 0 0 0 0 0 0 0 0 1.3 0.0000 0.0000 0.0000 0.0000; + 3044 0 0 45.5 -9.92 1.04 107.28 0 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 3045 0 0 227.52 -49.62 1.04 536.4 0 447 134.1 0 0 0 0 0 0 0 0 0 0 447 0.0000 0.0000 0.0000 0.0000; + 3048 180.75 51.33 51.33 -34.7 1.04 289.2 1 180.75 180.75 0 0 0 0 0 0 0 0 0 0 241 0.0000 0.0000 0.0000 0.0000; + 3055 183.88 35.81 52.22 -35.3 1.04 294.2 1 183.88 183.88 0 0 0 0 0 0 0 0 0 0 245.17 0.0000 0.0000 0.0000 0.0000; + 3056 183.88 24.15 52.22 -35.3 1.04 294.2 1 183.88 183.88 0 0 0 0 0 0 0 0 0 0 245.17 0.0000 0.0000 0.0000 0.0000; + 3057 183.88 22.53 52.22 -35.3 1.04 294.2 1 183.88 183.88 0 0 0 0 0 0 0 0 0 0 245.17 0.0000 0.0000 0.0000 0.0000; + 3060 124.22 13.18 35.28 -23.85 1.04 198.75 1 124.22 124.22 0 0 0 0 0 0 0 0 0 0 165.63 0.0000 0.0000 0.0000 0.0000; + 3061 124.22 13.94 35.28 -23.85 1.04 198.75 1 124.22 124.22 0 0 0 0 0 0 0 0 0 0 165.63 0.0000 0.0000 0.0000 0.0000; + 3062 124.22 19.46 35.28 -23.85 1.04 198.75 1 124.22 124.22 0 0 0 0 0 0 0 0 0 0 165.63 0.0000 0.0000 0.0000 0.0000; + 3063 124.22 14.87 35.28 -23.85 1.04 198.75 1 124.22 124.22 0 0 0 0 0 0 0 0 0 0 165.63 0.0000 0.0000 0.0000 0.0000; + 3065 60.37 -11.59 17.15 -11.59 1 96.6 1 60.37 60.37 0 0 0 0 0 0 0 0 0 0 80.5 0.0000 0.0000 0.0000 0.0000; + 3068 112.5 25.59 31.95 -21.6 1.04 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 3071 127.65 -24.51 36.25 -24.51 1 204.24 1 127.65 127.65 0 0 0 0 0 0 0 0 0 0 170.2 0.0000 0.0000 0.0000 0.0000; + 3074 74.85 -7.14 21.26 -14.37 1 119.76 1 74.85 74.85 0 0 0 0 0 0 0 0 0 0 99.8 0.0000 0.0000 0.0000 0.0000; + 3081 186.75 33.97 53.04 -35.86 1.04 298.8 1 186.75 186.75 0 0 0 0 0 0 0 0 0 0 249 0.0000 0.0000 0.0000 0.0000; + 3084 174.37 -8.93 49.52 -33.48 1 279 1 174.37 174.37 0 0 0 0 0 0 0 0 0 0 232.5 0.0000 0.0000 0.0000 0.0000; + 3086 56.25 -1.69 15.97 -10.8 1 90 1 56.25 56.25 0 0 0 0 0 0 0 0 0 0 75 0.0000 0.0000 0.0000 0.0000; + 3087 0 0 15.97 -10.8 1 90 0 75 22.5 0 0 0 0 0 0 0 0 0 0 75 0.0000 0.0000 0.0000 0.0000; + 3092 150 18.47 42.6 -28.8 1.04 240 1 150 150 0 0 0 0 0 0 0 0 0 0 200 0.0000 0.0000 0.0000 0.0000; + 3095 90.45 19.62 25.69 -17.37 1.04 144.72 1 90.45 90.45 0 0 0 0 0 0 0 0 0 0 120.6 0.0000 0.0000 0.0000 0.0000; + 3098 120 17.91 34.08 -23.04 1.04 192 1 120 120 0 0 0 0 0 0 0 0 0 0 160 0.0000 0.0000 0.0000 0.0000; + 3105 44.5 -0.74 17.07 -0.74 1 18 1 44.5 44.5 0 0 0 0 0 0 0 0 0 0 15 0.0000 0.0000 0.0000 0.0000; + 3106 53.02 -2.69 62.48 -2.69 1 65.88 1 53.02 53.02 0 0 0 0 0 0 0 0 0 0 54.9 0.0000 0.0000 0.0000 0.0000; + 3110 63 11.92 17.89 -12.1 1.04 100.8 1 63 63 0 0 0 0 0 0 0 0 0 0 84 0.0000 0.0000 0.0000 0.0000; + 3112 56.1 -3.04 15.93 -10.77 1 89.76 1 56.1 56.1 0 0 0 0 0 0 0 0 0 0 74.8 0.0000 0.0000 0.0000 0.0000; + 3113 56.1 -2.35 15.93 -10.77 1 89.76 1 56.1 56.1 0 0 0 0 0 0 0 0 0 0 74.8 0.0000 0.0000 0.0000 0.0000; + 3117 47.25 -5.09 13.42 -9.07 1 75.6 1 47.25 47.25 0 0 0 0 0 0 0 0 0 0 63 0.0000 0.0000 0.0000 0.0000; + 3118 90 -8.53 25.56 -17.28 1 144 1 90 90 0 0 0 0 0 0 0 0 0 0 120 0.0000 0.0000 0.0000 0.0000; + 3120 29.7 0 0 0 1 47.52 1 29.7 29.7 0 0 0 0 0 0 0 0 0 0 39.6 0.0000 0.0000 0.0000 0.0000; + 3122 147.75 -13.3 41.96 -28.37 1 236.4 1 147.75 147.75 0 0 0 0 0 0 0 0 0 0 197 0.0000 0.0000 0.0000 0.0000; + 3127 101.25 -19.44 28.76 -19.44 1 162 1 101.25 101.25 0 0 0 0 0 0 0 0 0 0 135 0.0000 0.0000 0.0000 0.0000; + 3129 94.88 -18.22 26.94 -18.22 1 151.8 1 94.88 94.88 0 0 0 0 0 0 0 0 0 0 126.5 0.0000 0.0000 0.0000 0.0000; + 3131 85.5 22.85 24.28 -16.42 1.02 136.8 1 85.5 85.5 0 0 0 0 0 0 0 0 0 0 114 0.0000 0.0000 0.0000 0.0000; + 3133 0 0 26.11 -5.69 1.04 61.56 0 51.3 15.39 0 0 0 0 0 0 0 0 0 0 51.3 0.0000 0.0000 0.0000 0.0000; + 3133 0 0 26.11 -5.69 1.04 61.56 0 51.3 15.39 0 0 0 0 0 0 0 0 0 0 51.3 0.0000 0.0000 0.0000 0.0000; + 3133 0 0 26.11 -5.69 1.04 61.56 0 51.3 15.39 0 0 0 0 0 0 0 0 0 0 51.3 0.0000 0.0000 0.0000 0.0000; + 3137 75.9 21.56 21.56 -14.57 1.03 121.44 1 75.9 75.9 0 0 0 0 0 0 0 0 0 0 101.2 0.0000 0.0000 0.0000 0.0000; + 3141 68.62 -13.18 19.49 -13.18 1 109.8 1 68.62 68.62 0 0 0 0 0 0 0 0 0 0 91.5 0.0000 0.0000 0.0000 0.0000; + 4010 151.2 11.42 42.94 -29.03 1.03 241.92 1 151.2 151.2 0 0 0 0 0 0 0 0 0 0 201.6 0.0000 0.0000 0.0000 0.0000; + 4026 408.86 44.49 191.06 -50.02 1.03 492 1 410 123 0 0 0 0 0 0 0 0 0 0 410 0.0000 0.0000 0.0000 0.0000; + 4030 460.57 -34.65 290.04 -75.93 1.01 746.88 1 622.4 186.72 0 0 0 0 0 0 0 0 0 0 622.4 0.0000 0.0000 0.0000 0.0000; + 4045 93.4 7.47 35.86 -1.54 1.02 37.8 1 93.4 93.4 0 0 0 0 0 0 0 0 0 0 31.5 0.0000 0.0000 0.0000 0.0000; + 4046 28.5 1.96 10.94 -0.47 1.02 11.52 1 28.5 28.5 0 0 0 0 0 0 0 0 0 0 9.6 0.0000 0.0000 0.0000 0.0000; + 4047 27.48 3.41 75.1 -3.23 1.02 79.2 1 27.48 27.48 0 0 0 0 0 0 0 0 0 0 66 0.0000 0.0000 0.0000 0.0000; + 4050 150 -21.93 42.6 -28.8 1 240 1 150 150 0 0 0 0 0 0 0 0 0 0 200 0.0000 0.0000 0.0000 0.0000; + 4052 44.08 22.5 22.5 -4.91 1.04 53.04 1 44.2 13.26 0 0 0 0 0 0 0 0 0 0 44.2 0.0000 0.0000 0.0000 0.0000; + 4058 99.6 17.45 73.3 -15.98 1.03 172.8 1 144 43.2 0 0 0 0 0 0 0 0 0 0 144 0.0000 0.0000 0.0000 0.0000; + 4059 84.08 18.42 73.3 -15.98 1.03 172.8 1 144 43.2 0 0 0 0 0 0 0 0 0 0 144 0.0000 0.0000 0.0000 0.0000; + 4060 124.4 14.84 73.3 -15.98 1.03 172.8 1 144 43.2 0 0 0 0 0 0 0 0 0 0 144 0.0000 0.0000 0.0000 0.0000; + 4061 148.88 19.5 87.72 -19.13 1.03 206.8 1 172.33 51.7 0 0 0 0 0 0 0 0 0 0 172.33 0.0000 0.0000 0.0000 0.0000; + 4062 171.85 17.02 87.72 -19.13 1.03 206.8 1 172.33 51.7 0 0 0 0 0 0 0 0 0 0 172.33 0.0000 0.0000 0.0000 0.0000; + 4063 124.75 19.69 87.72 -19.13 1.03 206.8 1 172.33 51.7 0 0 0 0 0 0 0 0 0 0 172.33 0.0000 0.0000 0.0000 0.0000; + 4065 46.87 13.41 23.92 -5.22 1.02 56.4 1 47 14.1 0 0 0 0 0 0 0 0 0 0 47 0.0000 0.0000 0.0000 0.0000; + 4075 0 0 89.75 -19.57 1.03 211.6 0 176.33 52.9 0 0 0 0 0 0 0 0 0 0 176.33 0.0000 0.0000 0.0000 0.0000; + 4076 175.84 23.56 89.75 -19.57 1.03 211.6 1 176.33 52.9 0 0 0 0 0 0 0 0 0 0 176.33 0.0000 0.0000 0.0000 0.0000; + 4077 97.06 17.97 89.75 -19.57 1.03 211.6 1 176.33 52.9 0 0 0 0 0 0 0 0 0 0 176.33 0.0000 0.0000 0.0000 0.0000; + 4082 242.73 29.65 123.89 -27.02 1.04 292.08 1 243.4 73.02 0 0 0 0 0 0 0 0 0 0 243.4 0.0000 0.0000 0.0000 0.0000; + 4083 242.73 30.42 123.89 -27.02 1.04 292.08 1 243.4 73.02 0 0 0 0 0 0 0 0 0 0 243.4 0.0000 0.0000 0.0000 0.0000; + 4084 242.73 46.21 123.89 -27.02 1.04 292.08 1 243.4 73.02 0 0 0 0 0 0 0 0 0 0 243.4 0.0000 0.0000 0.0000 0.0000; + 4085 168.05 48.8 179.17 -39.07 1.04 422.4 1 352 105.6 0 0 0 0 0 0 0 0 0 0 352 0.0000 0.0000 0.0000 0.0000; + 4090 0 0 0.65 -0.17 1.01 1.68 0 1.4 0.42 0 0 0 0 0 0 0 0 0 0 1.4 0.0000 0.0000 0.0000 0.0000; + 4091 23.43 2.45 10.95 -2.87 1.01 28.2 1 23.5 7.05 0 0 0 0 0 0 0 0 0 0 23.5 0.0000 0.0000 0.0000 0.0000; + 4092 0 0 3.54 -0.93 1.01 9.12 0 7.6 2.28 0 0 0 0 0 0 0 0 0 0 7.6 0.0000 0.0000 0.0000 0.0000; + 4093 27.92 1.3 13.05 -3.42 1.01 33.6 1 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4094 27.92 4.86 13.05 -3.42 1.01 33.6 1 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4095 27.92 2.14 13.05 -3.42 1.01 33.6 1 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4096 0 0 13.05 -3.42 1.01 33.6 0 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4097 27.92 1.87 13.05 -3.42 1.01 33.6 1 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4098 0 0 13.05 -3.42 1.01 33.6 0 28 8.4 0 0 0 0 0 0 0 0 0 0 28 0.0000 0.0000 0.0000 0.0000; + 4105 135 23.76 38.34 -25.92 1.01 216 1 135 135 0 0 0 0 0 0 0 0 0 0 180 0.0000 0.0000 0.0000 0.0000; + 4115 131.43 28.4 67.09 -14.63 1.04 158.16 1 131.8 39.54 0 0 0 0 0 0 0 0 0 0 131.8 0.0000 0.0000 0.0000 0.0000; + 4116 123.76 25.71 67.09 -14.63 1.04 158.16 1 131.8 39.54 0 0 0 0 0 0 0 0 0 0 131.8 0.0000 0.0000 0.0000 0.0000; + 4133 0 0 17.1 -3.73 1 40.32 0 33.6 10.08 0 0 0 0 0 0 0 0 0 0 33.6 0.0000 0.0000 0.0000 0.0000; + 4134 10.21 -3.73 17.1 -3.73 1 40.32 1 33.6 10.08 0 0 0 0 0 0 0 0 0 0 33.6 0.0000 0.0000 0.0000 0.0000; + 4135 10.21 -3.73 17.1 -3.73 1 40.32 1 33.6 10.08 0 0 0 0 0 0 0 0 0 0 33.6 0.0000 0.0000 0.0000 0.0000; + 4136 10.21 -3.73 17.1 -3.73 1 40.32 1 33.6 10.08 0 0 0 0 0 0 0 0 0 0 33.6 0.0000 0.0000 0.0000 0.0000; + 4137 0 0 34.2 -7.46 1 80.64 0 67.2 20.16 0 0 0 0 0 0 0 0 0 0 67.2 0.0000 0.0000 0.0000 0.0000; + 4138 0 0 33.59 -7.33 1 79.2 0 66 19.8 0 0 0 0 0 0 0 0 0 0 66 0.0000 0.0000 0.0000 0.0000; + 4142 141 27.34 40.04 -27.07 1.04 225.6 1 141 141 0 0 0 0 0 0 0 0 0 0 188 0.0000 0.0000 0.0000 0.0000; + 4153 212.4 60.32 60.32 -40.78 1.04 339.84 1 212.4 212.4 0 0 0 0 0 0 0 0 0 0 283.2 0.0000 0.0000 0.0000 0.0000; + 4160 197.22 64.86 100.66 -21.95 1.03 237.32 1 197.77 59.33 0 0 0 0 0 0 0 0 0 0 197.77 0.0000 0.0000 0.0000 0.0000; + 4161 87.79 27.19 100.66 -21.95 1.03 237.32 1 197.77 59.33 0 0 0 0 0 0 0 0 0 0 197.77 0.0000 0.0000 0.0000 0.0000; + 4162 112.47 26.13 100.66 -21.95 1.03 237.32 1 197.77 59.33 0 0 0 0 0 0 0 0 0 0 197.77 0.0000 0.0000 0.0000 0.0000; + 4163 0 0 4.58 -1 1.03 10.8 0 9 2.7 0 0 0 0 0 0 0 0 0 0 9 0.0000 0.0000 0.0000 0.0000; + 4166 150.75 -28.94 42.81 -28.94 1 241.2 1 150.75 150.75 0 0 0 0 0 0 0 0 0 0 201 0.0000 0.0000 0.0000 0.0000; + 4177 112.5 -0.14 31.95 -21.6 1.04 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 4181 150.07 42.62 42.62 -28.81 1.04 240.12 1 150.07 150.07 0 0 0 0 0 0 0 0 0 0 200.1 0.0000 0.0000 0.0000 0.0000; + 4183 152.25 43.24 43.24 -29.23 1.03 243.6 1 152.25 152.25 0 0 0 0 0 0 0 0 0 0 203 0.0000 0.0000 0.0000 0.0000; + 4192 74.79 17.91 38.17 -8.33 1.02 90 1 75 22.5 0 0 0 0 0 0 0 0 0 0 75 0.0000 0.0000 0.0000 0.0000; + 4192 183.26 17.91 93.54 -20.4 1.02 220.52 1 183.77 55.13 0 0 0 0 0 0 0 0 0 0 183.77 0.0000 0.0000 0.0000 0.0000; + 4192 0 0 12.22 -2.66 1.02 28.8 0 24 7.2 0 0 0 0 0 0 0 0 0 0 24 0.0000 0.0000 0.0000 0.0000; + 4192 60.83 17.91 31.05 -6.77 1.02 73.2 1 61 18.3 0 0 0 0 0 0 0 0 0 0 61 0.0000 0.0000 0.0000 0.0000; + 4192 10.37 5.29 5.29 -1.15 1.02 12.48 1 10.4 3.12 0 0 0 0 0 0 0 0 0 0 10.4 0.0000 0.0000 0.0000 0.0000; + 4192 136.48 17.91 135.9 -29.64 1.02 320.4 1 267 80.1 0 0 0 0 0 0 0 0 0 0 267 0.0000 0.0000 0.0000 0.0000; + 4192 155.9 17.91 135.9 -29.64 1.02 320.4 1 267 80.1 0 0 0 0 0 0 0 0 0 0 267 0.0000 0.0000 0.0000 0.0000; + 4192 155.9 17.91 135.9 -29.64 1.02 320.4 1 267 80.1 0 0 0 0 0 0 0 0 0 0 267 0.0000 0.0000 0.0000 0.0000; + 4192 183.26 17.91 93.54 -20.4 1.02 220.52 1 183.77 55.13 0 0 0 0 0 0 0 0 0 0 183.77 0.0000 0.0000 0.0000 0.0000; + 4192 183.26 17.91 93.54 -20.4 1.02 220.52 1 183.77 55.13 0 0 0 0 0 0 0 0 0 0 183.77 0.0000 0.0000 0.0000 0.0000; + 4194 151.2 42.94 42.94 -29.03 1.02 241.92 1 151.2 151.2 0 0 0 0 0 0 0 0 0 0 201.6 0.0000 0.0000 0.0000 0.0000; + 4195 69 -13.25 19.6 -13.25 1 110.4 1 69 69 0 0 0 0 0 0 0 0 0 0 92 0.0000 0.0000 0.0000 0.0000; + 5020 90 -16.77 25.56 -17.28 1 144 1 90 90 0 0 0 0 0 0 0 0 0 0 120 0.0000 0.0000 0.0000 0.0000; + 5023 0 0 2.44 -0.53 1.04 5.76 0 4.8 1.44 0 0 0 0 0 0 0 0 0 0 4.8 0.0000 0.0000 0.0000 0.0000; + 5035 0 0 2.14 -0.47 1.02 5.04 0 4.2 1.26 0 0 0 0 0 0 0 0 0 0 4.2 0.0000 0.0000 0.0000 0.0000; + 5036 0 0 3.26 -0.71 1.02 7.68 0 6.4 1.92 0 0 0 0 0 0 0 0 0 0 6.4 0.0000 0.0000 0.0000 0.0000; + 5037 93.74 67.41 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5038 93.74 65.5 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5039 93.74 148.79 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5040 93.74 49.29 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5041 93.74 71.22 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5042 93.74 61.19 157.01 -34.24 1.02 370.16 1 308.47 92.54 0 0 0 0 0 0 0 0 0 0 308.47 0.0000 0.0000 0.0000 0.0000; + 5051 84.47 43.11 43.11 -9.4 1.02 101.64 1 84.7 25.41 0 0 0 0 0 0 0 0 0 0 84.7 0.0000 0.0000 0.0000 0.0000; + 5057 0 0 161.53 -35.23 1 380.82 0 317.35 95.2 0 0 0 0 0 0 0 0 0 0 317.35 0.0000 0.0000 0.0000 0.0000; + 5058 251.17 -19.5 161.53 -35.23 1 380.82 1 317.35 95.2 0 0 0 0 0 0 0 0 0 0 317.35 0.0000 0.0000 0.0000 0.0000; + 5065 10.57 5.4 5.4 -1.18 1.03 12.72 1 10.6 3.18 0 0 0 0 0 0 0 0 0 0 10.6 0.0000 0.0000 0.0000 0.0000; + 5066 0 0 0.92 -0.2 1.03 2.16 0 1.8 0.54 0 0 0 0 0 0 0 0 0 0 1.8 0.0000 0.0000 0.0000 0.0000; + 5067 437.06 182.7 223.08 -48.65 1.03 525.92 1 438.27 131.48 0 0 0 0 0 0 0 0 0 0 438.27 0.0000 0.0000 0.0000 0.0000; + 5068 437.06 172.57 223.08 -48.65 1.03 525.92 1 438.27 131.48 0 0 0 0 0 0 0 0 0 0 438.27 0.0000 0.0000 0.0000 0.0000; + 5069 437.06 162.04 223.08 -48.65 1.03 525.92 1 438.27 131.48 0 0 0 0 0 0 0 0 0 0 438.27 0.0000 0.0000 0.0000 0.0000; + 5089 0 0 47.57 -2.05 1.01 50.16 0 123.9 0 0 0 0 0 0 0 0 0 0 0 41.8 0.0000 0.0000 0.0000 0.0000; + 5106 0 0 5.03 -1.32 1.04 12.96 0 10.8 3.24 0 0 0 0 0 0 0 0 0 0 10.8 0.0000 0.0000 0.0000 0.0000; + 5107 0 0 2.66 -0.7 1.04 6.84 0 5.7 1.71 0 0 0 0 0 0 0 0 0 0 5.7 0.0000 0.0000 0.0000 0.0000; + 5166 126.15 64.39 64.39 -14.04 1.04 151.8 1 126.5 37.95 0 0 0 0 0 0 0 0 0 0 126.5 0.0000 0.0000 0.0000 0.0000; + 5167 1.6 0.81 0.81 -0.18 1.04 1.92 1 1.6 0.48 0 0 0 0 0 0 0 0 0 0 1.6 0.0000 0.0000 0.0000 0.0000; + 5170 45 -8.64 12.78 -8.64 1 72 1 45 45 0 0 0 0 0 0 0 0 0 0 60 0.0000 0.0000 0.0000 0.0000; + 5198 112.5 -21.6 31.95 -21.6 1 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 5206 207.11 30.67 126.57 -27.6 1.01 298.4 1 248.67 74.6 0 0 0 0 0 0 0 0 0 0 248.67 0.0000 0.0000 0.0000 0.0000; + 5207 180.01 54.69 126.57 -27.6 1.01 298.4 1 248.67 74.6 0 0 0 0 0 0 0 0 0 0 248.67 0.0000 0.0000 0.0000 0.0000; + 5208 180.01 43.85 126.57 -27.6 1.01 298.4 1 248.67 74.6 0 0 0 0 0 0 0 0 0 0 248.67 0.0000 0.0000 0.0000 0.0000; + 5238 168.75 -32.4 47.93 -32.4 1 270 1 168.75 168.75 0 0 0 0 0 0 0 0 0 0 225 0.0000 0.0000 0.0000 0.0000; + 5243 112.5 -21.6 31.95 -21.6 1 180 1 112.5 112.5 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 5262 1211.63 43 447.12 -99.63 1.01 1458 1 1215 364.5 0 0 0 0 0 0 0 0 0 0 1215 0.0000 0.0000 0.0000 0.0000; + 5263 1024.01 32.88 447.12 -99.63 1.01 1458 1 1215 364.5 0 0 0 0 0 0 0 0 0 0 1215 0.0000 0.0000 0.0000 0.0000; + 5281 266.99 -29.72 136.28 -29.72 1 321.28 1 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 5282 266.99 -29.72 136.28 -29.72 1 321.28 1 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 5283 0 0 136.28 -29.72 1 321.28 0 267.73 80.32 0 0 0 0 0 0 0 0 0 0 267.73 0.0000 0.0000 0.0000 0.0000; + 5297 0 0 1.63 -0.36 1.04 3.84 0 3.2 0.96 0 0 0 0 0 0 0 0 0 0 3.2 0.0000 0.0000 0.0000 0.0000; + 5298 114.68 58.53 58.53 -12.76 1.04 138 1 115 34.5 0 0 0 0 0 0 0 0 0 0 115 0.0000 0.0000 0.0000 0.0000; + 5299 114.68 58.53 58.53 -12.76 1.04 138 1 115 34.5 0 0 0 0 0 0 0 0 0 0 115 0.0000 0.0000 0.0000 0.0000; + 5300 114.68 58.53 58.53 -12.76 1.04 138 1 115 34.5 0 0 0 0 0 0 0 0 0 0 115 0.0000 0.0000 0.0000 0.0000; + 5301 82.47 42.09 42.09 -9.18 1.04 99.24 1 82.7 24.81 0 0 0 0 0 0 0 0 0 0 82.7 0.0000 0.0000 0.0000 0.0000; + 5302 462.46 167.57 236.05 -51.48 1.04 556.5 1 463.75 139.13 0 0 0 0 0 0 0 0 0 0 463.75 0.0000 0.0000 0.0000 0.0000; + 5303 462.46 218.7 236.05 -51.48 1.04 556.5 1 463.75 139.13 0 0 0 0 0 0 0 0 0 0 463.75 0.0000 0.0000 0.0000 0.0000; + 5319 79.87 4.91 133.77 -29.17 1.01 315.36 1 262.8 78.84 0 0 0 0 0 0 0 0 0 0 262.8 0.0000 0.0000 0.0000 0.0000; + 5320 0 0 133.77 -29.17 1.01 315.36 0 262.8 78.84 0 0 0 0 0 0 0 0 0 0 262.8 0.0000 0.0000 0.0000 0.0000; + 5321 79.87 4.99 133.77 -29.17 1.01 315.36 1 262.8 78.84 0 0 0 0 0 0 0 0 0 0 262.8 0.0000 0.0000 0.0000 0.0000; + 5324 283.28 144.59 144.59 -31.53 1.04 340.88 1 284.07 85.22 0 0 0 0 0 0 0 0 0 0 284.07 0.0000 0.0000 0.0000 0.0000; + 5325 283.28 144.59 144.59 -31.53 1.04 340.88 1 284.07 85.22 0 0 0 0 0 0 0 0 0 0 284.07 0.0000 0.0000 0.0000 0.0000; + 5326 283.28 144.59 144.59 -31.53 1.04 340.88 1 284.07 85.22 0 0 0 0 0 0 0 0 0 0 284.07 0.0000 0.0000 0.0000 0.0000; + 5342 8.4 3.2 3.2 -0.14 1.04 3.36 1 8.4 8.4 0 0 0 0 0 0 0 0 0 0 2.8 0.0000 0.0000 0.0000 0.0000; + 5343 207.5 60.28 79.67 -3.43 1.04 84 1 207.5 207.5 0 0 0 0 0 0 0 0 0 0 70 0.0000 0.0000 0.0000 0.0000; + 5360 1005.21 -38.58 469.73 -122.98 1.01 1209.6 1 1008 302.4 0 0 0 0 0 0 0 0 0 0 1008 0.0000 0.0000 0.0000 0.0000; + 5363 10.37 -1.15 5.29 -1.15 1 12.48 1 10.4 3.12 0 0 0 0 0 0 0 0 0 0 10.4 0.0000 0.0000 0.0000 0.0000; + 5364 212.74 -23.68 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5365 212.74 -12.23 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5366 212.74 -10.74 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5367 212.74 -10.68 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5368 212.74 -18.86 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5369 212.74 -9.95 108.59 -23.68 1 256 1 213.33 64 0 0 0 0 0 0 0 0 0 0 213.33 0.0000 0.0000 0.0000 0.0000; + 5382 63.52 106.38 106.38 -23.2 1.04 250.8 1 209 62.7 0 0 0 0 0 0 0 0 0 0 209 0.0000 0.0000 0.0000 0.0000; + 5383 63.52 106.38 106.38 -23.2 1.04 250.8 1 209 62.7 0 0 0 0 0 0 0 0 0 0 209 0.0000 0.0000 0.0000 0.0000; + 5399 124.2 35.27 35.27 -23.85 1.04 198.72 1 124.2 124.2 0 0 0 0 0 0 0 0 0 0 165.6 0.0000 0.0000 0.0000 0.0000; + 5403 89.15 45.5 45.5 -9.92 1.03 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 5404 77.23 45.5 45.5 -9.92 1.03 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 5405 84.77 45.5 45.5 -9.92 1.03 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 5406 89.15 45.5 45.5 -9.92 1.03 107.28 1 89.4 26.82 0 0 0 0 0 0 0 0 0 0 89.4 0.0000 0.0000 0.0000 0.0000; + 5415 121.66 -13.54 62.1 -13.54 1 146.4 1 122 36.6 0 0 0 0 0 0 0 0 0 0 122 0.0000 0.0000 0.0000 0.0000; + 5416 121.66 -13.54 62.1 -13.54 1 146.4 1 122 36.6 0 0 0 0 0 0 0 0 0 0 122 0.0000 0.0000 0.0000 0.0000; + 5417 121.66 -13.54 62.1 -13.54 1 146.4 1 122 36.6 0 0 0 0 0 0 0 0 0 0 122 0.0000 0.0000 0.0000 0.0000; + 5418 118.47 -13.19 60.47 -13.19 1 142.56 1 118.8 35.64 0 0 0 0 0 0 0 0 0 0 118.8 0.0000 0.0000 0.0000 0.0000; + 5419 118.47 -13.19 60.47 -13.19 1 142.56 1 118.8 35.64 0 0 0 0 0 0 0 0 0 0 118.8 0.0000 0.0000 0.0000 0.0000; + 5423 12.37 -1.38 6.31 -1.38 1 14.88 1 12.4 3.72 0 0 0 0 0 0 0 0 0 0 12.4 0.0000 0.0000 0.0000 0.0000; + 5424 0 0 1.63 -0.36 1 3.84 0 3.2 0.96 0 0 0 0 0 0 0 0 0 0 3.2 0.0000 0.0000 0.0000 0.0000; + 5444 0 0 147.1 -32.08 1.01 346.8 0 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 0 0 147.1 -32.08 1.01 346.8 0 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 0 0 147.1 -32.08 1.01 346.8 0 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 288.2 9.19 147.1 -32.08 1.01 346.8 1 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 288.2 9.19 147.1 -32.08 1.01 346.8 1 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 0 0 147.1 -32.08 1.01 346.8 0 289 86.7 0 0 0 0 0 0 0 0 0 0 289 0.0000 0.0000 0.0000 0.0000; + 5444 140.91 9.19 71.92 -15.68 1.01 169.56 1 141.3 42.39 0 0 0 0 0 0 0 0 0 0 141.3 0.0000 0.0000 0.0000 0.0000; + 5444 140.91 9.19 71.92 -15.68 1.01 169.56 1 141.3 42.39 0 0 0 0 0 0 0 0 0 0 141.3 0.0000 0.0000 0.0000 0.0000; + 6006 212.41 67.91 108.42 -23.64 1.04 255.6 1 213 63.9 0 0 0 0 0 0 0 0 0 0 213 0.0000 0.0000 0.0000 0.0000; + 6007 0 0 216.83 -47.29 1.04 511.2 0 426 127.8 0 0 0 0 0 0 0 0 0 0 426 0.0000 0.0000 0.0000 0.0000; + 6008 197.78 59.65 100.95 -22.01 1.04 238 1 198.33 59.5 0 0 0 0 0 0 0 0 0 0 198.33 0.0000 0.0000 0.0000 0.0000; + 6009 197.78 37.33 100.95 -22.01 1.04 238 1 198.33 59.5 0 0 0 0 0 0 0 0 0 0 198.33 0.0000 0.0000 0.0000 0.0000; + 6010 197.78 50.24 100.95 -22.01 1.04 238 1 198.33 59.5 0 0 0 0 0 0 0 0 0 0 198.33 0.0000 0.0000 0.0000 0.0000; + 6041 0 20.48 20.48 -0.88 1.04 21.6 1 0 0 0 0 0 0 0 0 0 0 0 0 18 0.0000 0.0000 0.0000 0.0000; + 6042 0 47.53 122.91 -5.29 1.04 129.6 1 0 0 0 0 0 0 0 0 0 0 0 0 108 0.0000 0.0000 0.0000 0.0000; + 6048 0 0 1.73 -0.38 1.04 4.08 0 3.4 1.02 0 0 0 0 0 0 0 0 0 0 3.4 0.0000 0.0000 0.0000 0.0000; + 6049 0 0 4.89 -1.07 1.04 11.52 0 9.6 2.88 0 0 0 0 0 0 0 0 0 0 9.6 0.0000 0.0000 0.0000 0.0000; + 6050 0 0 2.24 -0.49 1.04 5.28 0 4.4 1.32 0 0 0 0 0 0 0 0 0 0 4.4 0.0000 0.0000 0.0000 0.0000; + 6051 57.24 29.22 29.22 -6.37 1.04 68.88 1 57.4 17.22 0 0 0 0 0 0 0 0 0 0 57.4 0.0000 0.0000 0.0000 0.0000; + 6052 0 0 29.22 -6.37 1.04 68.88 0 57.4 17.22 0 0 0 0 0 0 0 0 0 0 57.4 0.0000 0.0000 0.0000 0.0000; + 6053 57.24 29.22 29.22 -6.37 1.04 68.88 1 57.4 17.22 0 0 0 0 0 0 0 0 0 0 57.4 0.0000 0.0000 0.0000 0.0000; + 6054 57.24 26.14 29.22 -6.37 1.04 68.88 1 57.4 17.22 0 0 0 0 0 0 0 0 0 0 57.4 0.0000 0.0000 0.0000 0.0000; + 6069 123.82 30.75 92.32 -20.13 1.03 217.64 1 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6070 131.29 13.73 92.32 -20.13 1.03 217.64 1 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6071 105.9 39.69 92.32 -20.13 1.03 217.64 1 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6072 0 0 92.32 -20.13 1.03 217.64 0 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6073 131.29 23.42 92.32 -20.13 1.03 217.64 1 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6074 131.29 22.78 92.32 -20.13 1.03 217.64 1 181.37 54.41 0 0 0 0 0 0 0 0 0 0 181.37 0.0000 0.0000 0.0000 0.0000; + 6078 477.31 -68.73 262.51 -68.73 1 676 1 563.33 169 0 0 0 0 0 0 0 0 0 0 563.33 0.0000 0.0000 0.0000 0.0000; + 6079 328.93 -68.73 262.51 -68.73 1 676 1 563.33 169 0 0 0 0 0 0 0 0 0 0 563.33 0.0000 0.0000 0.0000 0.0000; + 6080 328.93 -68.73 262.51 -68.73 1 676 1 563.33 169 0 0 0 0 0 0 0 0 0 0 563.33 0.0000 0.0000 0.0000 0.0000; + 6082 41.37 13.85 25.04 -1.08 1.04 26.4 1 41.37 41.37 0 0 0 0 0 0 0 0 0 0 22 0.0000 0.0000 0.0000 0.0000; + 6083 65.3 10.38 25.04 -1.08 1.04 26.4 1 65.3 65.3 0 0 0 0 0 0 0 0 0 0 22 0.0000 0.0000 0.0000 0.0000; + 6085 1.05 0 0 0 1.04 1.68 1 1.05 1.05 0 0 0 0 0 0 0 0 0 0 1.4 0.0000 0.0000 0.0000 0.0000; + 6086 22.5 0 0 0 1.04 36 1 22.5 22.5 0 0 0 0 0 0 0 0 0 0 30 0.0000 0.0000 0.0000 0.0000; + 6087 0 0 0 0 1.04 6.6 0 5.5 1.65 0 0 0 0 0 0 0 0 0 0 5.5 0.0000 0.0000 0.0000 0.0000; + 6088 7.95 0 0 0 1.04 12.72 1 7.95 7.95 0 0 0 0 0 0 0 0 0 0 10.6 0.0000 0.0000 0.0000 0.0000; + 6089 10.42 0 0 0 1.04 16.68 1 10.42 10.42 0 0 0 0 0 0 0 0 0 0 13.9 0.0000 0.0000 0.0000 0.0000; + 6090 30.52 0 0 0 1.04 48.84 1 30.52 30.52 0 0 0 0 0 0 0 0 0 0 40.7 0.0000 0.0000 0.0000 0.0000; + 6104 60.33 30.79 30.79 -6.72 1.04 72.6 1 60.5 18.15 0 0 0 0 0 0 0 0 0 0 60.5 0.0000 0.0000 0.0000 0.0000; + 6105 60.33 30.79 30.79 -6.72 1.04 72.6 1 60.5 18.15 0 0 0 0 0 0 0 0 0 0 60.5 0.0000 0.0000 0.0000 0.0000; + 6106 120.66 61.59 61.59 -13.43 1.04 145.2 1 121 36.3 0 0 0 0 0 0 0 0 0 0 121 0.0000 0.0000 0.0000 0.0000; + 6110 301.19 88.04 275.22 -72.05 1.04 708.72 1 590.6 177.18 0 0 0 0 0 0 0 0 0 0 590.6 0.0000 0.0000 0.0000 0.0000; + 6111 293.64 88.94 308.26 -80.7 1.04 793.8 1 661.5 198.45 0 0 0 0 0 0 0 0 0 0 661.5 0.0000 0.0000 0.0000 0.0000; + 6144 0 0 4.28 -0.93 1.03 10.08 0 8.4 2.52 0 0 0 0 0 0 0 0 0 0 8.4 0.0000 0.0000 0.0000 0.0000; + 6145 322.86 26.17 227.01 -49.51 1.03 535.2 1 446 133.8 0 0 0 0 0 0 0 0 0 0 446 0.0000 0.0000 0.0000 0.0000; + 6146 322.86 27.07 227.01 -49.51 1.03 535.2 1 446 133.8 0 0 0 0 0 0 0 0 0 0 446 0.0000 0.0000 0.0000 0.0000; + 6147 283.24 28.49 474.39 -103.45 1.03 1118.4 1 932 279.6 0 0 0 0 0 0 0 0 0 0 932 0.0000 0.0000 0.0000 0.0000; + 6148 0 0 367.5 -80.14 1.03 866.4 0 722 216.6 0 0 0 0 0 0 0 0 0 0 722 0.0000 0.0000 0.0000 0.0000; + 6149 219.42 83.11 367.5 -80.14 1.03 866.4 1 722 216.6 0 0 0 0 0 0 0 0 0 0 722 0.0000 0.0000 0.0000 0.0000; + 6164 71.44 26.96 119.64 -26.09 1.03 282.06 1 235.05 70.52 0 0 0 0 0 0 0 0 0 0 235.05 0.0000 0.0000 0.0000 0.0000; + 6165 71.44 23.81 119.64 -26.09 1.03 282.06 1 235.05 70.52 0 0 0 0 0 0 0 0 0 0 235.05 0.0000 0.0000 0.0000 0.0000; + 6166 71.44 57.82 119.64 -26.09 1.03 282.06 1 235.05 70.52 0 0 0 0 0 0 0 0 0 0 235.05 0.0000 0.0000 0.0000 0.0000; + 6167 71.44 30.77 119.64 -26.09 1.03 282.06 1 235.05 70.52 0 0 0 0 0 0 0 0 0 0 235.05 0.0000 0.0000 0.0000 0.0000; + 6213 177.9 16.01 68.29 -2.94 1.04 72 1 177.9 177.9 0 0 0 0 0 0 0 0 0 0 60 0.0000 0.0000 0.0000 0.0000; + 6214 552.3 49.93 212.06 -9.13 1.04 223.6 1 552.3 552.3 0 0 0 0 0 0 0 0 0 0 186.33 0.0000 0.0000 0.0000 0.0000; + 6215 552.3 78.32 212.06 -9.13 1.04 223.6 1 552.3 552.3 0 0 0 0 0 0 0 0 0 0 186.33 0.0000 0.0000 0.0000 0.0000; + 6216 552.3 49.18 212.06 -9.13 1.04 223.6 1 552.3 552.3 0 0 0 0 0 0 0 0 0 0 186.33 0.0000 0.0000 0.0000 0.0000; + 6242 60.83 15.71 31.05 -6.77 1.04 73.2 1 61 18.3 0 0 0 0 0 0 0 0 0 0 61 0.0000 0.0000 0.0000 0.0000; + 6243 182.49 38.29 93.15 -20.31 1.04 219.6 1 183 54.9 0 0 0 0 0 0 0 0 0 0 183 0.0000 0.0000 0.0000 0.0000; + 6244 297.17 46.74 151.68 -33.08 1.04 357.6 1 298 89.4 0 0 0 0 0 0 0 0 0 0 298 0.0000 0.0000 0.0000 0.0000; + 6245 297.17 53.69 151.68 -33.08 1.04 357.6 1 298 89.4 0 0 0 0 0 0 0 0 0 0 298 0.0000 0.0000 0.0000 0.0000; + 6246 297.17 100.5 151.68 -33.08 1.04 357.6 1 298 89.4 0 0 0 0 0 0 0 0 0 0 298 0.0000 0.0000 0.0000 0.0000; + 6247 182.82 82.2 93.32 -20.35 1.04 220 1 183.33 55 0 0 0 0 0 0 0 0 0 0 183.33 0.0000 0.0000 0.0000 0.0000; + 6248 182.82 42.38 93.32 -20.35 1.04 220 1 183.33 55 0 0 0 0 0 0 0 0 0 0 183.33 0.0000 0.0000 0.0000 0.0000; + 6249 182.82 29.31 93.32 -20.35 1.04 220 1 183.33 55 0 0 0 0 0 0 0 0 0 0 183.33 0.0000 0.0000 0.0000 0.0000; + 6257 58.96 -21.53 98.75 -21.53 1.02 232.8 1 194 58.2 0 0 0 0 0 0 0 0 0 0 194 0.0000 0.0000 0.0000 0.0000; + 6258 106.96 -12.72 98.75 -21.53 1.02 232.8 1 194 58.2 0 0 0 0 0 0 0 0 0 0 194 0.0000 0.0000 0.0000 0.0000; + 6259 0 0 26.16 -5.71 1.02 61.68 0 51.4 15.42 0 0 0 0 0 0 0 0 0 0 51.4 0.0000 0.0000 0.0000 0.0000; + 6260 78.1 -26.56 130.81 -28.53 1.02 308.4 1 257 77.1 0 0 0 0 0 0 0 0 0 0 257 0.0000 0.0000 0.0000 0.0000; + 6266 4.5 1.72 1.72 -0.07 1.04 1.8 1 4.5 4.5 0 0 0 0 0 0 0 0 0 0 1.5 0.0000 0.0000 0.0000 0.0000; + 6267 7.2 2.73 2.73 -0.12 1.04 2.88 1 7.2 7.2 0 0 0 0 0 0 0 0 0 0 2.4 0.0000 0.0000 0.0000 0.0000; + 6268 4.5 1.72 1.72 -0.07 1.04 1.8 1 4.5 4.5 0 0 0 0 0 0 0 0 0 0 1.5 0.0000 0.0000 0.0000 0.0000; + 6269 7.2 2.73 2.73 -0.12 1.04 2.88 1 7.2 7.2 0 0 0 0 0 0 0 0 0 0 2.4 0.0000 0.0000 0.0000 0.0000; + 6270 0 0 6.82 -0.29 1.04 7.2 0 18 0 0 0 0 0 0 0 0 0 0 0 6 0.0000 0.0000 0.0000 0.0000; + 6271 0 0 4.09 -0.18 1.04 4.32 0 11 0 0 0 0 0 0 0 0 0 0 0 3.6 0.0000 0.0000 0.0000 0.0000; + 6272 0 0 2.73 -0.12 1.04 2.88 0 7.2 0 0 0 0 0 0 0 0 0 0 0 2.4 0.0000 0.0000 0.0000 0.0000; + 6273 0 0 2.73 -0.12 1.04 2.88 0 7.2 0 0 0 0 0 0 0 0 0 0 0 2.4 0.0000 0.0000 0.0000 0.0000; + 6274 8.4 3.2 3.2 -0.14 1.04 3.36 1 8.4 8.4 0 0 0 0 0 0 0 0 0 0 2.8 0.0000 0.0000 0.0000 0.0000; + 6295 62.67 -22.89 104.97 -22.89 1.02 247.48 1 206.23 61.87 0 0 0 0 0 0 0 0 0 0 206.23 0.0000 0.0000 0.0000 0.0000; + 6296 62.67 -22.89 104.97 -22.89 1.02 247.48 1 206.23 61.87 0 0 0 0 0 0 0 0 0 0 206.23 0.0000 0.0000 0.0000 0.0000; + 6297 62.7 -22.23 104.97 -22.89 1.02 247.48 1 206.23 61.9 0 0 0 0 0 0 0 0 0 0 206.23 0.0000 0.0000 0.0000 0.0000; + 6301 0 0 1.63 -0.36 1 3.84 0 3.2 0.96 0 0 0 0 0 0 0 0 0 0 3.2 0.0000 0.0000 0.0000 0.0000; + 6302 246.56 -27.44 125.85 -27.44 1 296.7 1 247.25 74.18 0 0 0 0 0 0 0 0 0 0 247.25 0.0000 0.0000 0.0000 0.0000; + 6303 213.83 -27.44 125.85 -27.44 1 296.7 1 247.25 74.18 0 0 0 0 0 0 0 0 0 0 247.25 0.0000 0.0000 0.0000 0.0000; + 6304 246.56 -27.44 125.85 -27.44 1 296.7 1 247.25 74.18 0 0 0 0 0 0 0 0 0 0 247.25 0.0000 0.0000 0.0000 0.0000; + 6305 246.56 -27.44 125.85 -27.44 1 296.7 1 247.25 74.18 0 0 0 0 0 0 0 0 0 0 247.25 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 6.11 -1.33 1.04 14.4 0 12 3.6 0 0 0 0 0 0 0 0 0 0 12 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 26.21 -5.72 1.04 61.8 0 51.5 15.45 0 0 0 0 0 0 0 0 0 0 51.5 0.0000 0.0000 0.0000 0.0000; + 6349 31.3 52.43 52.43 -11.43 1.04 123.6 1 103 30.9 0 0 0 0 0 0 0 0 0 0 103 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 1.17 -0.26 1.04 2.76 0 2.3 0.69 0 0 0 0 0 0 0 0 0 0 2.3 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 2.34 -0.51 1.04 5.52 0 4.6 1.38 0 0 0 0 0 0 0 0 0 0 4.6 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 0.76 -0.17 1.04 1.8 0 1.5 0.45 0 0 0 0 0 0 0 0 0 0 1.5 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 2.04 -0.44 1.04 4.8 0 4 1.2 0 0 0 0 0 0 0 0 0 0 4 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 3.26 -0.71 1.04 7.68 0 6.4 1.92 0 0 0 0 0 0 0 0 0 0 6.4 0.0000 0.0000 0.0000 0.0000; + 6349 110.32 184.77 184.77 -40.29 1.04 435.6 1 363 108.9 0 0 0 0 0 0 0 0 0 0 363 0.0000 0.0000 0.0000 0.0000; + 6349 110.32 184.77 184.77 -40.29 1.04 435.6 1 363 108.9 0 0 0 0 0 0 0 0 0 0 363 0.0000 0.0000 0.0000 0.0000; + 6349 0 0 26.21 -5.72 1.04 61.8 0 51.5 15.45 0 0 0 0 0 0 0 0 0 0 51.5 0.0000 0.0000 0.0000 0.0000; + 7005 162.55 35.32 82.97 -18.09 1.04 195.6 1 163 48.9 0 0 0 0 0 0 0 0 0 0 163 0.0000 0.0000 0.0000 0.0000; + 7006 162.55 61.84 82.97 -18.09 1.04 195.6 1 163 48.9 0 0 0 0 0 0 0 0 0 0 163 0.0000 0.0000 0.0000 0.0000; + 7007 162.55 40.83 82.97 -18.09 1.04 195.6 1 163 48.9 0 0 0 0 0 0 0 0 0 0 163 0.0000 0.0000 0.0000 0.0000; + 7008 162.55 38.29 82.97 -18.09 1.04 195.6 1 163 48.9 0 0 0 0 0 0 0 0 0 0 163 0.0000 0.0000 0.0000 0.0000; + 7009 162.55 34.73 82.97 -18.09 1.04 195.6 1 163 48.9 0 0 0 0 0 0 0 0 0 0 163 0.0000 0.0000 0.0000 0.0000; + 7015 0 0 2.04 -0.44 1.04 4.8 0 4 1.2 0 0 0 0 0 0 0 0 0 0 4 0.0000 0.0000 0.0000 0.0000; + 7021 22.34 11.4 11.4 -2.49 1.04 26.88 1 22.4 6.72 0 0 0 0 0 0 0 0 0 0 22.4 0.0000 0.0000 0.0000 0.0000; + 7022 47.27 24.13 24.13 -5.26 1.04 56.88 1 47.4 14.22 0 0 0 0 0 0 0 0 0 0 47.4 0.0000 0.0000 0.0000 0.0000; + 7023 47.27 24.13 24.13 -5.26 1.04 56.88 1 47.4 14.22 0 0 0 0 0 0 0 0 0 0 47.4 0.0000 0.0000 0.0000 0.0000; + 7024 94.54 48.25 48.25 -10.52 1.04 113.76 1 94.8 28.44 0 0 0 0 0 0 0 0 0 0 94.8 0.0000 0.0000 0.0000 0.0000; + 7025 0 0 1.63 -0.36 1.04 3.84 0 3.2 0.96 0 0 0 0 0 0 0 0 0 0 3.2 0.0000 0.0000 0.0000 0.0000; + 7031 29.1 0 0 0 1.04 46.56 1 29.1 29.1 0 0 0 0 0 0 0 0 0 0 38.8 0.0000 0.0000 0.0000 0.0000; + 7032 7.5 0 0 0 1.04 12 1 7.5 7.5 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 7033 7.5 0 0 0 1.04 12 1 7.5 7.5 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 7034 0 0 0 0 1.04 5.28 0 4.4 1.32 0 0 0 0 0 0 0 0 0 0 4.4 0.0000 0.0000 0.0000 0.0000; + 7045 187.93 29.91 95.92 -20.92 1.03 226.14 1 188.45 56.53 0 0 0 0 0 0 0 0 0 0 188.45 0.0000 0.0000 0.0000 0.0000; + 7046 187.93 62.63 95.92 -20.92 1.03 226.14 1 188.45 56.53 0 0 0 0 0 0 0 0 0 0 188.45 0.0000 0.0000 0.0000 0.0000; + 7061 67.09 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7062 67.09 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7063 67.09 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7064 83.18 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7065 83.18 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7066 68.11 -12.75 58.48 -12.75 1 137.88 1 114.9 34.47 0 0 0 0 0 0 0 0 0 0 114.9 0.0000 0.0000 0.0000 0.0000; + 7079 159.89 34.45 116.38 -25.38 1.04 274.38 1 228.65 68.59 0 0 0 0 0 0 0 0 0 0 228.65 0.0000 0.0000 0.0000 0.0000; + 7080 165.52 26.98 116.38 -25.38 1.04 274.38 1 228.65 68.59 0 0 0 0 0 0 0 0 0 0 228.65 0.0000 0.0000 0.0000 0.0000; + 7081 165.52 27.33 116.38 -25.38 1.04 274.38 1 228.65 68.59 0 0 0 0 0 0 0 0 0 0 228.65 0.0000 0.0000 0.0000 0.0000; + 7082 165.52 33.35 116.38 -25.38 1.04 274.38 1 228.65 68.59 0 0 0 0 0 0 0 0 0 0 228.65 0.0000 0.0000 0.0000 0.0000; + 7098 1236.1 192.11 498.38 -111.05 1 1625.16 1 1354.3 406.29 0 0 0 0 0 0 0 0 0 0 1354.3 0.0000 0.0000 0.0000 0.0000; + 7099 1350.55 -7.38 498.38 -111.05 1 1625.16 1 1354.3 406.29 0 0 0 0 0 0 0 0 0 0 1354.3 0.0000 0.0000 0.0000 0.0000; + 7107 149.58 76.35 76.35 -16.65 1.04 180 1 150 45 0 0 0 0 0 0 0 0 0 0 150 0.0000 0.0000 0.0000 0.0000; + 7108 50.86 18.53 25.96 -5.66 1.04 61.2 1 51 15.3 0 0 0 0 0 0 0 0 0 0 51 0.0000 0.0000 0.0000 0.0000; + 7109 50.86 22.51 25.96 -5.66 1.04 61.2 1 51 15.3 0 0 0 0 0 0 0 0 0 0 51 0.0000 0.0000 0.0000 0.0000; + 7110 195.46 46.37 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7111 195.46 45.21 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7112 195.46 71.76 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7113 195.46 38.8 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7114 195.46 76.15 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7115 195.46 76.51 99.76 -21.76 1.04 235.2 1 196 58.8 0 0 0 0 0 0 0 0 0 0 196 0.0000 0.0000 0.0000 0.0000; + 7121 0 0 1.88 -0.41 1.04 4.44 0 3.7 1.11 0 0 0 0 0 0 0 0 0 0 3.7 0.0000 0.0000 0.0000 0.0000; + 7122 0 0 2.19 -0.48 1.04 5.16 0 4.3 1.29 0 0 0 0 0 0 0 0 0 0 4.3 0.0000 0.0000 0.0000 0.0000; + 7133 16.25 -1.81 8.3 -1.81 1 19.56 1 16.3 4.89 0 0 0 0 0 0 0 0 0 0 16.3 0.0000 0.0000 0.0000 0.0000; + 7134 205.98 -22.93 105.13 -22.93 1 247.86 1 206.55 61.97 0 0 0 0 0 0 0 0 0 0 206.55 0.0000 0.0000 0.0000 0.0000; + 7135 205.98 -22.93 105.13 -22.93 1 247.86 1 206.55 61.97 0 0 0 0 0 0 0 0 0 0 206.55 0.0000 0.0000 0.0000 0.0000; + 7136 205.98 -22.93 105.13 -22.93 1 247.86 1 206.55 61.97 0 0 0 0 0 0 0 0 0 0 206.55 0.0000 0.0000 0.0000 0.0000; + 7137 205.98 -22.93 105.13 -22.93 1 247.86 1 206.55 61.97 0 0 0 0 0 0 0 0 0 0 206.55 0.0000 0.0000 0.0000 0.0000; + 7138 379.64 -42.26 193.78 -42.26 1 456.84 1 380.7 114.21 0 0 0 0 0 0 0 0 0 0 380.7 0.0000 0.0000 0.0000 0.0000; + 7139 58.84 -6.55 30.03 -6.55 1 70.8 1 59 17.7 0 0 0 0 0 0 0 0 0 0 59 0.0000 0.0000 0.0000 0.0000; + 7140 58.84 -6.55 30.03 -6.55 1 70.8 1 59 17.7 0 0 0 0 0 0 0 0 0 0 59 0.0000 0.0000 0.0000 0.0000; + 7141 58.84 -6.55 30.03 -6.55 1 70.8 1 59 17.7 0 0 0 0 0 0 0 0 0 0 59 0.0000 0.0000 0.0000 0.0000; + 7142 58.84 -6.55 30.03 -6.55 1 70.8 1 59 17.7 0 0 0 0 0 0 0 0 0 0 59 0.0000 0.0000 0.0000 0.0000; + 7146 10.17 -1.13 5.19 -1.13 1.01 12.24 1 10.2 3.06 0 0 0 0 0 0 0 0 0 0 10.2 0.0000 0.0000 0.0000 0.0000; + 7162 110.29 56.3 56.3 -12.28 1.04 132.72 1 110.6 33.18 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7163 110.29 52.72 56.3 -12.28 1.04 132.72 1 110.6 33.18 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7164 110.29 56.3 56.3 -12.28 1.04 132.72 1 110.6 33.18 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7165 110.29 56.3 56.3 -12.28 1.04 132.72 1 110.6 33.18 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7166 110.29 45.19 56.3 -12.28 1.04 132.72 1 110.6 33.18 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7167 110.29 37.63 56.3 -12.28 1.04 132.72 1 110.6 33.2 0 0 0 0 0 0 0 0 0 0 110.6 0.0000 0.0000 0.0000 0.0000; + 7168 87.48 44.65 44.65 -9.74 1.04 105.26 1 87.72 26.32 0 0 0 0 0 0 0 0 0 0 87.72 0.0000 0.0000 0.0000 0.0000; + 7169 87.48 44.65 44.65 -9.74 1.04 105.26 1 87.72 26.3 0 0 0 0 0 0 0 0 0 0 87.72 0.0000 0.0000 0.0000 0.0000; + 7170 333.76 107.98 178.59 -38.95 1.04 421.04 1 350.87 105.26 0 0 0 0 0 0 0 0 0 0 350.87 0.0000 0.0000 0.0000 0.0000; + 7189 6.88 3.51 3.51 -0.77 1.03 8.28 1 6.9 2.07 0 0 0 0 0 0 0 0 0 0 6.9 0.0000 0.0000 0.0000 0.0000; + 7190 47.87 12.12 24.43 -5.33 1.03 57.6 1 48 14.4 0 0 0 0 0 0 0 0 0 0 48 0.0000 0.0000 0.0000 0.0000; + 7191 0 0 2.55 -0.55 1.03 6 0 5 1.5 0 0 0 0 0 0 0 0 0 0 5 0.0000 0.0000 0.0000 0.0000; + 7192 34.9 17.19 17.81 -3.88 1.03 42 1 35 10.5 0 0 0 0 0 0 0 0 0 0 35 0.0000 0.0000 0.0000 0.0000; + 7193 7.48 3.82 3.82 -0.83 1.03 9 1 7.5 2.25 0 0 0 0 0 0 0 0 0 0 7.5 0.0000 0.0000 0.0000 0.0000; + 7194 230.31 43.09 117.55 -25.64 1.03 277.14 1 230.95 69.28 0 0 0 0 0 0 0 0 0 0 230.95 0.0000 0.0000 0.0000 0.0000; + 7195 230.31 37.11 117.55 -25.64 1.03 277.14 1 230.95 69.28 0 0 0 0 0 0 0 0 0 0 230.95 0.0000 0.0000 0.0000 0.0000; + 7196 230.31 67.13 117.55 -25.64 1.03 277.14 1 230.95 69.28 0 0 0 0 0 0 0 0 0 0 230.95 0.0000 0.0000 0.0000 0.0000; + 7197 230.31 104.23 117.55 -25.64 1.03 277.14 1 230.95 69.28 0 0 0 0 0 0 0 0 0 0 230.95 0.0000 0.0000 0.0000 0.0000; + 7207 0 0 2.04 -0.44 1.04 4.8 0 4 1.2 0 0 0 0 0 0 0 0 0 0 4 0.0000 0.0000 0.0000 0.0000; + 7208 762.88 79.03 389.39 -84.92 1.04 918 1 765 229.5 0 0 0 0 0 0 0 0 0 0 765 0.0000 0.0000 0.0000 0.0000; + 7209 762.88 102.56 389.39 -84.92 1.04 918 1 765 229.5 0 0 0 0 0 0 0 0 0 0 765 0.0000 0.0000 0.0000 0.0000; + 7210 178.01 26.74 90.86 -19.81 1.04 214.2 1 178.5 53.55 0 0 0 0 0 0 0 0 0 0 178.5 0.0000 0.0000 0.0000 0.0000; + 7211 178.01 37.53 90.86 -19.81 1.04 214.2 1 178.5 53.55 0 0 0 0 0 0 0 0 0 0 178.5 0.0000 0.0000 0.0000 0.0000; + 7212 178.01 24.45 90.86 -19.81 1.04 214.2 1 178.5 53.55 0 0 0 0 0 0 0 0 0 0 178.5 0.0000 0.0000 0.0000 0.0000; + 7266 303.76 -33.81 155.04 -33.81 1.01 365.52 1 304.6 91.38 0 0 0 0 0 0 0 0 0 0 304.6 0.0000 0.0000 0.0000 0.0000; + 7267 90.39 -10.06 46.14 -10.06 1.01 108.77 1 90.64 27.19 0 0 0 0 0 0 0 0 0 0 90.64 0.0000 0.0000 0.0000 0.0000; + 7268 90.39 -10.06 46.14 -10.06 1.01 108.77 1 90.64 27.19 0 0 0 0 0 0 0 0 0 0 90.64 0.0000 0.0000 0.0000 0.0000; + 7269 90.39 -10.06 46.14 -10.06 1.01 108.77 1 90.64 27.19 0 0 0 0 0 0 0 0 0 0 90.64 0.0000 0.0000 0.0000 0.0000; + 7270 180.78 -20.12 92.27 -20.12 1.01 217.54 1 181.28 54.38 0 0 0 0 0 0 0 0 0 0 181.28 0.0000 0.0000 0.0000 0.0000; + 7280 0 0 13.08 -2.85 1.04 30.84 0 25.7 7.71 0 0 0 0 0 0 0 0 0 0 25.7 0.0000 0.0000 0.0000 0.0000; + 7281 0 0 7.64 -1.67 1.04 18 0 15 4.5 0 0 0 0 0 0 0 0 0 0 15 0.0000 0.0000 0.0000 0.0000; + 7284 0 0 0 0 1.04 9 0 7.5 2.25 0 0 0 0 0 0 0 0 0 0 7.5 0.0000 0.0000 0.0000 0.0000; + 7285 21.22 0 0 0 1.04 33.96 1 21.22 21.22 0 0 0 0 0 0 0 0 0 0 28.3 0.0000 0.0000 0.0000 0.0000; + 7286 21.22 0 0 0 1.04 33.96 1 21.22 21.22 0 0 0 0 0 0 0 0 0 0 28.3 0.0000 0.0000 0.0000 0.0000; + 7287 21.22 0 0 0 1.04 33.96 1 21.22 21.22 0 0 0 0 0 0 0 0 0 0 28.3 0.0000 0.0000 0.0000 0.0000; + 7288 21.22 0 0 0 1.04 33.96 1 21.22 21.22 0 0 0 0 0 0 0 0 0 0 28.3 0.0000 0.0000 0.0000 0.0000; + 7289 42.45 0 0 0 1.04 67.92 1 42.45 42.45 0 0 0 0 0 0 0 0 0 0 56.6 0.0000 0.0000 0.0000 0.0000; + 7307 96.41 49.21 49.21 -10.73 1.04 116.02 1 96.68 29 0 0 0 0 0 0 0 0 0 0 96.68 0.0000 0.0000 0.0000 0.0000; + 7308 96.41 49.21 49.21 -10.73 1.04 116.02 1 96.68 29 0 0 0 0 0 0 0 0 0 0 96.68 0.0000 0.0000 0.0000 0.0000; + 7309 0 0 49.21 -10.73 1.04 116.02 0 96.68 29 0 0 0 0 0 0 0 0 0 0 96.68 0.0000 0.0000 0.0000 0.0000; + 7310 96.41 47.43 49.21 -10.73 1.04 116.02 1 96.68 29 0 0 0 0 0 0 0 0 0 0 96.68 0.0000 0.0000 0.0000 0.0000; + 7311 192.83 98.42 98.42 -21.46 1.04 232.04 1 193.37 58.01 0 0 0 0 0 0 0 0 0 0 193.37 0.0000 0.0000 0.0000 0.0000; + 7323 37.83 -13.82 63.36 -13.82 1.02 149.37 1 124.48 37.34 0 0 0 0 0 0 0 0 0 0 124.47 0.0000 0.0000 0.0000 0.0000; + 7324 37.83 -13.82 63.36 -13.82 1.02 149.37 1 124.48 37.34 0 0 0 0 0 0 0 0 0 0 124.47 0.0000 0.0000 0.0000 0.0000; + 7325 37.83 -13.82 63.36 -13.82 1.02 149.37 1 124.48 37.34 0 0 0 0 0 0 0 0 0 0 124.47 0.0000 0.0000 0.0000 0.0000; + 7326 37.83 -13.82 63.36 -13.82 1.02 149.37 1 124.48 37.34 0 0 0 0 0 0 0 0 0 0 124.47 0.0000 0.0000 0.0000 0.0000; + 7329 30.97 38.19 51.87 -11.31 1.04 122.28 1 101.9 30.57 0 0 0 0 0 0 0 0 0 0 101.9 0.0000 0.0000 0.0000 0.0000; + 7334 0 0 2.19 -0.57 1.04 5.64 0 4.7 1.41 0 0 0 0 0 0 0 0 0 0 4.7 0.0000 0.0000 0.0000 0.0000; + 7335 137.82 140.29 211.33 -55.33 1.04 544.2 1 453.5 136.05 0 0 0 0 0 0 0 0 0 0 453.5 0.0000 0.0000 0.0000 0.0000; + 7349 312.96 130.17 159.74 -34.83 1.04 376.59 1 313.83 94.15 0 0 0 0 0 0 0 0 0 0 313.83 0.0000 0.0000 0.0000 0.0000; + 7350 312.96 56.24 159.74 -34.83 1.04 376.59 1 313.83 94.15 0 0 0 0 0 0 0 0 0 0 313.83 0.0000 0.0000 0.0000 0.0000; + 7351 312.96 44.34 159.74 -34.83 1.04 376.59 1 313.83 94.15 0 0 0 0 0 0 0 0 0 0 313.83 0.0000 0.0000 0.0000 0.0000; + 7352 312.96 46.01 159.74 -34.83 1.04 376.59 1 313.83 94.15 0 0 0 0 0 0 0 0 0 0 313.83 0.0000 0.0000 0.0000 0.0000; + 7353 594.86 72.18 348.26 -75.95 1.04 821.04 1 684.2 205.26 0 0 0 0 0 0 0 0 0 0 684.2 0.0000 0.0000 0.0000 0.0000; + 7354 591.08 116.42 348.26 -75.95 1.04 821.04 1 684.2 205.26 0 0 0 0 0 0 0 0 0 0 684.2 0.0000 0.0000 0.0000 0.0000; + 7355 591.08 115.58 348.26 -75.95 1.04 821.04 1 684.2 205.26 0 0 0 0 0 0 0 0 0 0 684.2 0.0000 0.0000 0.0000 0.0000; + 7356 591.03 120.29 348.26 -75.95 1.04 821.04 1 684.2 205 0 0 0 0 0 0 0 0 0 0 684.2 0.0000 0.0000 0.0000 0.0000; + 7357 16.25 8.3 8.3 -1.81 1.04 19.56 1 16.3 4.89 0 0 0 0 0 0 0 0 0 0 16.3 0.0000 0.0000 0.0000 0.0000; + 7358 224.58 36.74 114.63 -25 1.04 270.24 1 225.2 67.56 0 0 0 0 0 0 0 0 0 0 225.2 0.0000 0.0000 0.0000 0.0000; + 7359 224.58 80.96 114.63 -25 1.04 270.24 1 225.2 67.56 0 0 0 0 0 0 0 0 0 0 225.2 0.0000 0.0000 0.0000 0.0000; + 7360 224.58 49.54 114.63 -25 1.04 270.24 1 225.2 67.56 0 0 0 0 0 0 0 0 0 0 225.2 0.0000 0.0000 0.0000 0.0000; + 7361 102.42 30.29 52.27 -11.4 1.04 123.24 1 102.7 30.81 0 0 0 0 0 0 0 0 0 0 102.7 0.0000 0.0000 0.0000 0.0000; + 7369 106.97 30.15 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7370 106.97 24.26 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7371 106.97 29.01 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7372 106.97 30.97 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7373 106.97 54.6 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7374 106.97 38.05 54.6 -11.91 1.04 128.72 1 107.27 32.18 0 0 0 0 0 0 0 0 0 0 107.27 0.0000 0.0000 0.0000 0.0000; + 7375 183.15 37.31 93.48 -20.39 1.04 220.39 1 183.66 55.1 0 0 0 0 0 0 0 0 0 0 183.66 0.0000 0.0000 0.0000 0.0000; + 7376 183.15 40.5 93.48 -20.39 1.04 220.39 1 183.66 55.1 0 0 0 0 0 0 0 0 0 0 183.66 0.0000 0.0000 0.0000 0.0000; + 7377 183.15 51.52 93.48 -20.39 1.04 220.39 1 183.66 55.1 0 0 0 0 0 0 0 0 0 0 183.66 0.0000 0.0000 0.0000 0.0000; + 7378 183.15 41.99 93.48 -20.39 1.04 220.39 1 183.66 55.1 0 0 0 0 0 0 0 0 0 0 183.66 0.0000 0.0000 0.0000 0.0000; + 7379 183.15 45.29 93.48 -20.39 1.04 220.39 1 183.66 55.1 0 0 0 0 0 0 0 0 0 0 183.66 0.0000 0.0000 0.0000 0.0000; + 7389 541.3 276.29 276.29 -60.25 1.04 651.36 1 542.8 162.84 0 0 0 0 0 0 0 0 0 0 542.8 0.0000 0.0000 0.0000 0.0000; + 7400 71.8 -7.99 36.65 -7.99 1 86.4 1 72 21.6 0 0 0 0 0 0 0 0 0 0 72 0.0000 0.0000 0.0000 0.0000; + 7400 71.8 -7.99 36.65 -7.99 1 86.4 1 72 21.6 0 0 0 0 0 0 0 0 0 0 72 0.0000 0.0000 0.0000 0.0000; + 7400 71.8 -7.99 36.65 -7.99 1 86.4 1 72 21.6 0 0 0 0 0 0 0 0 0 0 72 0.0000 0.0000 0.0000 0.0000; + 7400 71.8 -7.99 36.65 -7.99 1 86.4 1 72 21.6 0 0 0 0 0 0 0 0 0 0 72 0.0000 0.0000 0.0000 0.0000; + 7400 143.6 -15.98 73.3 -15.98 1 172.8 1 144 43.2 0 0 0 0 0 0 0 0 0 0 144 0.0000 0.0000 0.0000 0.0000; + 7400 445.16 -49.55 227.22 -49.55 1 535.68 1 446.4 133.92 0 0 0 0 0 0 0 0 0 0 446.4 0.0000 0.0000 0.0000 0.0000; + 7406 62.93 32.12 32.12 -7 1.04 75.72 1 63.1 18.93 0 0 0 0 0 0 0 0 0 0 63.1 0.0000 0.0000 0.0000 0.0000; + 7406 309.14 157.79 157.79 -34.41 1.04 372 1 310 93 0 0 0 0 0 0 0 0 0 0 310 0.0000 0.0000 0.0000 0.0000; + 7414 102.12 52.12 52.12 -11.37 1.03 122.88 1 102.4 30.72 0 0 0 0 0 0 0 0 0 0 102.4 0.0000 0.0000 0.0000 0.0000; + 7419 87.96 -3.01 44.89 -9.79 1 105.84 1 88.2 26.46 0 0 0 0 0 0 0 0 0 0 88.2 0.0000 0.0000 0.0000 0.0000; + 7419 87.96 -3.01 44.89 -9.79 1 105.84 1 88.2 26.46 0 0 0 0 0 0 0 0 0 0 88.2 0.0000 0.0000 0.0000 0.0000; + 7422 2.07 3.46 3.46 -0.75 1.04 8.16 1 6.8 2.04 0 0 0 0 0 0 0 0 0 0 6.8 0.0000 0.0000 0.0000 0.0000; + 7422 52.33 44.86 87.65 -19.11 1.04 206.64 1 172.2 51.66 0 0 0 0 0 0 0 0 0 0 172.2 0.0000 0.0000 0.0000 0.0000; + 7422 52.33 44.86 87.65 -19.11 1.04 206.64 1 172.2 51.66 0 0 0 0 0 0 0 0 0 0 172.2 0.0000 0.0000 0.0000 0.0000; + 7422 34.19 44.86 57.26 -12.49 1.04 135 1 112.5 33.75 0 0 0 0 0 0 0 0 0 0 112.5 0.0000 0.0000 0.0000 0.0000; + 7422 34.19 44.86 57.26 -12.49 1.04 135 1 112.5 33.75 0 0 0 0 0 0 0 0 0 0 112.5 0.0000 0.0000 0.0000 0.0000; + 7422 34.19 44.86 57.26 -12.49 1.04 135 1 112.5 33.75 0 0 0 0 0 0 0 0 0 0 112.5 0.0000 0.0000 0.0000 0.0000; + 7422 34.19 44.86 57.26 -12.49 1.04 135 1 112.5 33.75 0 0 0 0 0 0 0 0 0 0 112.5 0.0000 0.0000 0.0000 0.0000; + 7422 58.08 44.86 97.27 -21.21 1.04 229.32 1 191.1 57.33 0 0 0 0 0 0 0 0 0 0 191.1 0.0000 0.0000 0.0000 0.0000; + 7422 52.33 44.86 87.65 -19.11 1.04 206.64 1 172.2 51.66 0 0 0 0 0 0 0 0 0 0 172.2 0.0000 0.0000 0.0000 0.0000; + 7422 52.33 44.86 87.65 -19.11 1.04 206.64 1 172.2 51.66 0 0 0 0 0 0 0 0 0 0 172.2 0.0000 0.0000 0.0000 0.0000; + 7422 52.33 44.86 87.65 -19.11 1.04 206.64 1 172.2 51.66 0 0 0 0 0 0 0 0 0 0 172.2 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 39.51 23.38 66.17 -14.43 1.04 156 1 130 39 0 0 0 0 0 0 0 0 0 0 130 0.0000 0.0000 0.0000 0.0000; + 7428 39.51 23.38 66.17 -14.43 1.04 156 1 130 39 0 0 0 0 0 0 0 0 0 0 130 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 30.55 23.38 51.16 -11.16 1.04 120.62 1 100.52 30.16 0 0 0 0 0 0 0 0 0 0 100.52 0.0000 0.0000 0.0000 0.0000; + 7428 22.79 23.38 38.17 -8.33 1.04 90 1 75 22.5 0 0 0 0 0 0 0 0 0 0 75 0.0000 0.0000 0.0000 0.0000; + 7428 0 0 41.23 -8.99 1.04 97.2 0 81 24.3 0 0 0 0 0 0 0 0 0 0 81 0.0000 0.0000 0.0000 0.0000; + 7428 3.56 5.96 5.96 -1.3 1.04 14.04 1 11.7 3.51 0 0 0 0 0 0 0 0 0 0 11.7 0.0000 0.0000 0.0000 0.0000; + 8024 33 0 0 0 1.04 52.8 1 33 33 0 0 0 0 0 0 0 0 0 0 44 0.0000 0.0000 0.0000 0.0000; + 8033 0 0 119.58 -26.08 1.04 281.91 0 234.93 70.48 0 0 0 0 0 0 0 0 0 0 234.93 0.0000 0.0000 0.0000 0.0000; + 8034 0 0 119.58 -26.08 1.04 281.91 0 234.93 70.48 0 0 0 0 0 0 0 0 0 0 234.93 0.0000 0.0000 0.0000 0.0000; + 8035 0 0 119.58 -26.08 1.04 281.91 0 234.93 70.48 0 0 0 0 0 0 0 0 0 0 234.93 0.0000 0.0000 0.0000 0.0000; + 8036 0 0 119.58 -26.08 1.04 281.91 0 234.93 70.48 0 0 0 0 0 0 0 0 0 0 234.93 0.0000 0.0000 0.0000 0.0000; + 8046 172.19 -19.17 87.89 -19.17 1.01 207.2 1 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8047 0 0 87.89 -19.17 1.01 207.2 0 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8048 172.19 87.89 87.89 -19.17 1.04 207.2 1 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8049 172.19 -19.17 87.89 -19.17 1.01 207.2 1 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8050 0 0 87.89 -19.17 1.01 207.2 0 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8051 0 0 87.89 -19.17 1.01 207.2 0 172.67 51.8 0 0 0 0 0 0 0 0 0 0 172.67 0.0000 0.0000 0.0000 0.0000; + 8060 0 0 276.52 -72.39 1 712.08 0 593.4 178.02 0 0 0 0 0 0 0 0 0 0 593.4 0.0000 0.0000 0.0000 0.0000; + 8061 0 0 276.52 -72.39 1 712.08 0 593.4 178.02 0 0 0 0 0 0 0 0 0 0 593.4 0.0000 0.0000 0.0000 0.0000; + 8070 0 0 431 -112.84 1 1109.88 0 924.9 277.47 0 0 0 0 0 0 0 0 0 0 924.9 0.0000 0.0000 0.0000 0.0000; + 8071 922.34 -94.45 431 -112.84 1 1109.88 1 924.9 277.47 0 0 0 0 0 0 0 0 0 0 924.9 0.0000 0.0000 0.0000 0.0000; + 8077 234.25 8.03 119.56 -26.07 1.03 281.88 1 234.9 70.47 0 0 0 0 0 0 0 0 0 0 234.9 0.0000 0.0000 0.0000 0.0000; + 8078 234.25 6.57 119.56 -26.07 1.03 281.88 1 234.9 70.47 0 0 0 0 0 0 0 0 0 0 234.9 0.0000 0.0000 0.0000 0.0000; + 8079 234.25 7.25 119.56 -26.07 1.03 281.88 1 234.9 70.47 0 0 0 0 0 0 0 0 0 0 234.9 0.0000 0.0000 0.0000 0.0000; + 8080 234.25 7.15 119.56 -26.07 1.03 281.88 1 234.9 70.47 0 0 0 0 0 0 0 0 0 0 234.9 0.0000 0.0000 0.0000 0.0000; + 8087 0 0 418.33 -109.52 1.04 1077.24 0 897.7 269.31 0 0 0 0 0 0 0 0 0 0 897.7 0.0000 0.0000 0.0000 0.0000; + 8088 895.21 139.83 418.33 -109.52 1.04 1077.24 1 897.7 269.31 0 0 0 0 0 0 0 0 0 0 897.7 0.0000 0.0000 0.0000 0.0000; + 8099 85.5 0 0 0 1.04 136.8 1 85.5 85.5 0 0 0 0 0 0 0 0 0 0 114 0.0000 0.0000 0.0000 0.0000; + 8115 0 0 4.66 -1.22 1.04 12 0 10 3 0 0 0 0 0 0 0 0 0 0 10 0.0000 0.0000 0.0000 0.0000; + 8116 0 0 163.89 -42.91 1.04 422.04 0 351.7 105.51 0 0 0 0 0 0 0 0 0 0 351.7 0.0000 0.0000 0.0000 0.0000; + 8117 227.52 69.52 163.89 -42.91 1.04 422.04 1 351.7 105.51 0 0 0 0 0 0 0 0 0 0 351.7 0.0000 0.0000 0.0000 0.0000; + 8129 658.17 -49.85 307.56 -80.52 1.03 792 1 660 198 0 0 0 0 0 0 0 0 0 0 660 0.0000 0.0000 0.0000 0.0000; + 8130 658.17 -8.92 307.56 -80.52 1.03 792 1 660 198 0 0 0 0 0 0 0 0 0 0 660 0.0000 0.0000 0.0000 0.0000; + 8131 658.17 -36.34 307.56 -80.52 1.03 792 1 660 198 0 0 0 0 0 0 0 0 0 0 660 0.0000 0.0000 0.0000 0.0000; + 8147 0 0 1.86 -0.49 1.03 4.8 0 4 1.2 0 0 0 0 0 0 0 0 0 0 4 0.0000 0.0000 0.0000 0.0000; + 8147 0 0 111.51 -29.19 1.03 287.16 0 239.3 71.79 0 0 0 0 0 0 0 0 0 0 239.3 0.0000 0.0000 0.0000 0.0000; + 8152 0 0 11.2 -2.44 1 26.4 0 22 6.6 0 0 0 0 0 0 0 0 0 0 22 0.0000 0.0000 0.0000 0.0000; + 8155 0 0 81.36 -21.3 1 209.52 0 174.6 52.38 0 0 0 0 0 0 0 0 0 0 174.6 0.0000 0.0000 0.0000 0.0000; + 8155 174.12 -21.3 81.36 -21.3 1 209.52 1 174.6 52.38 0 0 0 0 0 0 0 0 0 0 174.6 0.0000 0.0000 0.0000 0.0000; + 8158 0 0 53.44 -11.65 1 126 0 105 31.5 0 0 0 0 0 0 0 0 0 0 105 0.0000 0.0000 0.0000 0.0000; + 8158 0 0 49.98 -10.9 1 117.84 0 98.2 29.46 0 0 0 0 0 0 0 0 0 0 98.2 0.0000 0.0000 0.0000 0.0000; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax Pf Qf Pt Qt mu_Sf mu_St mu_angmin mu_angmax +mpc.branch = [ + 1001 1064 0.00524 0.0358 0.00609 221 0 0 0 0 1 0 0 67.5000 10.1400 -67.2500 -9.0000 0.0000 0.0000 0.0000 0.0000; + 1001 1064 0.00524 0.0358 0.00609 221 0 0 0 0 1 0 0 67.5000 10.1400 -67.2500 -9.0000 0.0000 0.0000 0.0000 0.0000; + 1001 1071 0.00435 0.02808 0.00536 221 0 0 0 0 1 0 0 -77.8900 -13.0900 78.1700 14.3700 0.0000 0.0000 0.0000 0.0000; + 1001 1071 0.00435 0.02808 0.00536 221 0 0 0 0 1 0 0 -77.8900 -13.0900 78.1700 14.3700 0.0000 0.0000 0.0000 0.0000; + 1002 1007 0.07776 0.46693 0.06336 98 0 0 0 0 1 0 0 1.1700 -5.0600 -1.1600 -1.6000 0.0000 0.0000 0.0000 0.0000; + 1010 1002 0.05552 0.1357 0.01777 98 0 0 0 0 1 0 0 16.7300 -2.2100 -16.5800 0.6900 0.0000 0.0000 0.0000 0.0000; + 1004 1003 0.0045 0.11582 0 250 0 0 1 0 1 0 0 -28.3100 5.4900 28.3500 -4.5600 0.0000 0.0000 0.0000 0.0000; + 1022 1003 0.00485 0.02012 0.00341 221 0 0 0 0 1 0 0 77.6900 -4.4100 -77.4000 5.2400 0.0000 0.0000 0.0000 0.0000; + 1055 1003 0.01574 0.03782 0.00513 98 0 0 0 0 1 0 0 -48.6900 1.0400 49.0600 -0.6800 0.0000 0.0000 0.0000 0.0000; + 1004 3133 0.0042 0.03 0.055 523 0 0 0 0 1 0 0 186.5600 -35.8700 -185.1100 40.5600 0.0000 0.0000 0.0000 0.0000; + 1006 1005 0.00602 0.14707 0 42 0 0 1 0 1 0 0 25.7300 -4.9400 -25.6900 5.9400 0.0000 0.0000 0.0000 0.0000; + 1025 1005 0.01842 0.0821 0.01204 149 0 0 0 0 1 0 0 42.7800 4.1800 -42.4500 -3.9600 0.0000 0.0000 0.0000 0.0000; + 1005 1061 0.00599 0.02484 0.00422 221 0 0 0 0 1 0 0 75.9000 -24.9600 -75.5300 26.0800 0.0000 0.0000 0.0000 0.0000; + 1067 1005 0.01711 0.04181 0.00548 102.9 0 0 0 0 1 0 0 7.8600 -23.2800 -7.7600 22.9800 0.0000 0.0000 0.0000 0.0000; + 1007 1015 0.06224 0.37375 0.05072 98 0 0 0 0 1 0 0 -1.2800 -3.0100 1.2800 -2.3700 0.0000 0.0000 0.0000 0.0000; + 1031 1007 0.04803 0.27434 0.04123 98 0 0 0 0 1 0 0 4.5900 -6.9200 -4.5700 2.7100 0.0000 0.0000 0.0000 0.0000; + 1009 1008 0.00455 0.09471 0 120 0 0 1 0 1 0 0 61.8700 -11.8800 -61.6900 15.5300 0.0000 0.0000 0.0000 0.0000; + 1008 1032 0.04501 0.11002 0.01441 102.9 0 0 0 0 1 0 0 57.4600 -5.8500 -56.0300 7.8600 0.0000 0.0000 0.0000 0.0000; + 1008 1069 0.0083 0.03628 0.00553 149 0 0 0 0 1 0 0 4.2400 -9.6800 -4.2300 9.1400 0.0000 0.0000 0.0000 0.0000; + 1011 1010 0.00721 0.3246 0 46 0 0 1 0 1 0 0 9.9700 0.0000 -9.9700 0.3000 0.0000 0.0000 0.0000 0.0000; + 1010 1015 0.04703 0.28243 0.03833 98 0 0 0 0 1 0 0 8.8300 -4.1000 -8.7900 0.2500 0.0000 0.0000 0.0000 0.0000; + 1010 1030 0.0616 0.3699 0.0502 98 0 0 0 0 1 0 0 -15.5900 3.6800 15.7500 -7.9600 0.0000 0.0000 0.0000 0.0000; + 1012 1087 0.04934 0.20469 0.03473 149 0 0 0 0 1 0 0 -76.3000 16.4500 79.2400 -7.9000 0.0000 0.0000 0.0000 0.0000; + 3051 1012 0.0571 0.24977 0.03804 149 0 0 0 0 1 0 0 -70.3300 16.6400 73.3100 -7.4700 0.0000 0.0000 0.0000 0.0000; + 1013 1031 0.04509 0.27078 0.03675 98 0 0 0 0 1 0 0 13.9300 -7.4800 -13.8300 4.3000 0.0000 0.0000 0.0000 0.0000; + 1047 1013 0.00947 0.06117 0.01167 221 0 0 0 0 1 0 0 58.8200 -10.2100 -58.4900 11.1600 0.0000 0.0000 0.0000 0.0000; + 1086 1013 0.079 0.19311 0.02529 98 0 0 0 0 1 0 0 -15.0600 10.0100 15.3300 -11.9500 0.0000 0.0000 0.0000 0.0000; + 1014 1047 0.03566 0.14794 0.0251 149 0 0 0 0 1 0 0 17.2500 -0.2000 -17.1500 -1.9500 0.0000 0.0000 0.0000 0.0000; + 1014 1083 0.04105 0.18293 0.02682 149 0 0 0 0 1 0 0 -19.4700 -0.4300 19.6200 -1.6800 0.0000 0.0000 0.0000 0.0000; + 1016 1034 0.01828 0.10976 0.01489 98 0 0 0 0 1 0 0 -16.6400 13.7400 16.7200 -14.7500 0.0000 0.0000 0.0000 0.0000; + 1068 1016 0.02773 0.15837 0.0238 98 0 0 0 0 1 0 0 -13.6100 -18.2100 13.7500 16.5900 0.0000 0.0000 0.0000 0.0000; + 1018 1017 0.03227 0.07887 0.01033 98 0 0 0 0 1 0 0 26.3000 -3.2600 -26.0800 2.8000 0.0000 0.0000 0.0000 0.0000; + 1017 1029 0.03244 0.14188 0.02161 149 0 0 0 0 1 0 0 36.5200 -35.6500 -35.6900 37.1100 0.0000 0.0000 0.0000 0.0000; + 1037 1017 0.00752 0.03352 0.00491 221 0 0 0 0 1 0 0 -57.1200 -13.4700 57.3900 14.1900 0.0000 0.0000 0.0000 0.0000; + 1047 1017 0.036 0.156 0.024 150 0 0 0 0 1 0 0 88.9900 -3.7200 -86.1800 13.4700 0.0000 0.0000 0.0000 0.0000; + 1024 1018 0.01094 0.06572 0.00892 98 0 0 0 0 1 0 0 26.4500 -3.6600 -26.3700 3.2400 0.0000 0.0000 0.0000 0.0000; + 1019 1040 0.04978 0.20651 0.03504 149 0 0 0 0 1 0 0 -13.7300 5.7900 13.8500 -8.7900 0.0000 0.0000 0.0000 0.0000; + 1019 1045 0.01522 0.0372 0.00487 221 0 0 0 0 1 0 0 104.6400 16.2200 -102.9400 -12.5600 0.0000 0.0000 0.0000 0.0000; + 1019 1071 0.0044 0.028 0.0054 225 0 0 0 0 1 0 0 -43.9500 52.8500 44.1500 -52.0700 0.0000 0.0000 0.0000 0.0000; + 1071 1019 0.0044 0.028 0.0054 225 0 0 0 0 1 0 0 44.1500 -52.0700 -43.9500 52.8500 0.0000 0.0000 0.0000 0.0000; + 1019 1084 0.03 0.16 0.025 220 0 0 0 0 1 0 0 -64.7900 -1.0700 66.0400 5.1500 0.0000 0.0000 0.0000 0.0000; + 1021 1020 0.00327 0.07812 0 250 0 0 1 0 1 0 0 149.6300 -28.7300 -148.8700 46.8100 0.0000 0.0000 0.0000 0.0000; + 1025 1020 0.00828 0.03434 0.00583 149 0 0 0 0 1 0 0 50.0000 -26.0400 -49.7500 26.4700 0.0000 0.0000 0.0000 0.0000; + 1084 1020 0.01056 0.06337 0.0086 221 0 0 0 0 1 0 0 -33.7500 9.4400 33.8700 -9.6100 0.0000 0.0000 0.0000 0.0000; + 1020 3059 0.0189 0.06 0.006 300 0 0 0 0 1 0 0 62.9400 3.9800 -62.2300 -2.3400 0.0000 0.0000 0.0000 0.0000; + 1020 3130 0.00996 0.06938 0.01134 221 0 0 0 0 1 0 0 101.8200 13.1000 -100.8200 -7.3200 0.0000 0.0000 0.0000 0.0000; + 1023 1022 0.00535 0.11733 0 250 0 0 1 0 1 0 0 135.0000 -0.5500 -134.0500 21.5200 0.0000 0.0000 0.0000 0.0000; + 1022 1028 0.01433 0.09253 0.01765 221 0 0 0 0 1 0 0 28.1800 -8.5600 -28.0600 7.4900 0.0000 0.0000 0.0000 0.0000; + 1022 1028 0.01433 0.09253 0.01765 221 0 0 0 0 1 0 0 28.1800 -8.5600 -28.0600 7.4900 0.0000 0.0000 0.0000 0.0000; + 1024 1090 0.01414 0.06303 0.00924 149 0 0 0 0 1 0 0 -89.4900 -14.2000 90.6600 18.4600 0.0000 0.0000 0.0000 0.0000; + 1026 1025 0.0042 0.18046 0 200 0 0 1 0 1 0 0 93.1500 -6.1300 -92.7800 21.8600 0.0000 0.0000 0.0000 0.0000; + 1027 1045 0.02505 0.10957 0.01669 221 0 0 0 0 1 0 0 -14.7900 31.6900 15.1000 -31.9900 0.0000 0.0000 0.0000 0.0000; + 1056 1027 0.03121 0.0763 0.00999 250 0 0 0 0 1 0 0 88.7800 -12.0300 -86.4200 16.7500 0.0000 0.0000 0.0000 0.0000; + 1028 3109 0.00428 0.01875 0.00286 250 0 0 0 0 1 0 0 46.1100 -17.8200 -46.0100 17.9700 0.0000 0.0000 0.0000 0.0000; + 1029 1056 0.02054 0.11733 0.01763 221 0 0 0 0 1 0 0 -47.5000 8.7200 47.9500 -7.9900 0.0000 0.0000 0.0000 0.0000; + 1030 1038 0.07404 0.42285 0.06354 98 0 0 0 0 1 0 0 -23.6800 1.6500 24.1000 -5.8600 0.0000 0.0000 0.0000 0.0000; + 1083 1030 0.06537 0.37334 0.0561 98 0 0 0 0 1 0 0 16.8800 -4.1500 -16.7000 -0.6700 0.0000 0.0000 0.0000 0.0000; + 1033 1032 0.00283 0.06758 0 170 0 0 1 0 1 0 0 -119.7000 39.3200 120.1300 -29.1300 0.0000 0.0000 0.0000 0.0000; + 1032 1036 0.01956 0.11746 0.01594 98 0 0 0 0 1 0 0 3.8000 3.6500 -3.8000 -5.2100 0.0000 0.0000 0.0000 0.0000; + 1038 1032 0.045 0.11 0.015 155 0 0 0 0 1 0 0 70.1000 -13.7900 -67.9000 17.6200 0.0000 0.0000 0.0000 0.0000; + 1033 1081 0.003 0.031 0.059 548 0 0 0 0 1 0 0 101.4300 -24.8900 -101.1300 21.8300 0.0000 0.0000 0.0000 0.0000; + 1033 3050 0.0139 0.136 0.262 647 0 0 0 0 1 0 0 226.7700 -1.8300 -219.9600 40.9400 0.0000 0.0000 0.0000 0.0000; + 1035 1034 0.00438 0.08496 0 130 0 0 1 0 1 0 0 67.5000 -9.1500 -67.3000 13.0900 0.0000 0.0000 0.0000 0.0000; + 1067 1034 0.00795 0.04771 0.00647 98 0 0 0 0 1 0 0 -50.3700 -1.1100 50.5700 1.6600 0.0000 0.0000 0.0000 0.0000; + 1088 1036 0.02065 0.11793 0.01772 98 0 0 0 0 1 0 0 9.8200 -3.0200 -9.8000 1.3600 0.0000 0.0000 0.0000 0.0000; + 1037 1071 0.00669 0.04319 0.00824 300 0 0 0 0 1 0 0 -45.1100 -15.5000 45.2700 15.7100 0.0000 0.0000 0.0000 0.0000; + 1039 1038 0.00201 0.08591 0 200 0 0 1 0 1 0 0 110.6300 -20.7600 -110.3800 31.6500 0.0000 0.0000 0.0000 0.0000; + 1082 1038 0.01115 0.04969 0.00729 149 0 0 0 0 1 0 0 61.2700 -6.5300 -60.8700 7.5700 0.0000 0.0000 0.0000 0.0000; + 1083 1038 0.01 0.05 0.007 221 0 0 0 0 1 0 0 -76.4400 21.8700 77.0500 -19.5700 0.0000 0.0000 0.0000 0.0000; + 1040 1090 0.02991 0.13329 0.01955 149 0 0 0 0 1 0 0 -58.2100 -3.7800 59.2300 6.3600 0.0000 0.0000 0.0000 0.0000; + 1042 1041 0.00419 0.11123 0 145 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1043 1041 0.003 0.12844 0 95 0 0 1 0 1 0 0 44.1000 -3.6100 -44.0400 6.1200 0.0000 0.0000 0.0000 0.0000; + 1065 1041 0.00386 0.02203 0.00331 147 0 0 0 0 1 0 0 15.1500 10.5800 -15.1400 -10.8400 0.0000 0.0000 0.0000 0.0000; + 1041 1067 0.00393 0.01722 0.00262 156.45 0 0 0 0 1 0 0 59.1800 4.7200 -59.0400 -4.3800 0.0000 0.0000 0.0000 0.0000; + 1044 3019 0.03857 0.17192 0.02521 149 0 0 0 0 1 0 0 46.6500 -18.4200 -45.7200 19.9000 0.0000 0.0000 0.0000 0.0000; + 3130 1044 0.02731 0.19029 0.03111 221 0 0 0 0 1 0 0 62.3900 -10.0400 -61.3300 14.2600 0.0000 0.0000 0.0000 0.0000; + 1045 1064 0.00545 0.03794 0.0062 221 0 0 0 0 1 0 0 -10.7200 16.6300 10.7400 -17.0600 0.0000 0.0000 0.0000 0.0000; + 1087 1046 0.03262 0.14269 0.02173 149 0 0 0 0 1 0 0 78.2100 -13.2400 -76.2900 19.3600 0.0000 0.0000 0.0000 0.0000; + 1046 3009 0.05654 0.23454 0.0398 149 0 0 0 0 1 0 0 65.2000 -9.8200 -62.8900 15.2000 0.0000 0.0000 0.0000 0.0000; + 1048 1047 0.00335 0.06576 0 390 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1049 1047 0.00276 0.11783 0 390 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1050 1047 0.00313 0.09941 0 124 0 0 1 0 1 0 0 89.1500 -7.5200 -88.9000 15.4800 0.0000 0.0000 0.0000 0.0000; + 1051 1047 0.0056 0.1283 0 117 0 0 1 0 1 0 0 89.1500 -5.5000 -88.7100 15.7400 0.0000 0.0000 0.0000 0.0000; + 1052 1047 0.00368 0.0826 0 110 0 0 1 0 1 0 0 89.1500 -9.9200 -88.8600 16.5500 0.0000 0.0000 0.0000 0.0000; + 1053 1047 0.0023 0.08808 0 250 0 0 1 0 1 0 0 -80.6700 24.8600 80.8300 -18.9000 0.0000 0.0000 0.0000 0.0000; + 1047 1085 0.00947 0.06117 0.01167 221 0 0 0 0 1 0 0 54.9900 -13.0000 -54.6900 13.7200 0.0000 0.0000 0.0000 0.0000; + 1053 1081 0.003 0.03 0.06 548 0 0 0 0 1 0 0 80.6700 -24.8600 -80.4700 20.5100 0.0000 0.0000 0.0000 0.0000; + 1054 1056 0.02202 0.09633 0.01467 149 0 0 0 0 1 0 0 -12.0300 -16.3600 12.1200 15.1900 0.0000 0.0000 0.0000 0.0000; + 1089 1054 0.08737 0.21357 0.02796 98 0 0 0 0 1 0 0 3.1200 -14.5000 -2.9600 12.1100 0.0000 0.0000 0.0000 0.0000; + 1055 1089 0.04982 0.12179 0.01595 98 0 0 0 0 1 0 0 44.7100 -2.1700 -43.7200 3.0000 0.0000 0.0000 0.0000 0.0000; + 1057 1056 0.00315 0.1312 0 160 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1056 1061 0.02267 0.12946 0.01945 150 0 0 0 0 1 0 0 -59.7200 26.4300 60.6500 -23.1800 0.0000 0.0000 0.0000 0.0000; + 1056 1065 0.02269 0.12962 0.01948 250 0 0 0 0 1 0 0 -89.1300 37.9500 91.1500 -28.4100 0.0000 0.0000 0.0000 0.0000; + 1059 1058 0.02655 0.46187 0 33 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1060 1058 0.00894 0.38854 0 27 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1069 1058 0.0074 0.05155 0.00843 221 0 0 0 0 1 0 0 87.4300 -8.1600 -86.8900 11.0400 0.0000 0.0000 0.0000 0.0000; + 1069 1058 0.0074 0.05155 0.00843 221 0 0 0 0 1 0 0 87.4300 -8.1600 -86.8900 11.0400 0.0000 0.0000 0.0000 0.0000; + 1058 1087 0.01573 0.10956 0.01791 221 0 0 0 0 1 0 0 80.1600 -12.9500 -79.1800 17.8900 0.0000 0.0000 0.0000 0.0000; + 1058 1087 0.01573 0.10956 0.01791 221 0 0 0 0 1 0 0 80.1600 -12.9500 -79.1800 17.8900 0.0000 0.0000 0.0000 0.0000; + 1062 1061 0.0163 0.31787 0 29 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1063 1061 0.00567 0.10409 0 260 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1061 3042 0.054 0.18 0.028 221 0 0 0 0 1 0 0 14.8800 -2.8900 -14.7700 0.4400 0.0000 0.0000 0.0000 0.0000; + 1066 1065 0.00508 0.12315 0 200 0 0 1 0 1 0 0 106.8800 -3.7400 -106.3000 17.8300 0.0000 0.0000 0.0000 0.0000; + 1088 1068 0.02962 0.16921 0.02543 98 0 0 0 0 1 0 0 46.4300 -0.2400 -45.7900 1.3800 0.0000 0.0000 0.0000 0.0000; + 1070 1069 0.00297 0.07 0 220 0 0 1 0 1 0 0 120.3800 18.5800 -119.9700 -8.9800 0.0000 0.0000 0.0000 0.0000; + 1082 1069 0.02137 0.0952 0.01396 149 0 0 0 0 1 0 0 51.2300 -15.0700 -50.6500 16.1700 0.0000 0.0000 0.0000 0.0000; + 1072 1071 0.00529 0.08551 0 240 0 0 1 0 1 0 0 191.6000 25.7900 -189.6700 5.5400 0.0000 0.0000 0.0000 0.0000; + 1073 1071 0.00499 0.14254 0 240 0 0 1 0 1 0 0 191.6000 32.8800 -189.7500 19.9300 0.0000 0.0000 0.0000 0.0000; + 1074 1071 0.00575 0.12453 0 240 0 0 1 0 1 0 0 191.6000 29.1800 -189.4900 16.6800 0.0000 0.0000 0.0000 0.0000; + 1075 1071 0.00373 0.09967 0 240 0 0 1 0 1 0 0 191.6000 30.0300 -190.2300 6.7200 0.0000 0.0000 0.0000 0.0000; + 1076 1071 0.00141 0.04937 0 230 0 0 1 0 1 0 0 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1077 1071 0.00641 0.12047 0 230 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 1078 1071 0.00533 0.19087 0 137 0 0 1 0 1 0 0 95.2400 15.8900 -94.7500 1.5600 0.0000 0.0000 0.0000 0.0000; + 1079 1071 0.00013 0.046 0 2000 0 0 1 0 1 0 0 -639.8900 160.5000 640.4400 31.9900 0.0000 0.0000 0.0000 0.0000; + 1080 1071 0.01206 0.20208 0 136 0 0 1 0 1 0 0 95.2400 12.7700 -94.1500 5.5200 0.0000 0.0000 0.0000 0.0000; + 1081 1071 0.00167 0.0665 0 350 0 0 1 0 1 0 0 73.9400 59.8400 -73.8000 -54.1700 0.0000 0.0000 0.0000 0.0000; + 3048 1079 0.0013 0.015 1.02 2300 0 0 0 0 1 0 0 -365.8600 -1.0600 367.5700 -85.5500 0.0000 0.0000 0.0000 0.0000; + 3048 1079 0.0013 0.015 1.02 2300 0 0 0 0 1 0 0 -365.8600 -1.0600 367.5700 -85.5500 0.0000 0.0000 0.0000 0.0000; + 1081 3058 0.0091 0.089 0.171 548 0 0 0 0 1 0 0 107.6600 -17.5600 -106.6600 9.1600 0.0000 0.0000 0.0000 0.0000; + 1084 3130 0.02049 0.09131 0.01339 221 0 0 0 0 1 0 0 54.3300 10.0100 -53.7300 -8.7500 0.0000 0.0000 0.0000 0.0000; + 1085 1086 0.03392 0.14838 0.0226 149 0 0 0 0 1 0 0 24.8500 -11.1700 -24.6100 9.8800 0.0000 0.0000 0.0000 0.0000; + 1090 1085 0.02018 0.13786 0.02346 221 0 0 0 0 1 0 0 -8.5200 6.3400 8.5400 -8.5900 0.0000 0.0000 0.0000 0.0000; + 2029 1091 0.0389 0.17144 0.0798 187 0 0 0 0 1 0 0 -18.3800 -3.8600 18.5100 -4.0400 0.0000 0.0000 0.0000 0.0000; + 1091 2048 0.02193 0.09667 0.045 187 0 0 0 0 1 0 0 13.2800 -4.2300 -13.2500 -0.4000 0.0000 0.0000 0.0000 0.0000; + 2098 1091 0.00554 0.02443 0.01137 187 0 0 0 0 1 0 0 43.5100 -5.7600 -43.4100 4.9800 0.0000 0.0000 0.0000 0.0000; + 2022 2001 0.00839 0.03697 0.01721 187 0 0 0 0 1 0 0 66.0900 7.3200 -65.7300 -7.4600 0.0000 0.0000 0.0000 0.0000; + 2027 2001 0.00955 0.04062 0.02032 187 0 0 0 0 1 0 0 -17.3400 4.3300 17.3700 -6.2400 0.0000 0.0000 0.0000 0.0000; + 2003 2002 0.0003 0.01986 0 981 0 0 1 0 1 0 0 -202.8700 0.4000 202.9900 7.5900 0.0000 0.0000 0.0000 0.0000; + 2004 2002 0.00022 0.01466 0 635 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2005 2002 0.00033 0.01714 0 645 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2006 2002 0.00036 0.02679 0 636 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2021 2002 0.00097 0.01175 0.78032 2295 0 0 0 0 1 0 0 740.0000 -52.2500 -734.8400 34.5500 0.0000 0.0000 0.0000 0.0000; + 2002 2101 0.00031 0.0037 0.24573 2020 0 0 0 0 1 0 0 531.8400 -42.1400 -530.9900 27.1800 0.0000 0.0000 0.0000 0.0000; + 2038 2003 0.00353 0.02067 0.01032 251 0 0 0 0 1 0 0 -41.8600 -8.0500 41.9300 7.3700 0.0000 0.0000 0.0000 0.0000; + 2003 2047 0.0013 0.0099 0.0052 310 0 0 0 0 1 0 0 160.9500 -7.7600 -160.6200 9.7400 0.0000 0.0000 0.0000 0.0000; + 2007 2114 0.00888 0.05207 0.026 251 0 0 0 0 1 0 0 -76.2500 -3.5100 76.7600 3.8800 0.0000 0.0000 0.0000 0.0000; + 2007 2122 0.00861 0.03661 0.01831 187 0 0 0 0 1 0 0 66.7100 0.8100 -66.3300 -1.0200 0.0000 0.0000 0.0000 0.0000; + 2014 2008 0.02253 0.09931 0.04623 187 0 0 0 0 1 0 0 -10.2900 -0.3100 10.3200 -4.3900 0.0000 0.0000 0.0000 0.0000; + 2008 2052 0.01877 0.08271 0.0385 187 0 0 0 0 1 0 0 -18.3800 2.1100 18.4400 -5.8300 0.0000 0.0000 0.0000 0.0000; + 2009 2049 0.01224 0.07176 0.03583 251 0 0 0 0 1 0 0 -103.9000 23.9100 105.2400 -19.8100 0.0000 0.0000 0.0000 0.0000; + 2009 2082 0.00735 0.03126 0.01563 187 0 0 0 0 1 0 0 -8.4000 62.0900 8.6800 -62.5000 0.0000 0.0000 0.0000 0.0000; + 2109 2009 0.00725 0.03084 0.01542 250 0 0 0 0 1 0 0 -72.7300 -28.5200 73.1600 28.7600 0.0000 0.0000 0.0000 0.0000; + 2061 2010 0.02439 0.10748 0.05003 187 0 0 0 0 1 0 0 -16.6400 -4.2600 16.7000 -0.7300 0.0000 0.0000 0.0000 0.0000; + 2010 2079 0.02061 0.09083 0.04228 187 0 0 0 0 1 0 0 -34.6600 4.4800 34.9000 -7.9000 0.0000 0.0000 0.0000 0.0000; + 2010 2091 0.02461 0.10467 0.05235 187 0 0 0 0 1 0 0 -38.8500 12.1700 39.2500 -15.9800 0.0000 0.0000 0.0000 0.0000; + 2012 2011 0.00044 0.03546 0 461 0 0 1 0 1 0 0 116.6300 -31.1100 -116.5700 36.0000 0.0000 0.0000 0.0000 0.0000; + 2013 2011 0.00043 0.02897 0 412 0 0 1 0 1 0 0 150.4500 -28.8900 -150.3600 35.2900 0.0000 0.0000 0.0000 0.0000; + 2127 2011 0.00108 0.01307 0.86827 2020 0 0 0 0 1 0 0 -266.2100 -13.8500 266.9300 -71.2900 0.0000 0.0000 0.0000 0.0000; + 2012 2041 0.01245 0.05297 0.02649 187 0 0 0 0 1 0 0 -72.0300 15.3100 72.6700 -15.3800 0.0000 0.0000 0.0000 0.0000; + 2012 2052 0.02008 0.08851 0.0412 187 0 0 0 0 1 0 0 43.6400 -1.5100 -43.2800 -1.2100 0.0000 0.0000 0.0000 0.0000; + 2093 2012 0.01029 0.04536 0.02111 187 0 0 0 0 1 0 0 -29.0100 7.1100 29.0900 -8.9500 0.0000 0.0000 0.0000 0.0000; + 2012 2123 0.00995 0.0423 0.02115 251 0 0 0 0 1 0 0 -117.3400 26.2700 118.7100 -22.7000 0.0000 0.0000 0.0000 0.0000; + 2014 2029 0.01859 0.07908 0.03955 187 0 0 0 0 1 0 0 -15.1300 -6.9000 15.1800 2.9500 0.0000 0.0000 0.0000 0.0000; + 2015 2037 0.00862 0.03799 0.01769 187 0 0 0 0 1 0 0 8.9800 -32.8600 -8.8900 31.4400 0.0000 0.0000 0.0000 0.0000; + 5014 2015 0.00961 0.04237 0.01972 187 0 0 0 0 1 0 0 13.7800 -33.0100 -13.6700 31.5300 0.0000 0.0000 0.0000 0.0000; + 2043 2016 0.00593 0.02614 0.01217 187 0 0 0 0 1 0 0 22.6400 -11.3700 -22.6000 10.2900 0.0000 0.0000 0.0000 0.0000; + 2069 2016 0.0084 0.03705 0.01725 280.5 0 0 0 0 1 0 0 46.9200 29.2200 -46.6700 -29.9200 0.0000 0.0000 0.0000 0.0000; + 2018 2017 0.00048 0.05045 0 271 0 0 1 0 1 0 0 28.9100 -5.0100 -28.9100 5.4200 0.0000 0.0000 0.0000 0.0000; + 2019 2017 0.0002 0.01182 0 454 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2017 2096 0.00253 0.03068 2.03836 2020 0 0 0 0 1 0 0 -256.6400 -74.2500 258.2400 -122.8500 0.0000 0.0000 0.0000 0.0000; + 2017 2127 0.00089 0.01081 0.71846 2020 0 0 0 0 1 0 0 285.5500 -143.7400 -284.7700 76.1300 0.0000 0.0000 0.0000 0.0000; + 2018 2093 0.01163 0.05125 0.02386 187 0 0 0 0 1 0 0 -28.9100 5.0100 29.0100 -7.1100 0.0000 0.0000 0.0000 0.0000; + 2045 2020 0.00097 0.00548 0.00295 310 0 0 0 0 1 0 0 -167.0500 20.1200 167.3300 -18.8500 0.0000 0.0000 0.0000 0.0000; + 2055 2020 0.00102 0.00744 0.00422 409 0 0 0 0 1 0 0 215.7800 -2.2000 -215.3000 5.2600 0.0000 0.0000 0.0000 0.0000; + 2022 2021 0.00034 0.01888 0 867 0 0 1 0 1 0 0 -183.3600 -13.6800 183.4700 19.9200 0.0000 0.0000 0.0000 0.0000; + 2023 2021 0.00054 0.03406 0 319 0 0 1 0 1 0 0 83.1000 15.4400 -83.0600 -13.1000 0.0000 0.0000 0.0000 0.0000; + 2024 2021 0.00036 0.02425 0 391 0 0 1 0 1 0 0 166.2100 22.7000 -166.1200 -16.1500 0.0000 0.0000 0.0000 0.0000; + 2113 2021 0.0001 0.00124 0.08207 2020 0 0 0 0 1 0 0 674.7300 -64.4900 -674.2900 61.5700 0.0000 0.0000 0.0000 0.0000; + 2022 2040 0.02207 0.09391 0.04697 187 0 0 0 0 1 0 0 12.6400 -2.5700 -12.6100 -2.0700 0.0000 0.0000 0.0000 0.0000; + 2064 2022 0.00558 0.03156 0.01697 251 0 0 0 0 1 0 0 -92.5800 -4.6900 93.0600 5.6600 0.0000 0.0000 0.0000 0.0000; + 2025 2055 0.0023 0.01016 0.00473 187 0 0 0 0 1 0 0 -33.3200 -25.3600 33.3600 25.0700 0.0000 0.0000 0.0000 0.0000; + 2067 2025 0.00317 0.014 0.00651 187 0 0 0 0 1 0 0 6.3100 -14.7500 -6.3000 14.1400 0.0000 0.0000 0.0000 0.0000; + 2058 2026 0.02475 0.10526 0.05264 187 0 0 0 0 1 0 0 64.2900 -13.4400 -63.3000 12.0900 0.0000 0.0000 0.0000 0.0000; + 2128 2026 0.01207 0.05318 0.02475 187 0 0 0 0 1 0 0 -44.4700 15.8800 44.7300 -17.3600 0.0000 0.0000 0.0000 0.0000; + 2027 2090 0.01692 0.07455 0.0347 187 0 0 0 0 1 0 0 13.7800 -5.3400 -13.7500 1.9900 0.0000 0.0000 0.0000 0.0000; + 2028 2045 0.00363 0.02129 0.01063 251 0 0 0 0 1 0 0 -143.6600 30.0800 144.4500 -26.5200 0.0000 0.0000 0.0000 0.0000; + 2028 2109 0.01026 0.0452 0.02104 250 0 0 0 0 1 0 0 -38.7300 -20.2100 38.9200 18.9400 0.0000 0.0000 0.0000 0.0000; + 2112 2028 0.00369 0.02161 0.01079 310 0 0 0 0 1 0 0 -167.1000 19.0200 168.1500 -13.9100 0.0000 0.0000 0.0000 0.0000; + 2030 2106 0.0118 0.05199 0.0242 187 0 0 0 0 1 0 0 67.2800 -17.2200 -66.7000 17.3800 0.0000 0.0000 0.0000 0.0000; + 2122 2030 0.00737 0.0432 0.02157 251 0 0 0 0 1 0 0 115.4100 -0.2100 -114.4200 3.8600 0.0000 0.0000 0.0000 0.0000; + 2031 2048 0.02398 0.10567 0.04919 187 0 0 0 0 1 0 0 33.2900 -13.6200 -33.0100 9.6300 0.0000 0.0000 0.0000 0.0000; + 2031 2087 0.02177 0.09259 0.04631 187 0 0 0 0 1 0 0 -39.0600 11.9800 39.4100 -15.3300 0.0000 0.0000 0.0000 0.0000; + 2032 2114 0.01097 0.04834 0.0225 187 0 0 0 0 1 0 0 -59.6000 -0.6600 59.9900 0.0700 0.0000 0.0000 0.0000 0.0000; + 2122 2032 0.01414 0.06232 0.02901 187 0 0 0 0 1 0 0 -55.8100 -0.6700 56.2500 -0.2900 0.0000 0.0000 0.0000 0.0000; + 2129 2033 0.00522 0.02298 0.0107 187 0 0 0 0 1 0 0 -38.6100 14.7500 38.7000 -15.4100 0.0000 0.0000 0.0000 0.0000; + 2033 5288 0.00925 0.03935 0.01968 187 0 0 0 0 1 0 0 -52.2700 11.5600 52.5400 -12.3500 0.0000 0.0000 0.0000 0.0000; + 2034 2043 0.00439 0.01867 0.00934 187 0 0 0 0 1 0 0 26.9100 -10.9700 -26.8700 10.1700 0.0000 0.0000 0.0000 0.0000; + 2046 2034 0.00468 0.01993 0.00997 187 0 0 0 0 1 0 0 32.3000 -10.2500 -32.2500 9.4600 0.0000 0.0000 0.0000 0.0000; + 2035 2066 0.01411 0.08272 0.04131 251 0 0 0 0 1 0 0 -61.5700 12.3900 62.1100 -13.5300 0.0000 0.0000 0.0000 0.0000; + 2035 2091 0.01863 0.10528 0.05663 251 0 0 0 0 1 0 0 56.8900 -13.7100 -56.2900 11.1500 0.0000 0.0000 0.0000 0.0000; + 2036 2055 0.00216 0.0092 0.0046 300 0 0 0 0 1 0 0 -89.5000 43.3500 89.7100 -42.9000 0.0000 0.0000 0.0000 0.0000; + 2036 2082 0.00236 0.01003 0.00502 250 0 0 0 0 1 0 0 47.9100 -55.1300 -47.7900 55.1600 0.0000 0.0000 0.0000 0.0000; + 2037 2065 0.00415 0.02434 0.01216 251 0 0 0 0 1 0 0 141.3500 -36.6200 -140.5100 40.2900 0.0000 0.0000 0.0000 0.0000; + 2110 2037 0.00307 0.01798 0.00898 251 0 0 0 0 1 0 0 136.5100 -1.9500 -135.9600 4.1900 0.0000 0.0000 0.0000 0.0000; + 2081 2038 0.00639 0.03748 0.01871 251 0 0 0 0 1 0 0 -39.1600 -8.6100 39.2600 7.3100 0.0000 0.0000 0.0000 0.0000; + 2039 2086 0.00845 0.03725 0.01734 187 0 0 0 0 1 0 0 -53.1200 8.4000 53.3700 -9.0300 0.0000 0.0000 0.0000 0.0000; + 5285 2039 0.00569 0.03334 0.01665 251 0 0 0 0 1 0 0 22.9100 -8.7600 -22.8800 7.3100 0.0000 0.0000 0.0000 0.0000; + 2039 5455 0.00371 0.02173 0.01085 251 0 0 0 0 1 0 0 70.4400 -17.2900 -70.2400 17.3700 0.0000 0.0000 0.0000 0.0000; + 2040 2114 0.02335 0.09932 0.04967 187 0 0 0 0 1 0 0 -31.1000 1.3800 31.3200 -5.4900 0.0000 0.0000 0.0000 0.0000; + 2121 2040 0.00894 0.03938 0.01833 187 0 0 0 0 1 0 0 -27.7400 2.2600 27.8000 -3.8100 0.0000 0.0000 0.0000 0.0000; + 2042 2041 0.00216 0.07846 0 95 0 0 1 0 1 0 0 59.7000 -11.4600 -59.6200 14.2400 0.0000 0.0000 0.0000 0.0000; + 2041 2058 0.0136 0.05786 0.02893 187 0 0 0 0 1 0 0 -13.0500 1.1300 13.0700 -4.1000 0.0000 0.0000 0.0000 0.0000; + 2065 2044 0.01021 0.04497 0.02093 187 0 0 0 0 1 0 0 -4.7400 19.5600 4.7800 -21.5600 0.0000 0.0000 0.0000 0.0000; + 2044 2102 0.01465 0.06453 0.03004 187 0 0 0 0 1 0 0 -32.1900 13.7900 32.3700 -16.1000 0.0000 0.0000 0.0000 0.0000; + 2063 2046 0.00363 0.02051 0.01103 251 0 0 0 0 1 0 0 54.5400 -4.5000 -54.4300 3.9800 0.0000 0.0000 0.0000 0.0000; + 2092 2047 0.00376 0.02203 0.011 251 0 0 0 0 1 0 0 -144.8700 17.4800 145.6600 -13.9800 0.0000 0.0000 0.0000 0.0000; + 2079 2048 0.02944 0.12973 0.06039 187 0 0 0 0 1 0 0 -39.3800 6.6400 39.8400 -11.0500 0.0000 0.0000 0.0000 0.0000; + 2049 2061 0.00912 0.05349 0.02671 251 0 0 0 0 1 0 0 -116.8100 16.5300 118.0300 -12.1700 0.0000 0.0000 0.0000 0.0000; + 2090 2050 0.02377 0.10475 0.04876 187 0 0 0 0 1 0 0 36.6100 -2.2800 -36.3000 -1.2000 0.0000 0.0000 0.0000 0.0000; + 2050 5268 0.01273 0.05412 0.02707 187 0 0 0 0 1 0 0 32.6400 0.1600 -32.5000 -2.2500 0.0000 0.0000 0.0000 0.0000; + 2080 2051 0.00691 0.03904 0.021 251 0 0 0 0 1 0 0 -140.8400 42.5100 142.3400 -36.0900 0.0000 0.0000 0.0000 0.0000; + 2051 2112 0.00873 0.04934 0.02654 310 0 0 0 0 1 0 0 -160.1900 31.0400 162.5500 -20.3000 0.0000 0.0000 0.0000 0.0000; + 5285 2053 0.00757 0.0428 0.02302 251 0 0 0 0 1 0 0 -33.0600 5.8900 33.1500 -7.6700 0.0000 0.0000 0.0000 0.0000; + 2053 5362 0.01118 0.06552 0.03272 251 0 0 0 0 1 0 0 -62.2900 -0.5900 62.7200 -0.0900 0.0000 0.0000 0.0000 0.0000; + 2055 2054 0.00016 0.00742 0 1095 0 0 1 0 1 0 0 -194.2400 2.9900 194.3000 -0.1800 0.0000 0.0000 0.0000 0.0000; + 2055 2054 0.00016 0.00742 0 1095 0 0 1 0 1 0 0 -194.2400 2.9900 194.3000 -0.1800 0.0000 0.0000 0.0000 0.0000; + 2056 2054 0.00069 0.06323 0 227 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2057 2054 0.00025 0.01321 0 1001 0 0 1 0 1 0 0 573.6100 -57.9900 -572.7600 102.7900 0.0000 0.0000 0.0000 0.0000; + 2127 2054 0.033 0.043 2.3 2020 0 0 0 0 1 0 0 305.2500 -229.1000 -273.4800 31.2900 0.0000 0.0000 0.0000 0.0000; + 2054 5236 0.0008 0.00971 0.64507 2020 0 0 0 0 1 0 0 457.6500 -133.7200 -455.8900 90.2100 0.0000 0.0000 0.0000 0.0000; + 2059 2058 0.00537 0.10085 0 99 0 0 1 0 1 0 0 60.0000 -11.5200 -59.8100 15.1400 0.0000 0.0000 0.0000 0.0000; + 2123 2058 0.00524 0.0231 0.01075 187 0 0 0 0 1 0 0 17.5800 -3.4600 -17.5600 2.3900 0.0000 0.0000 0.0000 0.0000; + 2060 2064 0.00608 0.03562 0.01779 251 0 0 0 0 1 0 0 -82.1300 -1.2200 82.5400 1.8500 0.0000 0.0000 0.0000 0.0000; + 5136 2060 0.00421 0.02468 0.01232 251 0 0 0 0 1 0 0 -78.0700 0.1500 78.3300 0.1500 0.0000 0.0000 0.0000 0.0000; + 2062 2061 0.0016 0.04103 0 223 0 0 1 0 1 0 0 101.5500 -12.3000 -101.3900 16.4300 0.0000 0.0000 0.0000 0.0000; + 2092 2063 0.00409 0.02397 0.01197 251 0 0 0 0 1 0 0 120.7700 -24.3100 -120.1600 26.6600 0.0000 0.0000 0.0000 0.0000; + 2126 2065 0.00712 0.04025 0.02165 251 0 0 0 0 1 0 0 -66.5400 -23.6500 66.8800 23.3400 0.0000 0.0000 0.0000 0.0000; + 2073 2066 0.01087 0.06371 0.03181 251 0 0 0 0 1 0 0 69.7500 -11.7900 -69.2300 11.5200 0.0000 0.0000 0.0000 0.0000; + 2068 2067 0.00995 0.05832 0.02912 251 0 0 0 0 1 0 0 60.6400 -0.2000 -60.2700 -0.5400 0.0000 0.0000 0.0000 0.0000; + 2068 2088 0.00135 0.00792 0.00396 251 0 0 0 0 1 0 0 -66.4000 -1.4300 66.4600 1.3800 0.0000 0.0000 0.0000 0.0000; + 2069 2072 0.00557 0.03267 0.01631 251 0 0 0 0 1 0 0 -98.2700 37.5400 98.8600 -35.7900 0.0000 0.0000 0.0000 0.0000; + 2069 5074 0.0102 0.04493 0.02092 187 0 0 0 0 1 0 0 29.4300 53.2600 -29.0500 -53.7700 0.0000 0.0000 0.0000 0.0000; + 2071 2070 0.00129 0.05708 0 249 0 0 1 0 1 0 0 112.5000 -2.4600 -112.3400 9.6800 0.0000 0.0000 0.0000 0.0000; + 2088 2070 0.00235 0.01376 0.00687 251 0 0 0 0 1 0 0 -15.8200 -4.8500 15.8300 4.2000 0.0000 0.0000 0.0000 0.0000; + 2070 5237 0.00727 0.03095 0.01548 257.25 0 0 0 0 1 0 0 96.5100 -13.8900 -95.8200 15.2600 0.0000 0.0000 0.0000 0.0000; + 2072 2102 0.0084 0.04925 0.0246 251 0 0 0 0 1 0 0 -108.5600 33.0400 109.6100 -29.4400 0.0000 0.0000 0.0000 0.0000; + 2074 2073 0.00225 0.04467 0 144 0 0 1 0 1 0 0 73.3100 -25.8100 -73.1800 28.4500 0.0000 0.0000 0.0000 0.0000; + 2076 2073 0.00347 0.07389 0 64 0 0 1 0 1 0 0 22.5000 6.3900 -22.4800 -6.0100 0.0000 0.0000 0.0000 0.0000; + 2087 2073 0.01908 0.08409 0.03914 187 0 0 0 0 1 0 0 -47.3100 13.1000 47.7600 -15.2000 0.0000 0.0000 0.0000 0.0000; + 2073 3079 0.01377 0.08073 0.04031 251 0 0 0 0 1 0 0 -21.8500 4.5500 21.9100 -8.3400 0.0000 0.0000 0.0000 0.0000; + 2075 2074 0.01303 0.29308 0 19 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 3115 2074 0.0052 0.02972 0.00447 221 0 0 0 0 1 0 0 73.6200 -24.5000 -73.3100 25.8100 0.0000 0.0000 0.0000 0.0000; + 2078 2077 0.002 0.07139 0 189 0 0 1 0 1 0 0 84.3800 -4.8200 -84.2400 9.7200 0.0000 0.0000 0.0000 0.0000; + 2077 2110 0.00218 0.01278 0.00638 310 0 0 0 0 1 0 0 145.5900 -50.0100 -145.0900 52.2300 0.0000 0.0000 0.0000 0.0000; + 2077 2133 0.00307 0.01798 0.00898 251 0 0 0 0 1 0 0 -61.3400 40.2900 61.5000 -40.2900 0.0000 0.0000 0.0000 0.0000; + 2086 2080 0.01338 0.05896 0.02745 187 0 0 0 0 1 0 0 -55.5600 8.4100 55.9900 -9.2500 0.0000 0.0000 0.0000 0.0000; + 2133 2080 0.01236 0.07244 0.03618 251 0 0 0 0 1 0 0 -67.1800 38.6800 67.9200 -38.0600 0.0000 0.0000 0.0000 0.0000; + 2081 2129 0.01257 0.05349 0.02675 187 0 0 0 0 1 0 0 34.6900 7.3500 -34.5300 -9.3300 0.0000 0.0000 0.0000 0.0000; + 2083 2082 0.00401 0.14309 0 91 0 0 1 0 1 0 0 19.9500 10.0700 -19.9300 -9.3900 0.0000 0.0000 0.0000 0.0000; + 2084 2082 0.00414 0.18022 0 82 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2085 2082 0.00156 0.07238 0 98 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2089 2088 0.00259 0.12398 0 84 0 0 1 0 1 0 0 50.7000 -0.2900 -50.6300 3.4700 0.0000 0.0000 0.0000 0.0000; + 2090 2121 0.01763 0.075 0.03751 187 0 0 0 0 1 0 0 -25.2900 -0.4000 25.4000 -2.9200 0.0000 0.0000 0.0000 0.0000; + 2094 2093 0.0017 0.10337 0 88 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2095 2093 0.00149 0.05101 0 164 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2097 2096 0.00012 0.00729 0 836 0 0 1 0 1 0 0 138.3500 -20.4200 -138.3300 21.7700 0.0000 0.0000 0.0000 0.0000; + 2099 2096 0.0003 0.03477 0 237 0 0 1 0 1 0 0 7.5000 -1.4400 -7.5000 1.4600 0.0000 0.0000 0.0000 0.0000; + 2100 2096 0.00075 0.04235 0 386 0 0 1 0 1 0 0 112.5000 -21.6000 -112.4100 26.9300 0.0000 0.0000 0.0000 0.0000; + 2098 2097 0.00183 0.13303 0 146 0 0 1 0 1 0 0 -43.5100 5.7600 43.5400 -3.3600 0.0000 0.0000 0.0000 0.0000; + 2097 3096 0.00546 0.05679 0.19351 750 0 0 0 0 1 0 0 -181.9000 23.7800 183.6700 -25.8000 0.0000 0.0000 0.0000 0.0000; + 2102 2101 0.00013 0.00916 0 1072 0 0 1 0 1 0 0 -281.9300 16.3300 282.0300 -9.2100 0.0000 0.0000 0.0000 0.0000; + 2103 2101 0.00019 0.01252 0 542 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2104 2101 0.00022 0.0164 0 542 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 2105 2101 0.00055 0.02588 0 544 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 2101 5083 0.00059 0.00721 0.47876 2020 0 0 0 0 1 0 0 248.9600 -17.9700 -248.6000 -26.6500 0.0000 0.0000 0.0000 0.0000; + 2102 2107 0.00156 0.01139 0.00646 310 0 0 0 0 1 0 0 139.9600 29.2100 -139.6400 -27.6000 0.0000 0.0000 0.0000 0.0000; + 2124 2106 0.00485 0.02842 0.01419 251 0 0 0 0 1 0 0 -63.3200 6.9000 63.5200 -7.1200 0.0000 0.0000 0.0000 0.0000; + 2106 2129 0.00424 0.01803 0.00902 187 0 0 0 0 1 0 0 -11.2300 -14.3500 11.2400 13.5200 0.0000 0.0000 0.0000 0.0000; + 2107 2125 0.0109 0.06393 0.03192 251 0 0 0 0 1 0 0 65.4900 6.5900 -65.0300 -7.0600 0.0000 0.0000 0.0000 0.0000; + 2130 2108 0.00945 0.04022 0.02012 187 0 0 0 0 1 0 0 58.3200 -9.0000 -58.0000 8.3500 0.0000 0.0000 0.0000 0.0000; + 5472 2108 0.01619 0.07138 0.03323 187 0 0 0 0 1 0 0 -55.3500 7.8700 55.8600 -8.9600 0.0000 0.0000 0.0000 0.0000; + 2111 5187 0.01319 0.05811 0.02705 187 0 0 0 0 1 0 0 36.2500 -11.1600 -36.0600 9.2900 0.0000 0.0000 0.0000 0.0000; + 2111 5472 0.02196 0.09676 0.04504 187 0 0 0 0 1 0 0 -50.2000 7.2100 50.7800 -9.1600 0.0000 0.0000 0.0000 0.0000; + 2114 2113 0.00013 0.00965 0 924 0 0 1 0 1 0 0 -238.8500 -18.5100 238.9200 23.9100 0.0000 0.0000 0.0000 0.0000; + 2115 2113 0.00077 0.03843 0 410 0 0 1 0 1 0 0 184.2100 -20.5000 -183.9500 33.5500 0.0000 0.0000 0.0000 0.0000; + 2116 2113 0.00027 0.02003 0 402 0 0 1 0 1 0 0 184.2100 -20.5000 -184.1200 27.2400 0.0000 0.0000 0.0000 0.0000; + 2117 2113 0.00043 0.0445 0 404 0 0 1 0 1 0 0 184.2100 -20.5000 -184.0700 35.6900 0.0000 0.0000 0.0000 0.0000; + 2118 2113 0.00064 0.04928 0 391 0 0 1 0 1 0 0 184.2100 -20.5000 -183.9900 37.3700 0.0000 0.0000 0.0000 0.0000; + 2119 2113 0.00034 0.02438 0 389 0 0 1 0 1 0 0 184.2100 -20.5000 -184.1000 28.7200 0.0000 0.0000 0.0000 0.0000; + 2120 2113 0.0007 0.04736 0 392 0 0 1 0 1 0 0 184.2100 -4.8300 -183.9800 20.6000 0.0000 0.0000 0.0000 0.0000; + 5049 2113 0.00053 0.01087 0.75821 2768 0 0 0 0 1 0 0 -613.8600 -56.2500 615.8300 19.1400 0.0000 0.0000 0.0000 0.0000; + 2113 8126 0.00058 0.01198 0.83533 2768 0 0 0 0 1 0 0 -425.2700 -161.7500 426.3700 96.9200 0.0000 0.0000 0.0000 0.0000; + 5450 2124 0.00519 0.02933 0.01578 251 0 0 0 0 1 0 0 -41.9400 11.9600 42.0400 -12.9300 0.0000 0.0000 0.0000 0.0000; + 2125 5078 0.00981 0.04323 0.02012 187 0 0 0 0 1 0 0 -14.7000 12.3700 14.7400 -14.1900 0.0000 0.0000 0.0000 0.0000; + 2125 5215 0.00341 0.01999 0.00998 251 0 0 0 0 1 0 0 75.6700 -6.4600 -75.4700 6.6300 0.0000 0.0000 0.0000 0.0000; + 2126 5220 0.0038 0.02226 0.01112 251 0 0 0 0 1 0 0 52.3100 19.6200 -52.1900 -20.0700 0.0000 0.0000 0.0000 0.0000; + 2128 2127 0.00066 0.06242 0 308 0 0 1 0 1 0 0 44.4700 -15.8800 -44.4600 17.1900 0.0000 0.0000 0.0000 0.0000; + 2127 5164 0.01 0.1 3 2768 0 0 0 0 1 0 0 506.6400 -51.3100 -481.7700 -13.6800 0.0000 0.0000 0.0000 0.0000; + 2129 5141 0.00446 0.02617 0.01307 251 0 0 0 0 1 0 0 55.2700 -20.8100 -55.1100 20.4300 0.0000 0.0000 0.0000 0.0000; + 2131 2130 0.00178 0.07699 0 214 0 0 1 0 1 0 0 58.3900 -6.3500 -58.3200 9.0000 0.0000 0.0000 0.0000 0.0000; + 2132 2131 0.00583 0.25242 0 24 0 0 1 0 1 0 0 -11.9400 6.9500 11.9500 -6.4900 0.0000 0.0000 0.0000 0.0000; + 3021 2131 0.02143 0.09374 0.01428 149 0 0 0 0 1 0 0 71.4400 -9.4700 -70.3400 12.8400 0.0000 0.0000 0.0000 0.0000; + 3002 3001 0.00103 0.06934 0 171 0 0 1 0 1 0 0 -62.4200 -15.0000 62.4600 17.8500 0.0000 0.0000 0.0000 0.0000; + 3002 3001 0.00103 0.06934 0 171 0 0 1 0 1 0 0 -62.4200 -15.0000 62.4600 17.8500 0.0000 0.0000 0.0000 0.0000; + 3001 6177 0.00653 0.06378 0.12272 548 0 0 0 0 1 0 0 -109.9100 -17.3100 110.6800 12.0700 0.0000 0.0000 0.0000 0.0000; + 6285 3001 0.00639 0.04566 0.08324 443 0 0 0 0 1 0 0 15.0400 9.9600 -15.0100 -18.3900 0.0000 0.0000 0.0000 0.0000; + 3002 3107 0.01283 0.07327 0.01101 98 0 0 0 0 1 0 0 11.9700 -1.9700 -11.9600 0.9700 0.0000 0.0000 0.0000 0.0000; + 3004 3003 0.00324 0.10104 0 51 0 0 1 0 1 0 0 28.1300 -5.4000 -28.1000 6.2100 0.0000 0.0000 0.0000 0.0000; + 3003 3103 0.01071 0.04441 0.00754 149 0 0 0 0 1 0 0 97.3700 -4.0500 -96.3900 7.3400 0.0000 0.0000 0.0000 0.0000; + 3141 3003 0.00248 0.01085 0.00165 149 0 0 0 0 1 0 0 69.3800 2.4900 -69.2600 -2.1600 0.0000 0.0000 0.0000 0.0000; + 3005 3052 0.07286 0.17811 0.02332 98 0 0 0 0 1 0 0 6.2900 4.1400 -6.2400 -6.4200 0.0000 0.0000 0.0000 0.0000; + 3126 3005 0.0221 0.13272 0.01801 98 0 0 0 0 1 0 0 13.6700 4.6000 -13.6300 -6.2200 0.0000 0.0000 0.0000 0.0000; + 3006 3049 0.01784 0.0795 0.01166 149 0 0 0 0 1 0 0 66.3000 -15.2800 -65.4900 17.7300 0.0000 0.0000 0.0000 0.0000; + 3145 3006 0.01721 0.07139 0.01211 149 0 0 0 0 1 0 0 74.6100 -10.4600 -73.6500 13.2000 0.0000 0.0000 0.0000 0.0000; + 3007 3013 0.0282 0.12334 0.01878 149 0 0 0 0 1 0 0 53.1200 -13.8200 -52.3100 15.4400 0.0000 0.0000 0.0000 0.0000; + 3007 3137 0.00869 0.03873 0.00568 149 0 0 0 0 1 0 0 -51.0500 0.0900 51.2700 0.3000 0.0000 0.0000 0.0000 0.0000; + 3007 3145 0.01571 0.08971 0.01348 98 0 0 0 0 1 0 0 -17.0400 9.4900 17.1000 -10.5300 0.0000 0.0000 0.0000 0.0000; + 3008 3036 0.03575 0.14831 0.02517 149 0 0 0 0 1 0 0 51.8500 -13.1600 -50.8300 14.8800 0.0000 0.0000 0.0000 0.0000; + 3140 3008 0.0278 0.12389 0.01817 250 0 0 0 0 1 0 0 94.6800 -15.6700 -92.1100 25.3100 0.0000 0.0000 0.0000 0.0000; + 3143 3008 0.04389 0.1073 0.01405 98 0 0 0 0 1 0 0 -20.1300 17.1200 20.4500 -17.7600 0.0000 0.0000 0.0000 0.0000; + 3009 3024 0.0285 0.17117 0.02323 98 0 0 0 0 1 0 0 -0.7600 -3.7200 0.7600 1.3000 0.0000 0.0000 0.0000 0.0000; + 3146 3009 0.03539 0.14683 0.02492 149 0 0 0 0 1 0 0 -50.1700 16.3600 51.1200 -15.0300 0.0000 0.0000 0.0000 0.0000; + 3010 3076 0.02704 0.16239 0.02204 98 0 0 0 0 1 0 0 -14.5000 2.2700 14.5600 -4.1300 0.0000 0.0000 0.0000 0.0000; + 3093 3010 0.02325 0.1396 0.01894 98 0 0 0 0 1 0 0 -9.8100 1.8400 9.8300 -3.6000 0.0000 0.0000 0.0000 0.0000; + 3011 3012 0.01814 0.1036 0.01557 98 0 0 0 0 1 0 0 -6.9800 -0.9500 6.9900 -0.6200 0.0000 0.0000 0.0000 0.0000; + 3011 3124 0.02409 0.1376 0.02068 98 0 0 0 0 1 0 0 -20.1600 -6.7400 20.2600 5.1600 0.0000 0.0000 0.0000 0.0000; + 3012 6226 0.01815 0.10369 0.01558 98 0 0 0 0 1 0 0 -7.5500 0.4600 7.5600 -2.0100 0.0000 0.0000 0.0000 0.0000; + 3013 3077 0.00833 0.05 0.00679 98 0 0 0 0 1 0 0 -12.2500 33.7400 12.3500 -33.8000 0.0000 0.0000 0.0000 0.0000; + 3014 3124 0.04522 0.19779 0.03012 149 0 0 0 0 1 0 0 55.4900 -16.3900 -54.0500 19.5100 0.0000 0.0000 0.0000 0.0000; + 6212 3014 0.01229 0.05481 0.00804 149 0 0 0 0 1 0 0 78.2100 -7.7700 -77.4900 10.1600 0.0000 0.0000 0.0000 0.0000; + 3015 3121 0.00527 0.03162 0.00429 147 0 0 0 0 1 0 0 -32.9500 -2.5000 33.0000 2.3900 0.0000 0.0000 0.0000 0.0000; + 3015 3127 0.01148 0.0656 0.00986 109.76 0 0 0 0 1 0 0 -15.0200 -3.2800 15.0500 2.4100 0.0000 0.0000 0.0000 0.0000; + 3015 3128 0.00752 0.04513 0.00612 98 0 0 0 0 1 0 0 42.6100 4.2600 -42.4700 -4.0800 0.0000 0.0000 0.0000 0.0000; + 3017 3016 0.00189 0.07277 0 200 0 0 1 0 1 0 0 127.1300 -0.1700 -126.8300 11.7000 0.0000 0.0000 0.0000 0.0000; + 3016 3083 0.00919 0.05252 0.00789 221 0 0 0 0 1 0 0 74.3700 -16.5400 -73.8500 18.7000 0.0000 0.0000 0.0000 0.0000; + 3016 3103 0.00883 0.03662 0.00621 149 0 0 0 0 1 0 0 -56.7600 19.1300 57.0700 -18.4800 0.0000 0.0000 0.0000 0.0000; + 3016 3131 0.03765 0.09203 0.01205 98 0 0 0 0 1 0 0 -0.1300 -9.4700 0.1600 8.2900 0.0000 0.0000 0.0000 0.0000; + 3139 3016 0.02927 0.12143 0.02061 221 0 0 0 0 1 0 0 -105.9300 16.9600 109.3500 -4.8300 0.0000 0.0000 0.0000 0.0000; + 3019 3018 0.00052 0.03897 0 142.2 0 0 1 0 1 0 0 -75.9800 1.2100 76.0100 0.9100 0.0000 0.0000 0.0000 0.0000; + 3019 3018 0.00053 0.03897 0 142.2 0 0 1 0 1 0 0 -75.9800 1.2300 76.0100 0.8900 0.0000 0.0000 0.0000 0.0000; + 3020 3018 0.00133 0.06779 0 200 0 0 1 0 1 0 0 112.5000 1.3400 -112.3400 6.7500 0.0000 0.0000 0.0000 0.0000; + 3018 3050 0.01395 0.13638 0.2624 548 0 0 0 0 1 0 0 66.0100 -13.0500 -65.4400 -9.0300 0.0000 0.0000 0.0000 0.0000; + 3018 3058 0.0091 0.0889 0.17104 548 0 0 0 0 1 0 0 -105.6900 4.5000 106.6600 -13.1800 0.0000 0.0000 0.0000 0.0000; + 3024 3019 0.01378 0.07869 0.01182 98 0 0 0 0 1 0 0 -10.9000 -4.1700 10.9100 3.0200 0.0000 0.0000 0.0000 0.0000; + 3114 3019 0.01054 0.07345 0.01201 221 0 0 0 0 1 0 0 -92.5100 -4.2000 93.3900 9.0500 0.0000 0.0000 0.0000 0.0000; + 3114 3019 0.01054 0.07345 0.01201 221 0 0 0 0 1 0 0 -92.5100 -4.2000 93.3900 9.0500 0.0000 0.0000 0.0000 0.0000; + 3049 3021 0.01086 0.07565 0.01237 221 0 0 0 0 1 0 0 130.1500 -11.2100 -128.3200 22.6900 0.0000 0.0000 0.0000 0.0000; + 5397 3021 0.02082 0.09277 0.0136 149 0 0 0 0 1 0 0 -54.2900 15.3200 54.9500 -13.7700 0.0000 0.0000 0.0000 0.0000; + 3033 3022 0.06611 0.16158 0.02116 147 0 0 0 0 1 0 0 31.1700 -6.6900 -30.5200 6.1500 0.0000 0.0000 0.0000 0.0000; + 3085 3022 0.01233 0.07039 0.01058 98 0 0 0 0 1 0 0 -5.9100 12.1900 5.9300 -13.1200 0.0000 0.0000 0.0000 0.0000; + 3049 3023 0.01656 0.0738 0.01082 149 0 0 0 0 1 0 0 -75.2400 -9.5200 76.1800 12.5800 0.0000 0.0000 0.0000 0.0000; + 3023 3067 0.09726 0.23774 0.03113 98 0 0 0 0 1 0 0 -46.4200 20.2700 48.8500 -17.6200 0.0000 0.0000 0.0000 0.0000; + 3023 3115 0.03509 0.21073 0.0286 98 0 0 0 0 1 0 0 -40.1700 16.9200 40.8200 -15.9800 0.0000 0.0000 0.0000 0.0000; + 3035 3025 0.05582 0.13643 0.01786 98 0 0 0 0 1 0 0 10.5700 -2.8000 -10.5000 1.1700 0.0000 0.0000 0.0000 0.0000; + 3025 3036 0.0401 0.16637 0.02823 149 0 0 0 0 1 0 0 -36.2000 8.6300 36.7700 -9.1000 0.0000 0.0000 0.0000 0.0000; + 3025 3101 0.02809 0.12288 0.01871 149 0 0 0 0 1 0 0 33.0300 -13.6800 -32.6800 13.3400 0.0000 0.0000 0.0000 0.0000; + 3027 3026 0.00258 0.11301 0 250 0 0 1 0 1 0 0 -9.9400 -8.4900 9.9400 8.6700 0.0000 0.0000 0.0000 0.0000; + 3028 3026 0.00048 0.03228 0 270 0 0 1 0 1 0 0 150.0000 36.9600 -149.9000 -29.8400 0.0000 0.0000 0.0000 0.0000; + 3026 5395 0.00227 0.01625 0.02963 443 0 0 0 0 1 0 0 139.9500 21.1700 -139.5200 -21.2000 0.0000 0.0000 0.0000 0.0000; + 3027 3102 0.02467 0.05926 0.00804 221 0 0 0 0 1 0 0 9.9400 8.4900 -9.9000 -9.2100 0.0000 0.0000 0.0000 0.0000; + 3147 3029 0.01187 0.06781 0.01019 250 0 0 0 0 1 0 0 -60.4200 11.2100 60.8400 -9.8700 0.0000 0.0000 0.0000 0.0000; + 3029 5241 0.01232 0.05113 0.00868 149 0 0 0 0 1 0 0 -65.7100 8.4900 66.2200 -7.2900 0.0000 0.0000 0.0000 0.0000; + 3030 3072 0.00885 0.05057 0.0076 190 0 0 0 0 1 0 0 -45.0200 20.2300 45.2300 -19.8200 0.0000 0.0000 0.0000 0.0000; + 3114 3030 0.02646 0.10977 0.01863 156.45 0 0 0 0 1 0 0 86.7200 -19.4500 -84.7000 25.8900 0.0000 0.0000 0.0000 0.0000; + 3054 3031 0.03288 0.08037 0.01052 98 0 0 0 0 1 0 0 -5.0500 12.6200 5.1100 -13.5300 0.0000 0.0000 0.0000 0.0000; + 3031 3070 0.03731 0.09121 0.01194 150 0 0 0 0 1 0 0 -90.9000 19.8400 94.1300 -13.1500 0.0000 0.0000 0.0000 0.0000; + 3031 3140 0.02073 0.09067 0.01381 149 0 0 0 0 1 0 0 71.0500 -10.4900 -69.9900 13.7700 0.0000 0.0000 0.0000 0.0000; + 3032 3094 0.00583 0.04065 0.00664 250 0 0 0 0 1 0 0 -167.6800 -4.7800 169.3100 15.4900 0.0000 0.0000 0.0000 0.0000; + 3099 3032 0.00703 0.03076 0.00468 149 0 0 0 0 1 0 0 -94.1700 18.2200 94.8100 -15.8600 0.0000 0.0000 0.0000 0.0000; + 3034 3033 0.00593 0.17201 0 125 0 0 1 0 1 0 0 97.8700 17.1400 -97.3200 -1.1400 0.0000 0.0000 0.0000 0.0000; + 3136 3033 0.00696 0.01672 0.00227 250 0 0 0 0 1 0 0 -65.8400 -7.3200 66.1400 7.8200 0.0000 0.0000 0.0000 0.0000; + 3035 3066 0.08317 0.2033 0.02662 98 0 0 0 0 1 0 0 -14.0300 1.8200 14.2000 -4.0900 0.0000 0.0000 0.0000 0.0000; + 3036 3066 0.03434 0.19612 0.02947 98 0 0 0 0 1 0 0 8.2600 -7.4300 -8.2300 4.6600 0.0000 0.0000 0.0000 0.0000; + 3038 3037 0.00411 0.1621 0 82 0 0 1 0 1 0 0 59.4900 -11.0500 -59.3400 16.8900 0.0000 0.0000 0.0000 0.0000; + 3039 3037 0.00051 0.03079 0 280 0 0 1 0 1 0 0 156.7500 43.3600 -156.6300 -35.8300 0.0000 0.0000 0.0000 0.0000; + 3078 3037 0.00125 0.01223 0.02354 548 0 0 0 0 1 0 0 -54.4400 -38.3800 54.4900 36.4200 0.0000 0.0000 0.0000 0.0000; + 3037 3088 0.00895 0.08746 0.16828 548 0 0 0 0 1 0 0 161.4800 -17.4800 -159.2600 21.3400 0.0000 0.0000 0.0000 0.0000; + 3038 3080 0.00768 0.04384 0.00659 98 0 0 0 0 1 0 0 41.5000 -8.9900 -41.3600 9.0900 0.0000 0.0000 0.0000 0.0000; + 3085 3038 0.00471 0.02825 0.00383 250 0 0 0 0 1 0 0 101.4800 -17.4700 -100.9900 20.0300 0.0000 0.0000 0.0000 0.0000; + 3072 3040 0.02206 0.09153 0.01553 149 0 0 0 0 1 0 0 -73.2600 36.0700 74.7100 -31.6300 0.0000 0.0000 0.0000 0.0000; + 3139 3040 0.01922 0.08563 0.01256 250 0 0 0 0 1 0 0 91.0100 -21.1800 -89.3200 27.4900 0.0000 0.0000 0.0000 0.0000; + 3042 3041 0.00322 0.18545 0 240 0 0 1 0 1 0 0 99.4500 0.2300 -99.1300 17.8600 0.0000 0.0000 0.0000 0.0000; + 3043 3041 0.00205 0.14897 0 57 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 3044 3041 0.00154 0.10487 0 112 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 3045 3041 0.00096 0.05895 0 550 0 0 1 0 1 0 0 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 3041 3046 0.0031 0.02 0.05832 820 0 0 0 0 1 0 0 483.1200 -36.7100 -476.1300 75.7700 0.0000 0.0000 0.0000 0.0000; + 3041 3058 0.00347 0.02481 0.04523 750 0 0 0 0 1 0 0 -383.9900 18.8600 388.9200 11.6600 0.0000 0.0000 0.0000 0.0000; + 3042 3064 0.02146 0.09562 0.01402 221 0 0 0 0 1 0 0 -9.5500 -14.0000 9.6000 12.8100 0.0000 0.0000 0.0000 0.0000; + 3111 3042 0.01081 0.04816 0.00706 221 0 0 0 0 1 0 0 84.6500 -8.1600 -83.8900 10.8500 0.0000 0.0000 0.0000 0.0000; + 3047 3046 0.00338 0.14142 0 290 0 0 1 0 1 0 0 179.9900 27.7100 -178.9300 16.5000 0.0000 0.0000 0.0000 0.0000; + 3048 3046 0.00027 0.016 0 1500 0 0 1 0 1 0 0 -772.1800 91.6500 773.7500 1.0900 0.0000 0.0000 0.0000 0.0000; + 3048 3046 0.00027 0.016 0 1500 0 0 1 0 1 0 0 -772.1800 91.6500 773.7500 1.0900 0.0000 0.0000 0.0000 0.0000; + 3046 3078 0.00316 0.0309 0.05946 820 0 0 0 0 1 0 0 -506.9400 68.6600 514.9600 3.5800 0.0000 0.0000 0.0000 0.0000; + 3082 3046 0.00313 0.03062 0.05891 750 0 0 0 0 1 0 0 390.0700 -4.9000 -385.5000 43.4900 0.0000 0.0000 0.0000 0.0000; + 3047 3064 0.01369 0.045 0.00446 221 0 0 0 0 1 0 0 -71.9500 42.4600 72.8500 -39.9600 0.0000 0.0000 0.0000 0.0000; + 3129 3047 0.02116 0.05173 0.00677 221 0 0 0 0 1 0 0 110.9400 -46.7700 -108.0400 53.1500 0.0000 0.0000 0.0000 0.0000; + 3048 5045 0.0011 0.013 0.63 2295 0 0 0 0 1 0 0 1010.3800 16.8400 -999.5900 45.5400 0.0000 0.0000 0.0000 0.0000; + 3048 5045 0.0011 0.013 0.63 2295 0 0 0 0 1 0 0 1010.3800 16.8400 -999.5900 45.5400 0.0000 0.0000 0.0000 0.0000; + 3048 5120 0.0013 0.015 1.02 2295 0 0 0 0 1 0 0 614.3500 -114.2900 -609.6000 62.1500 0.0000 0.0000 0.0000 0.0000; + 3048 5394 0.0013 0.015 1.02 2020 0 0 0 0 1 0 0 -178.2600 -49.2300 178.6600 -52.8200 0.0000 0.0000 0.0000 0.0000; + 3051 3050 0.00147 0.09038 0 122 0 0 1 0 1 0 0 -37.4800 -18.7800 37.5100 20.3500 0.0000 0.0000 0.0000 0.0000; + 3051 3050 0.00147 0.09038 0 122 0 0 1 0 1 0 0 -37.4800 -18.7800 37.5100 20.3500 0.0000 0.0000 0.0000 0.0000; + 4014 3050 0.01665 0.16272 0.31309 548 0 0 0 0 1 0 0 -203.3300 40.4800 210.3800 -4.4600 0.0000 0.0000 0.0000 0.0000; + 3052 3093 0.03727 0.22382 0.03037 98 0 0 0 0 1 0 0 -4.7500 0.2500 4.7600 -3.2700 0.0000 0.0000 0.0000 0.0000; + 3052 3107 0.01629 0.09779 0.01327 98 0 0 0 0 1 0 0 2.9200 3.8800 -2.9100 -5.1900 0.0000 0.0000 0.0000 0.0000; + 3054 3053 0.00422 0.16643 0 103 0 0 1 0 1 0 0 5.0500 -12.6200 -5.0400 12.9200 0.0000 0.0000 0.0000 0.0000; + 3055 3053 0.00065 0.02944 0 330 0 0 1 0 1 0 0 183.8800 35.8100 -183.6700 -26.2600 0.0000 0.0000 0.0000 0.0000; + 3056 3053 0.00099 0.0556 0 200 0 0 1 0 1 0 0 183.8800 24.1500 -183.5700 -6.4700 0.0000 0.0000 0.0000 0.0000; + 3057 3053 0.00152 0.05399 0 220 0 0 1 0 1 0 0 183.8800 22.5300 -183.4000 -5.4000 0.0000 0.0000 0.0000 0.0000; + 3058 3053 0.003 0.03 0.06 1000 0 0 0 0 1 0 0 195.9100 -10.2100 -194.8200 14.6500 0.0000 0.0000 0.0000 0.0000; + 3082 3053 0.00152 0.0149 0.02867 548 0 0 0 0 1 0 0 -109.3400 -51.5700 109.5500 50.6200 0.0000 0.0000 0.0000 0.0000; + 3053 3088 0.00333 0.03466 0.11812 750 0 0 0 0 1 0 0 320.4800 -20.0400 -317.2500 41.1200 0.0000 0.0000 0.0000 0.0000; + 3053 3088 0.00333 0.03466 0.11812 750 0 0 0 0 1 0 0 320.4800 -20.0400 -317.2500 41.1200 0.0000 0.0000 0.0000 0.0000; + 3059 3058 0.00178 0.135 0 250 0 0 1 0 1 0 0 88.9700 -10.7700 -88.8300 21.3400 0.0000 0.0000 0.0000 0.0000; + 3060 3058 0.00205 0.114 0 200 0 0 1 0 1 0 0 124.2200 13.1800 -123.9300 3.2600 0.0000 0.0000 0.0000 0.0000; + 3061 3058 0.00132 0.0814 0 155 0 0 1 0 1 0 0 124.2200 13.9400 -124.0300 -2.1800 0.0000 0.0000 0.0000 0.0000; + 3062 3058 0.00115 0.04113 0 190 0 0 1 0 1 0 0 124.2200 19.4600 -124.0500 -13.4500 0.0000 0.0000 0.0000 0.0000; + 3063 3058 0.00159 0.0585 0 190 0 0 1 0 1 0 0 124.2200 14.8700 -123.9900 -6.4100 0.0000 0.0000 0.0000 0.0000; + 3059 3111 0.01912 0.04672 0.00612 221 0 0 0 0 1 0 0 -26.7500 13.1000 26.9100 -13.3200 0.0000 0.0000 0.0000 0.0000; + 3065 3064 0.00856 0.17814 0 110 0 0 1 0 1 0 0 60.3700 -11.5900 -60.0500 18.3200 0.0000 0.0000 0.0000 0.0000; + 3064 3141 0.01218 0.05051 0.00857 149 0 0 0 0 1 0 0 -22.4100 8.8400 22.4800 -9.4500 0.0000 0.0000 0.0000 0.0000; + 3066 3142 0.03037 0.17347 0.02607 98 0 0 0 0 1 0 0 -28.0100 -6.8200 28.2500 5.5100 0.0000 0.0000 0.0000 0.0000; + 3068 3067 0.00117 0.04824 0 200 0 0 1 0 1 0 0 112.5000 25.5900 -112.3600 -19.6600 0.0000 0.0000 0.0000 0.0000; + 3067 3070 0.01175 0.06712 0.01009 98 0 0 0 0 1 0 0 36.4300 6.1900 -36.2800 -6.3800 0.0000 0.0000 0.0000 0.0000; + 3067 3094 0.01576 0.07025 0.0103 149 0 0 0 0 1 0 0 89.0500 -0.2000 -87.8700 4.3900 0.0000 0.0000 0.0000 0.0000; + 3067 3141 0.01175 0.05234 0.00768 149 0 0 0 0 1 0 0 -61.9700 31.2800 62.5100 -29.6800 0.0000 0.0000 0.0000 0.0000; + 3069 3077 0.01599 0.09132 0.01372 98 0 0 0 0 1 0 0 -28.8100 0.9800 28.9500 -1.5900 0.0000 0.0000 0.0000 0.0000; + 3069 3140 0.01354 0.03311 0.00434 98 0 0 0 0 1 0 0 25.0000 -2.0600 -24.9200 1.8400 0.0000 0.0000 0.0000 0.0000; + 3071 3070 0.00337 0.06343 0 200 0 0 1 0 1 0 0 127.6500 -24.5100 -127.0900 35.1100 0.0000 0.0000 0.0000 0.0000; + 3070 3131 0.00569 0.02535 0.00372 149 0 0 0 0 1 0 0 69.2400 -15.5800 -68.9600 16.4200 0.0000 0.0000 0.0000 0.0000; + 3142 3072 0.01958 0.11184 0.01681 98 0 0 0 0 1 0 0 -21.8900 17.0500 22.0400 -17.9500 0.0000 0.0000 0.0000 0.0000; + 3074 3073 0.00148 0.05882 0 115 0 0 1 0 1 0 0 74.8500 -7.1400 -74.7700 10.4700 0.0000 0.0000 0.0000 0.0000; + 3073 3076 0.01657 0.09953 0.01351 98 0 0 0 0 1 0 0 25.4600 -1.7900 -25.3600 1.0700 0.0000 0.0000 0.0000 0.0000; + 3123 3073 0.01212 0.06921 0.0104 98 0 0 0 0 1 0 0 -63.1500 3.0800 63.6400 -1.3400 0.0000 0.0000 0.0000 0.0000; + 3073 4002 0.03286 0.18769 0.0282 98 0 0 0 0 1 0 0 -14.3400 -7.3400 14.4100 4.9000 0.0000 0.0000 0.0000 0.0000; + 3132 3075 0.07582 0.18532 0.02427 98 0 0 0 0 1 0 0 -0.8600 -3.3400 0.8700 0.9200 0.0000 0.0000 0.0000 0.0000; + 3075 3138 0.0747 0.18259 0.02391 98 0 0 0 0 1 0 0 -13.0500 -4.3700 13.1900 2.2500 0.0000 0.0000 0.0000 0.0000; + 3077 3099 0.00591 0.03377 0.00508 221 0 0 0 0 1 0 0 40.8600 -0.4300 -40.7700 0.4800 0.0000 0.0000 0.0000 0.0000; + 3077 3131 0.01523 0.06786 0.00995 250 0 0 0 0 1 0 0 -150.8200 16.3700 154.3100 -1.8600 0.0000 0.0000 0.0000 0.0000; + 3079 3078 0.00156 0.05913 0 166 0 0 1 0 1 0 0 54.2800 -7.1000 -54.2300 8.8100 0.0000 0.0000 0.0000 0.0000; + 3081 3078 0.00202 0.06066 0 300 0 0 1 0 1 0 0 186.7500 33.9700 -186.0800 -13.7700 0.0000 0.0000 0.0000 0.0000; + 3078 3133 0.0042 0.03003 0.05475 523 0 0 0 0 1 0 0 -220.2000 39.7600 222.2200 -31.0200 0.0000 0.0000 0.0000 0.0000; + 3080 3079 0.00542 0.12325 0 90 0 0 1 0 1 0 0 41.3600 -9.0900 -41.2600 11.2700 0.0000 0.0000 0.0000 0.0000; + 3134 3079 0.01347 0.05936 0.02763 187 0 0 0 0 1 0 0 35.0900 -6.3300 -34.9300 4.1700 0.0000 0.0000 0.0000 0.0000; + 3083 3082 0.00172 0.064 0 161.06 0 0 1 0 1 0 0 107.0700 -9.8700 -106.8800 17.0600 0.0000 0.0000 0.0000 0.0000; + 3084 3082 0.00171 0.09998 0 300 0 0 1 0 1 0 0 174.3700 -8.9300 -173.8500 39.4100 0.0000 0.0000 0.0000 0.0000; + 3137 3083 0.00824 0.03605 0.00549 149 0 0 0 0 1 0 0 33.3200 8.6800 -33.2200 -8.8300 0.0000 0.0000 0.0000 0.0000; + 3086 3085 0.00703 0.2158 0 77 0 0 1 0 1 0 0 56.2500 -1.6900 -56.0300 8.5300 0.0000 0.0000 0.0000 0.0000; + 3087 3085 0.00831 0.19507 0 83 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 3085 3128 0.0069 0.01687 0.00221 98 0 0 0 0 1 0 0 -39.5500 -3.2500 39.6500 3.2800 0.0000 0.0000 0.0000 0.0000; + 3089 3088 0.0005 0.02042 0 411 0 0 1 0 1 0 0 -237.6300 -4.5800 237.9000 15.5200 0.0000 0.0000 0.0000 0.0000; + 3092 3088 0.00152 0.0846 0 250 0 0 1 0 1 0 0 150.0000 18.4700 -149.6800 -0.6100 0.0000 0.0000 0.0000 0.0000; + 5395 3088 0.00237 0.0246 0.08383 750 0 0 0 0 1 0 0 -349.9800 12.3400 352.7700 7.7200 0.0000 0.0000 0.0000 0.0000; + 5395 3088 0.00237 0.0246 0.08383 750 0 0 0 0 1 0 0 -349.9800 12.3400 352.7700 7.7200 0.0000 0.0000 0.0000 0.0000; + 3090 3089 0.00098 0.02574 0 277 0 0 1 0 1 0 0 -46.6800 -9.9500 46.7100 10.5100 0.0000 0.0000 0.0000 0.0000; + 3089 5334 0.0094 0.05512 0.02752 409 0 0 0 0 1 0 0 190.9300 -5.9400 -187.6700 22.1300 0.0000 0.0000 0.0000 0.0000; + 3091 3090 0.00127 0.03474 0 268 0 0 1 0 1 0 0 -46.6600 -9.2000 46.6800 9.9500 0.0000 0.0000 0.0000 0.0000; + 3102 3091 0.00402 0.02416 0.00328 109.76 0 0 0 0 1 0 0 -16.3200 -32.6600 16.3700 32.6300 0.0000 0.0000 0.0000 0.0000; + 3091 3125 0.01164 0.02796 0.00379 98 0 0 0 0 1 0 0 30.2900 45.0200 -29.9500 -44.6100 0.0000 0.0000 0.0000 0.0000; + 3095 3094 0.00352 0.16184 0 250 0 0 1 0 1 0 0 90.4500 19.6200 -90.1700 -6.8100 0.0000 0.0000 0.0000 0.0000; + 3137 3094 0.018 0.04399 0.00576 221 0 0 0 0 1 0 0 -8.6900 12.5800 8.7300 -13.0800 0.0000 0.0000 0.0000 0.0000; + 3097 3096 0.00239 0.06155 0 162 0 0 1 0 1 0 0 54.2200 -8.3300 -54.1500 10.1100 0.0000 0.0000 0.0000 0.0000; + 3097 3096 0.00239 0.06155 0 162 0 0 1 0 1 0 0 54.2200 -8.3300 -54.1500 10.1100 0.0000 0.0000 0.0000 0.0000; + 3098 3096 0.0034 0.134 0 200 0 0 1 0 1 0 0 120.0000 17.9100 -119.5400 0.3300 0.0000 0.0000 0.0000 0.0000; + 3133 3096 0.0038 0.02718 0.04955 443 0 0 0 0 1 0 0 -44.1000 -9.9000 44.1700 5.2400 0.0000 0.0000 0.0000 0.0000; + 3109 3097 0.00325 0.02263 0.0037 340 0 0 0 0 1 0 0 108.8100 -14.4300 -108.4400 16.6700 0.0000 0.0000 0.0000 0.0000; + 3099 3100 0.01869 0.08329 0.01221 250 0 0 0 0 1 0 0 122.8500 -22.1200 -119.9500 33.8300 0.0000 0.0000 0.0000 0.0000; + 3100 3102 0.015 0.088 0.012 98 0 0 0 0 1 0 0 49.4600 -19.3100 -49.0400 20.5500 0.0000 0.0000 0.0000 0.0000; + 3125 3100 0.0162 0.07086 0.01079 149 0 0 0 0 1 0 0 -61.3000 18.7600 61.9700 -16.9400 0.0000 0.0000 0.0000 0.0000; + 3104 3101 0.01395 0.07966 0.01197 98 0 0 0 0 1 0 0 10.4100 6.6100 -10.3900 -7.7100 0.0000 0.0000 0.0000 0.0000; + 6360 3101 0.03353 0.08195 0.01073 98 0 0 0 0 1 0 0 -33.2400 8.1900 33.6300 -8.3100 0.0000 0.0000 0.0000 0.0000; + 3105 3104 0.00965 0.2233 0 60 0 0 1 0 1 0 0 44.5000 -0.7400 -44.3100 5.0700 0.0000 0.0000 0.0000 0.0000; + 3106 3104 0.00703 0.22022 0 200 0 0 1 0 1 0 0 53.0200 -2.6900 -52.8200 8.8400 0.0000 0.0000 0.0000 0.0000; + 6156 3104 0.01785 0.07953 0.01166 149 0 0 0 0 1 0 0 -85.3500 25.4500 86.7300 -20.5200 0.0000 0.0000 0.0000 0.0000; + 3108 3147 0.03432 0.08389 0.01098 98 0 0 0 0 1 0 0 -25.3700 -15.2900 25.6600 14.8600 0.0000 0.0000 0.0000 0.0000; + 3108 6065 0.02034 0.11619 0.01746 98 0 0 0 0 1 0 0 1.8500 8.6300 -1.8300 -10.2800 0.0000 0.0000 0.0000 0.0000; + 3110 3109 0.00505 0.2206 0 114 0 0 1 0 1 0 0 63.0000 11.9200 -62.8100 -3.5300 0.0000 0.0000 0.0000 0.0000; + 3112 3111 0.01169 0.25489 0 90 0 0 1 0 1 0 0 56.1000 -3.0400 -55.7300 11.0900 0.0000 0.0000 0.0000 0.0000; + 3113 3111 0.00858 0.25519 0 90 0 0 1 0 1 0 0 56.1000 -2.3500 -55.8300 10.4000 0.0000 0.0000 0.0000 0.0000; + 3116 3115 0.02115 0.08773 0.01489 221 0 0 0 0 1 0 0 127.5400 -24.6700 -124.0200 37.7600 0.0000 0.0000 0.0000 0.0000; + 3117 3116 0.00258 0.11311 0 80 0 0 1 0 1 0 0 47.2500 -5.0900 -47.1900 7.6400 0.0000 0.0000 0.0000 0.0000; + 3118 3116 0.00353 0.07808 0 139 0 0 1 0 1 0 0 90.0000 -8.5300 -89.7100 14.9100 0.0000 0.0000 0.0000 0.0000; + 3116 3136 0.01168 0.07015 0.00952 221 0 0 0 0 1 0 0 9.3700 2.1200 -9.3600 -3.0200 0.0000 0.0000 0.0000 0.0000; + 3120 3119 0.00248 0.09082 0 46 0 0 1 0 1 0 0 29.7000 0.0000 -29.6800 0.7600 0.0000 0.0000 0.0000 0.0000; + 4002 3119 0.02215 0.13302 0.01805 98 0 0 0 0 1 0 0 -15.4200 -5.1800 15.4800 3.6200 0.0000 0.0000 0.0000 0.0000; + 4188 3119 0.027 0.1542 0.02317 98 0 0 0 0 1 0 0 -14.1500 2.2200 14.2000 -4.3700 0.0000 0.0000 0.0000 0.0000; + 3122 3121 0.00565 0.10546 0 250 0 0 1 0 1 0 0 147.7500 -13.3000 -146.5100 36.5100 0.0000 0.0000 0.0000 0.0000; + 3121 3129 0.00954 0.03956 0.00671 149 0 0 0 0 1 0 0 16.1500 -28.8500 -16.0600 28.5500 0.0000 0.0000 0.0000 0.0000; + 3121 3145 0.02936 0.13085 0.01919 149 0 0 0 0 1 0 0 97.3500 -10.0500 -94.6400 20.1600 0.0000 0.0000 0.0000 0.0000; + 3126 3123 0.05936 0.14511 0.019 98 0 0 0 0 1 0 0 3.1800 20.4900 -2.9200 -21.8000 0.0000 0.0000 0.0000 0.0000; + 6286 3124 0.018 0.1 0.016 100 0 0 0 0 1 0 0 30.9200 -5.5200 -30.7500 4.7400 0.0000 0.0000 0.0000 0.0000; + 3126 6059 0.04241 0.10187 0.01382 98 0 0 0 0 1 0 0 -26.8100 14.8600 27.1900 -15.4000 0.0000 0.0000 0.0000 0.0000; + 3141 3127 0.00595 0.02651 0.00389 221 0 0 0 0 1 0 0 -85.7500 23.4600 86.2000 -21.8500 0.0000 0.0000 0.0000 0.0000; + 3132 3144 0.04225 0.10327 0.01352 98 0 0 0 0 1 0 0 -8.7000 0.6300 8.7300 -1.9000 0.0000 0.0000 0.0000 0.0000; + 3134 3133 0.00391 0.20153 0 83 0 0 1 0 1 0 0 -6.9800 -0.2700 6.9800 0.3700 0.0000 0.0000 0.0000 0.0000; + 3135 3134 0.01014 0.22418 0 200 0 0 1 0 1 0 0 28.2000 -4.8000 -28.1100 6.6000 0.0000 0.0000 0.0000 0.0000; + 3136 3135 0.00579 0.2297 0 200 0 0 1 0 1 0 0 28.2400 -2.9600 -28.2000 4.8000 0.0000 0.0000 0.0000 0.0000; + 3138 3142 0.02534 0.14471 0.02175 98 0 0 0 0 1 0 0 13.4900 -9.0000 -13.4300 7.0600 0.0000 0.0000 0.0000 0.0000; + 3138 3146 0.03674 0.1607 0.02447 149 0 0 0 0 1 0 0 -37.6200 3.6400 38.1300 -3.9700 0.0000 0.0000 0.0000 0.0000; + 3144 3143 0.04463 0.10909 0.01428 98 0 0 0 0 1 0 0 -14.2900 0.3300 14.3800 -1.5400 0.0000 0.0000 0.0000 0.0000; + 4003 4040 0.01209 0.07809 0.0149 250 0 0 0 0 1 0 0 -171.7500 5.6800 175.2800 15.5900 0.0000 0.0000 0.0000 0.0000; + 4103 4003 0.00838 0.05414 0.01033 221 0 0 0 0 1 0 0 -49.7300 24.8900 49.9800 -24.3000 0.0000 0.0000 0.0000 0.0000; + 4103 4003 0.00838 0.05414 0.01033 221 0 0 0 0 1 0 0 -49.7300 24.8900 49.9800 -24.3000 0.0000 0.0000 0.0000 0.0000; + 4128 4003 0.01296 0.09028 0.01476 221 0 0 0 0 1 0 0 55.9100 -5.5500 -55.5100 6.8600 0.0000 0.0000 0.0000 0.0000; + 4005 4004 0.00169 0.06285 0 190 0 0 1 0 1 0 0 -120.7600 4.7700 121.0000 4.0200 0.0000 0.0000 0.0000 0.0000; + 4014 4004 0.006 0.06 0.115 548 0 0 0 0 1 0 0 92.4900 -9.2200 -92.0000 2.0100 0.0000 0.0000 0.0000 0.0000; + 4113 4004 0.00456 0.03255 0.05934 443 0 0 0 0 1 0 0 29.0400 0.0600 -29.0000 -6.0300 0.0000 0.0000 0.0000 0.0000; + 4022 4005 0.02734 0.11343 0.01925 149 0 0 0 0 1 0 0 5.5300 -12.6300 -5.4800 10.8300 0.0000 0.0000 0.0000 0.0000; + 4114 4005 0.01989 0.11362 0.01707 221 0 0 0 0 1 0 0 38.1900 -11.1000 -37.8900 11.0400 0.0000 0.0000 0.0000 0.0000; + 4006 4011 0.0269 0.11766 0.01792 149 0 0 0 0 1 0 0 30.4000 -0.6700 -30.1700 -0.1800 0.0000 0.0000 0.0000 0.0000; + 4006 4197 0.00624 0.04344 0.0071 221 0 0 0 0 1 0 0 -33.1600 -0.1100 33.2200 -0.1900 0.0000 0.0000 0.0000 0.0000; + 4007 4027 0.00348 0.02089 0.00284 221 0 0 0 0 1 0 0 -8.1100 -60.2700 8.2400 60.7300 0.0000 0.0000 0.0000 0.0000; + 4007 4034 0.00873 0.03892 0.00571 149 0 0 0 0 1 0 0 -64.5500 17.9200 64.9400 -16.7800 0.0000 0.0000 0.0000 0.0000; + 4007 4122 0.00469 0.02091 0.00307 221 0 0 0 0 1 0 0 -110.9900 -9.6900 111.5600 11.9200 0.0000 0.0000 0.0000 0.0000; + 4008 6112 0.01363 0.07782 0.01169 98 0 0 0 0 1 0 0 4.1300 -10.2700 -4.1100 9.1900 0.0000 0.0000 0.0000 0.0000; + 6155 4008 0.01482 0.06605 0.00968 149 0 0 0 0 1 0 0 -29.5900 2.4700 29.7200 -2.8300 0.0000 0.0000 0.0000 0.0000; + 4008 6346 0.01174 0.05229 0.00767 149 0 0 0 0 1 0 0 -66.3400 3.9000 66.8600 -2.3400 0.0000 0.0000 0.0000 0.0000; + 4010 4009 0.00242 0.06944 0 196.5 0 0 1 0 1 0 0 75.5900 6.1100 -75.4600 -2.3500 0.0000 0.0000 0.0000 0.0000; + 4010 4009 0.00315 0.06944 0 196.5 0 0 1 0 1 0 0 75.6100 5.3100 -75.4400 -1.5500 0.0000 0.0000 0.0000 0.0000; + 4152 4009 0.00542 0.03498 0.00667 221 0 0 0 0 1 0 0 -93.0700 5.2200 93.5200 -3.0100 0.0000 0.0000 0.0000 0.0000; + 4152 4009 0.00542 0.03498 0.00667 221 0 0 0 0 1 0 0 -93.0700 5.2200 93.5200 -3.0100 0.0000 0.0000 0.0000 0.0000; + 4165 4009 0.00315 0.02032 0.00388 221 0 0 0 0 1 0 0 18.0800 -5.3000 -18.0700 4.9600 0.0000 0.0000 0.0000 0.0000; + 4165 4009 0.00315 0.02032 0.00388 221 0 0 0 0 1 0 0 18.0800 -5.3000 -18.0700 4.9600 0.0000 0.0000 0.0000 0.0000; + 4011 4185 0.03112 0.13615 0.02073 149 0 0 0 0 1 0 0 14.1200 -4.3600 -14.0600 2.4800 0.0000 0.0000 0.0000 0.0000; + 4034 4012 0.01625 0.09759 0.01324 221 0 0 0 0 1 0 0 -41.0300 -6.8500 41.3000 7.1400 0.0000 0.0000 0.0000 0.0000; + 4012 4103 0.02485 0.14192 0.02133 221 0 0 0 0 1 0 0 59.4300 -4.2900 -58.5900 6.9000 0.0000 0.0000 0.0000 0.0000; + 4012 4121 0.01296 0.07781 0.01056 98 0 0 0 0 1 0 0 -12.4700 8.4800 12.5000 -9.3900 0.0000 0.0000 0.0000 0.0000; + 4012 4171 0.02502 0.11152 0.01635 221 0 0 0 0 1 0 0 -102.0000 36.9200 104.8400 -25.9600 0.0000 0.0000 0.0000 0.0000; + 4013 4089 0.01437 0.09281 0.01771 250 0 0 0 0 1 0 0 -125.9100 31.6000 128.3000 -18.0100 0.0000 0.0000 0.0000 0.0000; + 4107 4013 0.02623 0.06413 0.0084 98 0 0 0 0 1 0 0 -19.4100 18.3600 19.5900 -18.7700 0.0000 0.0000 0.0000 0.0000; + 4013 4122 0.00312 0.01784 0.00268 98 0 0 0 0 1 0 0 13.9700 -39.0000 -13.9200 39.0200 0.0000 0.0000 0.0000 0.0000; + 4015 4014 0.00058 0.03637 0 321 0 0 1 0 1 0 0 -74.3300 13.2400 74.3700 -11.2800 0.0000 0.0000 0.0000 0.0000; + 4015 4014 0.00058 0.03637 0 321 0 0 1 0 1 0 0 -74.3300 13.2400 74.3700 -11.2800 0.0000 0.0000 0.0000 0.0000; + 4014 4131 0.01669 0.11926 0.21744 443 0 0 0 0 1 0 0 -37.8900 -8.6900 38.1200 -12.6600 0.0000 0.0000 0.0000 0.0000; + 4188 4015 0.03538 0.21243 0.02883 98 0 0 0 0 1 0 0 11.1800 -3.0600 -11.1400 0.2600 0.0000 0.0000 0.0000 0.0000; + 4016 4023 0.01228 0.07374 0.01001 98 0 0 0 0 1 0 0 49.8100 -8.1700 -49.5100 8.9900 0.0000 0.0000 0.0000 0.0000; + 4117 4016 0.01709 0.0709 0.01203 149 0 0 0 0 1 0 0 56.5900 -5.4200 -56.0600 6.4000 0.0000 0.0000 0.0000 0.0000; + 4081 4017 0.00217 0.01515 0.00248 221 0 0 0 0 1 0 0 104.8200 19.6100 -104.5800 -18.1900 0.0000 0.0000 0.0000 0.0000; + 4081 4017 0.00217 0.01515 0.00248 221 0 0 0 0 1 0 0 104.8200 19.6100 -104.5800 -18.1900 0.0000 0.0000 0.0000 0.0000; + 4017 4087 0.00568 0.02531 0.00371 149 0 0 0 0 1 0 0 39.8400 -35.5500 -39.6800 35.8700 0.0000 0.0000 0.0000 0.0000; + 4017 4123 0.00492 0.03426 0.0056 221 0 0 0 0 1 0 0 79.7700 46.5600 -79.3600 -44.2400 0.0000 0.0000 0.0000 0.0000; + 4018 4037 0.01371 0.06107 0.00896 149 0 0 0 0 1 0 0 49.6000 -25.2900 -49.1800 26.2500 0.0000 0.0000 0.0000 0.0000; + 4149 4018 0.01472 0.06561 0.00962 149 0 0 0 0 1 0 0 57.2900 -21.7600 -56.7400 23.2700 0.0000 0.0000 0.0000 0.0000; + 4019 4067 0.00919 0.06276 0.01068 221 0 0 0 0 1 0 0 -76.6000 10.0700 77.1600 -7.2900 0.0000 0.0000 0.0000 0.0000; + 4019 4067 0.00919 0.06276 0.01068 221 0 0 0 0 1 0 0 -76.6000 10.0700 77.1600 -7.2900 0.0000 0.0000 0.0000 0.0000; + 4019 4121 0.02026 0.04952 0.00648 98 0 0 0 0 1 0 0 17.3700 -58.6300 -16.6100 59.8400 0.0000 0.0000 0.0000 0.0000; + 4051 4020 0.01602 0.10945 0.01862 221 0 0 0 0 1 0 0 -62.4500 13.2200 63.1200 -10.4300 0.0000 0.0000 0.0000 0.0000; + 4051 4020 0.01602 0.10945 0.01862 221 0 0 0 0 1 0 0 -62.4500 13.2200 63.1200 -10.4300 0.0000 0.0000 0.0000 0.0000; + 4020 4123 0.00803 0.03577 0.00525 149 0 0 0 0 1 0 0 -22.7800 -10.6700 22.8400 10.3900 0.0000 0.0000 0.0000 0.0000; + 4150 4020 0.00418 0.02912 0.00476 221 0 0 0 0 1 0 0 111.1700 4.1400 -110.6400 -0.9300 0.0000 0.0000 0.0000 0.0000; + 4150 4020 0.00418 0.02912 0.00476 221 0 0 0 0 1 0 0 111.1700 4.1400 -110.6400 -0.9300 0.0000 0.0000 0.0000 0.0000; + 4089 4021 0.01219 0.05329 0.00812 156.45 0 0 0 0 1 0 0 72.1700 -1.2600 -71.5400 3.1900 0.0000 0.0000 0.0000 0.0000; + 4021 4167 0.00965 0.04299 0.0063 149 0 0 0 0 1 0 0 39.5700 -12.2500 -39.4100 12.3600 0.0000 0.0000 0.0000 0.0000; + 4187 4022 0.02501 0.10376 0.01761 149 0 0 0 0 1 0 0 11.1600 -12.5700 -11.0900 11.0600 0.0000 0.0000 0.0000 0.0000; + 6112 4023 0.04152 0.10149 0.01329 98 0 0 0 0 1 0 0 -43.6000 11.1300 44.4400 -10.4200 0.0000 0.0000 0.0000 0.0000; + 4025 4024 0.0013 0.04477 0 260 0 0 1 0 1 0 0 -156.8200 4.6600 157.1300 5.9600 0.0000 0.0000 0.0000 0.0000; + 4026 4024 0.00148 0.06658 0 500 0 0 1 0 1 0 0 204.4400 22.2500 -203.8500 4.2900 0.0000 0.0000 0.0000 0.0000; + 4026 4024 0.00148 0.06658 0 500 0 0 1 0 1 0 0 204.4400 22.2500 -203.8500 4.2900 0.0000 0.0000 0.0000 0.0000; + 4131 4024 0.00611 0.05974 0.11495 647 0 0 0 0 1 0 0 -244.4800 51.9300 248.1100 -28.4700 0.0000 0.0000 0.0000 0.0000; + 6263 4024 0.00754 0.05386 0.0982 443 0 0 0 0 1 0 0 -2.4300 -23.8700 2.4500 13.9200 0.0000 0.0000 0.0000 0.0000; + 4025 4117 0.00307 0.01981 0.00378 260 0 0 0 0 1 0 0 156.8200 -4.6600 -156.0900 8.9600 0.0000 0.0000 0.0000 0.0000; + 4027 4088 0.00276 0.01883 0.0032 221 0 0 0 0 1 0 0 -36.6800 -39.5900 36.7500 39.7800 0.0000 0.0000 0.0000 0.0000; + 4027 4088 0.00276 0.01883 0.0032 221 0 0 0 0 1 0 0 -36.6800 -39.5900 36.7500 39.7800 0.0000 0.0000 0.0000 0.0000; + 4029 4028 0.00077 0.04468 0 148.8 0 0 1 0 1 0 0 -79.1000 3.1100 79.1500 -0.4000 0.0000 0.0000 0.0000 0.0000; + 4029 4028 0.00077 0.04468 0 148.8 0 0 1 0 1 0 0 -79.1000 3.1100 79.1500 -0.4000 0.0000 0.0000 0.0000 0.0000; + 4030 4028 0.00053 0.0395 0 241.5 0 0 1 0 1 0 0 153.5300 -11.5500 -153.4100 20.7300 0.0000 0.0000 0.0000 0.0000; + 4030 4028 0.00053 0.0395 0 241.5 0 0 1 0 1 0 0 153.5300 -11.5500 -153.4100 20.7300 0.0000 0.0000 0.0000 0.0000; + 4030 4028 0.00053 0.0395 0 250 0 0 1 0 1 0 0 153.5300 -11.5500 -153.4100 20.7300 0.0000 0.0000 0.0000 0.0000; + 4028 7043 0.00286 0.02045 0.03728 443 0 0 0 0 1 0 0 -85.6700 -12.6200 85.8800 10.2300 0.0000 0.0000 0.0000 0.0000; + 4028 7274 0.00028 0.00295 0.01006 750 0 0 0 0 1 0 0 193.8000 -24.3800 -193.6900 24.4400 0.0000 0.0000 0.0000 0.0000; + 4028 7274 0.00028 0.00295 0.01006 750 0 0 0 0 1 0 0 193.8000 -24.3800 -193.6900 24.4400 0.0000 0.0000 0.0000 0.0000; + 4029 6253 0.01201 0.0776 0.0148 221 0 0 0 0 1 0 0 141.0900 -17.2500 -138.7400 30.9000 0.0000 0.0000 0.0000 0.0000; + 7275 4029 0.00321 0.01407 0.00214 149 0 0 0 0 1 0 0 -17.1000 -11.1900 17.1200 11.0200 0.0000 0.0000 0.0000 0.0000; + 4031 4043 0.04121 0.18028 0.02746 149 0 0 0 0 1 0 0 2.5900 2.8700 -2.5800 -5.6800 0.0000 0.0000 0.0000 0.0000; + 4147 4031 0.02053 0.0898 0.01368 149 0 0 0 0 1 0 0 5.3400 2.2500 -5.3400 -3.6500 0.0000 0.0000 0.0000 0.0000; + 4051 4032 0.02109 0.05154 0.00675 102.9 0 0 0 0 1 0 0 16.7200 -5.8900 -16.6500 5.3900 0.0000 0.0000 0.0000 0.0000; + 4141 4032 0.01931 0.08605 0.01262 149 0 0 0 0 1 0 0 76.0300 35.7700 -74.7400 -31.2900 0.0000 0.0000 0.0000 0.0000; + 4033 4101 0.0036 0.016 0.003 150 0 0 0 0 1 0 0 -12.2600 15.5800 12.2800 -15.8300 0.0000 0.0000 0.0000 0.0000; + 4033 4147 0.00984 0.06854 0.0112 221 0 0 0 0 1 0 0 -36.5400 -21.6800 36.7100 21.7200 0.0000 0.0000 0.0000 0.0000; + 4033 4147 0.00984 0.06854 0.0112 221 0 0 0 0 1 0 0 -36.5400 -21.6800 36.7100 21.7200 0.0000 0.0000 0.0000 0.0000; + 4033 4190 0.00397 0.01648 0.0028 223.5 0 0 0 0 1 0 0 -40.9100 -8.0000 40.9800 8.0000 0.0000 0.0000 0.0000 0.0000; + 4034 4154 0.01506 0.10289 0.01751 221 0 0 0 0 1 0 0 -61.5500 12.9600 62.1400 -10.7000 0.0000 0.0000 0.0000 0.0000; + 4064 4035 0.00506 0.02099 0.00356 149 0 0 0 0 1 0 0 68.9700 21.1800 -68.7100 -20.4300 0.0000 0.0000 0.0000 0.0000; + 4035 4150 0.02431 0.05942 0.00778 98 0 0 0 0 1 0 0 -10.4500 -2.0000 10.4800 1.3100 0.0000 0.0000 0.0000 0.0000; + 4132 4036 0.03455 0.15396 0.02258 149 0 0 0 0 1 0 0 49.7100 7.3100 -48.8800 -5.9300 0.0000 0.0000 0.0000 0.0000; + 4036 4189 0.05901 0.14424 0.01889 98 0 0 0 0 1 0 0 13.8100 -4.0100 -13.6900 2.4100 0.0000 0.0000 0.0000 0.0000; + 4037 4054 0.00975 0.05854 0.00794 98 0 0 0 0 1 0 0 -3.6400 13.8300 3.6600 -14.5200 0.0000 0.0000 0.0000 0.0000; + 4099 4037 0.01617 0.07075 0.01077 149 0 0 0 0 1 0 0 -23.9500 -18.6900 24.1000 18.2600 0.0000 0.0000 0.0000 0.0000; + 4054 4038 0.01093 0.06561 0.0089 98 0 0 0 0 1 0 0 -9.2600 12.9300 9.2900 -13.6500 0.0000 0.0000 0.0000 0.0000; + 4038 4125 0.01635 0.09341 0.01404 98 0 0 0 0 1 0 0 -43.4000 7.0700 43.7200 -6.6300 0.0000 0.0000 0.0000 0.0000; + 4038 4178 0.03181 0.07775 0.01018 98 0 0 0 0 1 0 0 -49.1900 -17.0300 50.0500 18.1000 0.0000 0.0000 0.0000 0.0000; + 4040 4039 0.00078 0.02871 0 384 0 0 1 0 1 0 0 -226.2800 52.1300 226.6800 -37.5300 0.0000 0.0000 0.0000 0.0000; + 4040 4039 0.00078 0.02871 0 384 0 0 1 0 1 0 0 -226.2800 52.1300 226.6800 -37.5300 0.0000 0.0000 0.0000 0.0000; + 4073 4039 0.00022 0.00224 0.00764 750 0 0 0 0 1 0 0 -153.2900 0.6000 153.3300 -0.8800 0.0000 0.0000 0.0000 0.0000; + 4073 4039 0.00022 0.00224 0.00764 750 0 0 0 0 1 0 0 -153.2900 0.6000 153.3300 -0.8800 0.0000 0.0000 0.0000 0.0000; + 4039 4151 0.00765 0.07956 0.27111 750 0 0 0 0 1 0 0 -253.3400 25.6100 258.1900 -3.6200 0.0000 0.0000 0.0000 0.0000; + 4039 4151 0.00765 0.07956 0.27111 750 0 0 0 0 1 0 0 -253.3400 25.6100 258.1900 -3.6200 0.0000 0.0000 0.0000 0.0000; + 4039 4151 0.00765 0.07956 0.27111 750 0 0 0 0 1 0 0 -253.3400 25.6100 258.1900 -3.6200 0.0000 0.0000 0.0000 0.0000; + 4074 4040 0.00148 0.00957 0.00183 250 0 0 0 0 1 0 0 158.7300 -50.3600 -158.3500 52.6700 0.0000 0.0000 0.0000 0.0000; + 4074 4040 0.00148 0.00957 0.00183 250 0 0 0 0 1 0 0 158.7300 -50.3600 -158.3500 52.6700 0.0000 0.0000 0.0000 0.0000; + 4074 4040 0.00148 0.00957 0.00183 250 0 0 0 0 1 0 0 158.7300 -50.3600 -158.3500 52.6700 0.0000 0.0000 0.0000 0.0000; + 4079 4040 0.00457 0.03186 0.00521 300 0 0 0 0 1 0 0 -174.2100 -11.5000 175.5500 20.3300 0.0000 0.0000 0.0000 0.0000; + 4079 4040 0.00457 0.03186 0.00521 300 0 0 0 0 1 0 0 -174.2100 -11.5000 175.5500 20.3300 0.0000 0.0000 0.0000 0.0000; + 4079 4040 0.00457 0.03186 0.00521 300 0 0 0 0 1 0 0 -174.2100 -11.5000 175.5500 20.3300 0.0000 0.0000 0.0000 0.0000; + 4042 4041 0.00056 0.03546 0 442 0 0 1 0 1 0 0 -260.5400 34.6700 260.9100 -11.0800 0.0000 0.0000 0.0000 0.0000; + 4042 4041 0.00056 0.03546 0 442 0 0 1 0 1 0 0 -260.5400 34.6700 260.9100 -11.0800 0.0000 0.0000 0.0000 0.0000; + 4042 4041 0.00056 0.03546 0 442 0 0 1 0 1 0 0 -260.5400 34.6700 260.9100 -11.0800 0.0000 0.0000 0.0000 0.0000; + 4073 4041 0.0019 0.01971 0.06717 820 0 0 0 0 1 0 0 394.2200 5.9800 -391.3700 16.6200 0.0000 0.0000 0.0000 0.0000; + 4073 4041 0.0019 0.01971 0.06717 820 0 0 0 0 1 0 0 394.2200 5.9800 -391.3700 16.6200 0.0000 0.0000 0.0000 0.0000; + 4088 4042 0.00312 0.02015 0.00384 375 0 0 0 0 1 0 0 -143.0100 80.1100 143.8100 -75.4000 0.0000 0.0000 0.0000 0.0000; + 4088 4042 0.00312 0.02015 0.00384 375 0 0 0 0 1 0 0 -143.0100 80.1100 143.8100 -75.4000 0.0000 0.0000 0.0000 0.0000; + 4107 4042 0.00298 0.01925 0.00367 331.5 0 0 0 0 1 0 0 -138.8600 10.3200 139.4200 -7.0800 0.0000 0.0000 0.0000 0.0000; + 4107 4042 0.00298 0.01925 0.00367 331.5 0 0 0 0 1 0 0 -138.8600 10.3200 139.4200 -7.0800 0.0000 0.0000 0.0000 0.0000; + 4043 4119 0.01218 0.05428 0.00796 149 0 0 0 0 1 0 0 0.1000 4.9800 -0.1000 -5.7800 0.0000 0.0000 0.0000 0.0000; + 4045 4044 0.00353 0.16159 0 120 0 0 1 0 1 0 0 93.4000 7.4700 -93.1000 6.1700 0.0000 0.0000 0.0000 0.0000; + 4046 4044 0.00669 0.2458 0 40 0 0 1 0 1 0 0 28.5000 1.9600 -28.4500 -0.0300 0.0000 0.0000 0.0000 0.0000; + 4047 4044 0.00557 0.09157 0 250 0 0 1 0 1 0 0 27.4800 3.4100 -27.4400 -2.7400 0.0000 0.0000 0.0000 0.0000; + 4044 4119 0.00264 0.01804 0.00307 221 0 0 0 0 1 0 0 125.0200 6.1300 -124.6200 -3.7000 0.0000 0.0000 0.0000 0.0000; + 4185 4044 0.03117 0.13891 0.02037 149 0 0 0 0 1 0 0 -23.7800 8.2900 23.9800 -9.5300 0.0000 0.0000 0.0000 0.0000; + 4048 4154 0.00408 0.02784 0.00474 221 0 0 0 0 1 0 0 88.7800 -1.5600 -88.4700 3.2400 0.0000 0.0000 0.0000 0.0000; + 4048 4155 0.00335 0.02332 0.00381 221 0 0 0 0 1 0 0 -50.9400 -1.0700 51.0300 1.2800 0.0000 0.0000 0.0000 0.0000; + 4048 4155 0.00335 0.02332 0.00381 221 0 0 0 0 1 0 0 -50.9400 -1.0700 51.0300 1.2800 0.0000 0.0000 0.0000 0.0000; + 4050 4049 0.00389 0.07962 0 195 0 0 1 0 1 0 0 75.0000 -10.9700 -74.7800 15.5400 0.0000 0.0000 0.0000 0.0000; + 4050 4049 0.00389 0.07962 0 195 0 0 1 0 1 0 0 75.0000 -10.9700 -74.7800 15.5400 0.0000 0.0000 0.0000 0.0000; + 4086 4049 0.00927 0.04053 0.00617 149 0 0 0 0 1 0 0 -19.8200 48.5400 20.0700 -48.1100 0.0000 0.0000 0.0000 0.0000; + 4049 4194 0.00379 0.02643 0.00432 221 0 0 0 0 1 0 0 64.7400 8.5100 -64.5800 -7.8400 0.0000 0.0000 0.0000 0.0000; + 4049 4194 0.00379 0.02643 0.00432 221 0 0 0 0 1 0 0 64.7400 8.5100 -64.5800 -7.8400 0.0000 0.0000 0.0000 0.0000; + 4052 4051 0.00406 0.16879 0 100 0 0 1 0 1 0 0 44.0800 22.5000 -43.9800 -18.5600 0.0000 0.0000 0.0000 0.0000; + 4127 4051 0.01554 0.08876 0.01334 221 0 0 0 0 1 0 0 -62.0300 30.2300 62.7800 -27.3200 0.0000 0.0000 0.0000 0.0000; + 4053 4152 0.0091 0.06213 0.01057 221 0 0 0 0 1 0 0 -61.5700 -0.0600 61.9100 1.2400 0.0000 0.0000 0.0000 0.0000; + 4053 4152 0.0091 0.06213 0.01057 221 0 0 0 0 1 0 0 -61.5700 -0.0600 61.9100 1.2400 0.0000 0.0000 0.0000 0.0000; + 4053 4191 0.02289 0.14783 0.0282 221 0 0 0 0 1 0 0 61.5200 0.0400 -60.6800 2.5000 0.0000 0.0000 0.0000 0.0000; + 4053 4191 0.02289 0.14783 0.0282 221 0 0 0 0 1 0 0 61.5200 0.0400 -60.6800 2.5000 0.0000 0.0000 0.0000 0.0000; + 4055 4078 0.00454 0.03104 0.00528 221 0 0 0 0 1 0 0 25.4800 4.6500 -25.4500 -4.9500 0.0000 0.0000 0.0000 0.0000; + 4055 4078 0.00454 0.03104 0.00528 221 0 0 0 0 1 0 0 25.4800 4.6500 -25.4500 -4.9500 0.0000 0.0000 0.0000 0.0000; + 4055 4109 0.01141 0.04991 0.0076 149 0 0 0 0 1 0 0 72.9000 -3.9500 -72.2800 5.9300 0.0000 0.0000 0.0000 0.0000; + 4055 4145 0.0037 0.02577 0.00421 221 0 0 0 0 1 0 0 -70.8200 -5.1900 71.0100 6.1100 0.0000 0.0000 0.0000 0.0000; + 4055 4145 0.0037 0.02577 0.00421 221 0 0 0 0 1 0 0 -70.8200 -5.1900 71.0100 6.1100 0.0000 0.0000 0.0000 0.0000; + 4057 4056 0.0009 0.03263 0 500 0 0 1 0 1 0 0 -299.5100 -34.0500 300.3200 63.5800 0.0000 0.0000 0.0000 0.0000; + 4058 4056 0.00136 0.05833 0 185 0 0 1 0 1 0 0 99.6100 17.4500 -99.4800 -11.8300 0.0000 0.0000 0.0000 0.0000; + 4059 4056 0.00197 0.04935 0 185 0 0 1 0 1 0 0 84.0900 18.4200 -83.9500 -14.9700 0.0000 0.0000 0.0000 0.0000; + 4060 4056 0.00213 0.08417 0 185 0 0 1 0 1 0 0 124.4100 14.8400 -124.0900 -2.3900 0.0000 0.0000 0.0000 0.0000; + 4061 4056 0.00148 0.05744 0 259 0 0 1 0 1 0 0 148.8800 19.5000 -148.5700 -7.2900 0.0000 0.0000 0.0000 0.0000; + 4062 4056 0.00287 0.0718 0 264 0 0 1 0 1 0 0 171.8600 17.0200 -171.0500 3.1600 0.0000 0.0000 0.0000 0.0000; + 4063 4056 0.00077 0.05841 0 260 0 0 1 0 1 0 0 124.7600 19.6900 -124.6400 -10.9100 0.0000 0.0000 0.0000 0.0000; + 4056 4158 0.00124 0.01287 0.04387 750 0 0 0 0 1 0 0 421.7200 11.1800 -419.6000 6.2900 0.0000 0.0000 0.0000 0.0000; + 4056 4181 0.00117 0.01146 0.02204 647 0 0 0 0 1 0 0 29.7300 -30.5400 -29.7100 28.4300 0.0000 0.0000 0.0000 0.0000; + 4108 4057 0.00271 0.01748 0.00334 221 0 0 0 0 1 0 0 -57.0100 -7.5500 57.1000 7.7900 0.0000 0.0000 0.0000 0.0000; + 4108 4057 0.00271 0.01748 0.00334 221 0 0 0 0 1 0 0 -57.0100 -7.5500 57.1000 7.7900 0.0000 0.0000 0.0000 0.0000; + 4057 4145 0.00563 0.03924 0.00641 221 0 0 0 0 1 0 0 92.6500 9.2300 -92.1700 -6.4800 0.0000 0.0000 0.0000 0.0000; + 4057 4145 0.00563 0.03924 0.00641 221 0 0 0 0 1 0 0 92.6500 9.2300 -92.1700 -6.4800 0.0000 0.0000 0.0000 0.0000; + 4065 4064 0.00915 0.19147 0 100 0 0 1 0 1 0 0 46.8700 13.4100 -46.6600 -9.0300 0.0000 0.0000 0.0000 0.0000; + 4069 4064 0.00989 0.02376 0.00322 98 0 0 0 0 1 0 0 9.4800 -0.9800 -9.4700 0.6800 0.0000 0.0000 0.0000 0.0000; + 4064 4099 0.00946 0.06459 0.01099 221 0 0 0 0 1 0 0 52.4500 -7.2500 -52.1800 7.9900 0.0000 0.0000 0.0000 0.0000; + 4064 4099 0.00946 0.06459 0.01099 221 0 0 0 0 1 0 0 52.4500 -7.2500 -52.1800 7.9900 0.0000 0.0000 0.0000 0.0000; + 4064 4104 0.00622 0.04017 0.00766 221 0 0 0 0 1 0 0 -63.2800 -0.4200 63.5300 1.2800 0.0000 0.0000 0.0000 0.0000; + 4064 4104 0.00622 0.04017 0.00766 221 0 0 0 0 1 0 0 -63.2800 -0.4200 63.5300 1.2800 0.0000 0.0000 0.0000 0.0000; + 4066 4068 0.013 0.05797 0.0085 149 0 0 0 0 1 0 0 -13.3400 21.7200 13.4200 -22.2300 0.0000 0.0000 0.0000 0.0000; + 4066 4107 0.00316 0.02043 0.0039 221 0 0 0 0 1 0 0 -89.1000 37.6900 89.3800 -36.2600 0.0000 0.0000 0.0000 0.0000; + 4066 4107 0.00316 0.02043 0.0039 221 0 0 0 0 1 0 0 -89.1000 37.6900 89.3800 -36.2600 0.0000 0.0000 0.0000 0.0000; + 4111 4067 0.00346 0.02362 0.00402 300 0 0 0 0 1 0 0 -182.4800 21.3300 183.6700 -13.5800 0.0000 0.0000 0.0000 0.0000; + 4194 4067 0.00473 0.03294 0.00539 300 0 0 0 0 1 0 0 167.1400 14.3500 -165.8200 -5.6700 0.0000 0.0000 0.0000 0.0000; + 4194 4067 0.00473 0.03294 0.00539 300 0 0 0 0 1 0 0 167.1400 14.3500 -165.8200 -5.6700 0.0000 0.0000 0.0000 0.0000; + 4194 4067 0.00473 0.03294 0.00539 300 0 0 0 0 1 0 0 167.1400 14.3500 -165.8200 -5.6700 0.0000 0.0000 0.0000 0.0000; + 4068 4103 0.00973 0.05555 0.00835 147 0 0 0 0 1 0 0 31.9500 -13.2700 -31.8400 13.0600 0.0000 0.0000 0.0000 0.0000; + 4068 4186 0.01855 0.08268 0.01212 149 0 0 0 0 1 0 0 -73.3600 27.5700 74.4800 -23.8000 0.0000 0.0000 0.0000 0.0000; + 4069 4072 0.00681 0.03892 0.00585 98 0 0 0 0 1 0 0 -13.7100 -0.2200 13.7300 -0.2800 0.0000 0.0000 0.0000 0.0000; + 4071 4070 0.00121 0.04292 0 353 0 0 1 0 1 0 0 -184.4000 -27.7300 184.8300 42.7700 0.0000 0.0000 0.0000 0.0000; + 4071 4070 0.00121 0.04292 0 353 0 0 1 0 1 0 0 -184.4000 -27.7300 184.8300 42.7700 0.0000 0.0000 0.0000 0.0000; + 4070 4183 0.002 0.02 0.07 443 0 0 0 0 1 0 0 -147.7400 -13.8100 148.1700 10.8500 0.0000 0.0000 0.0000 0.0000; + 4070 4192 0.00137 0.01421 0.04843 750 0 0 0 0 1 0 0 -110.9600 -35.8600 111.1300 32.7100 0.0000 0.0000 0.0000 0.0000; + 4070 4192 0.00137 0.01421 0.04843 750 0 0 0 0 1 0 0 -110.9600 -35.8600 111.1300 32.7100 0.0000 0.0000 0.0000 0.0000; + 4106 4071 0.009 0.0401 0.00588 221 0 0 0 0 1 0 0 -86.6100 27.0000 87.3500 -24.2800 0.0000 0.0000 0.0000 0.0000; + 4072 4156 0.00671 0.0278 0.00472 221 0 0 0 0 1 0 0 110.4400 -14.4600 -109.6000 17.4700 0.0000 0.0000 0.0000 0.0000; + 4072 4168 0.00284 0.01981 0.00324 221 0 0 0 0 1 0 0 -87.9400 0.0500 88.1600 1.1700 0.0000 0.0000 0.0000 0.0000; + 4072 4168 0.00284 0.01981 0.00324 221 0 0 0 0 1 0 0 -87.9400 0.0500 88.1600 1.1700 0.0000 0.0000 0.0000 0.0000; + 4074 4073 0.00046 0.01717 0 416.85 0 0 1 0 1 0 0 -266.1400 64.7300 266.4700 -52.5300 0.0000 0.0000 0.0000 0.0000; + 4074 4073 0.00046 0.01717 0 416.85 0 0 1 0 1 0 0 -266.1400 64.7300 266.4700 -52.5300 0.0000 0.0000 0.0000 0.0000; + 4075 4073 0.0015 0.06318 0 220 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4076 4073 0.0015 0.05994 0 220 0 0 1 0 1 0 0 175.8500 23.5600 -175.4000 -5.7700 0.0000 0.0000 0.0000 0.0000; + 4077 4073 0.00135 0.06817 0 220 0 0 1 0 1 0 0 97.0700 17.9700 -96.9400 -11.7100 0.0000 0.0000 0.0000 0.0000; + 4146 4073 0.006 0.06 0.115 548 0 0 0 0 1 0 0 170.3400 -0.4200 -168.6900 4.9000 0.0000 0.0000 0.0000 0.0000; + 4073 4183 0.01015 0.07248 0.13214 750 0 0 0 0 1 0 0 -277.6100 60.7900 285.5900 -17.5100 0.0000 0.0000 0.0000 0.0000; + 4192 4073 0.0062 0.06449 0.21975 820 0 0 0 0 1 0 0 301.5700 -10.1600 -296.1500 43.6900 0.0000 0.0000 0.0000 0.0000; + 4155 4074 0.01013 0.05786 0.00869 221 0 0 0 0 1 0 0 -55.7200 -20.5200 56.0700 21.6100 0.0000 0.0000 0.0000 0.0000; + 4120 4078 0.00325 0.01949 0.00265 250 0 0 0 0 1 0 0 29.1300 12.9100 -29.1000 -12.9600 0.0000 0.0000 0.0000 0.0000; + 4078 4180 0.01569 0.08959 0.01346 98 0 0 0 0 1 0 0 -4.0700 -0.9500 4.0800 -0.3400 0.0000 0.0000 0.0000 0.0000; + 4079 4157 0.00338 0.02308 0.00393 375 0 0 0 0 1 0 0 175.7000 -7.0100 -174.6900 13.5000 0.0000 0.0000 0.0000 0.0000; + 4079 4157 0.00338 0.02308 0.00393 375 0 0 0 0 1 0 0 175.7000 -7.0100 -174.6900 13.5000 0.0000 0.0000 0.0000 0.0000; + 4081 4080 0.00112 0.06024 0 171 0 0 1 0 1 0 0 -104.8200 -19.6100 104.9500 26.2600 0.0000 0.0000 0.0000 0.0000; + 4081 4080 0.00112 0.06024 0 171 0 0 1 0 1 0 0 -104.8200 -19.6100 104.9500 26.2600 0.0000 0.0000 0.0000 0.0000; + 4082 4080 0.00121 0.05053 0 342 0 0 1 0 1 0 0 242.7300 29.6500 -242.0600 -1.7100 0.0000 0.0000 0.0000 0.0000; + 4083 4080 0.00111 0.04655 0 342 0 0 1 0 1 0 0 242.7300 30.4200 -242.1200 -4.6600 0.0000 0.0000 0.0000 0.0000; + 4084 4080 0.00039 0.02538 0 338 0 0 1 0 1 0 0 242.7300 46.2100 -242.5100 -31.8800 0.0000 0.0000 0.0000 0.0000; + 4085 4080 0.00054 0.02176 0 500 0 0 1 0 1 0 0 168.0600 48.8000 -167.9100 -42.6400 0.0000 0.0000 0.0000 0.0000; + 4140 4080 0.00421 0.04377 0.14917 750 0 0 0 0 1 0 0 -185.4200 24.5600 186.8200 -25.8700 0.0000 0.0000 0.0000 0.0000; + 4080 4151 0.00484 0.05033 0.17151 750 0 0 0 0 1 0 0 206.9700 -13.6100 -205.0100 15.8200 0.0000 0.0000 0.0000 0.0000; + 4080 4181 0.00409 0.03994 0.07686 647 0 0 0 0 1 0 0 -220.6700 44.1600 222.6400 -33.0300 0.0000 0.0000 0.0000 0.0000; + 4183 4080 0.002 0.02 0.07 820 0 0 0 0 1 0 0 -506.6400 18.4900 511.5900 23.7000 0.0000 0.0000 0.0000 0.0000; + 4086 4106 0.02192 0.09592 0.01461 149 0 0 0 0 1 0 0 -48.2300 39.7700 49.0600 -37.6400 0.0000 0.0000 0.0000 0.0000; + 4110 4086 0.01641 0.07179 0.01093 149 0 0 0 0 1 0 0 -47.7900 -13.6100 48.1800 14.2100 0.0000 0.0000 0.0000 0.0000; + 4156 4087 0.00563 0.02463 0.00375 221 0 0 0 0 1 0 0 -37.1000 -85.7300 37.6000 87.5200 0.0000 0.0000 0.0000 0.0000; + 4090 4089 0.01451 0.58764 0 28 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4091 4089 0.00427 0.20036 0 37 0 0 1 0 1 0 0 23.4400 2.4500 -23.4100 -1.3600 0.0000 0.0000 0.0000 0.0000; + 4092 4089 0.0034 0.12539 0 48 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4093 4089 0.01405 0.24296 0 40 0 0 1 0 1 0 0 27.9200 1.3000 -27.8200 0.5600 0.0000 0.0000 0.0000 0.0000; + 4094 4089 0.00238 0.09215 0 40 0 0 1 0 1 0 0 27.9200 4.8600 -27.9000 -4.1400 0.0000 0.0000 0.0000 0.0000; + 4095 4089 0.0077 0.18665 0 40 0 0 1 0 1 0 0 27.9200 2.1400 -27.8600 -0.7100 0.0000 0.0000 0.0000 0.0000; + 4096 4089 0.01248 0.29442 0 40 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4097 4089 0.00925 0.21151 0 40 0 0 1 0 1 0 0 27.9200 1.8700 -27.8500 -0.2400 0.0000 0.0000 0.0000 0.0000; + 4098 4089 0.01041 0.22475 0 40 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4089 4194 0.01637 0.06793 0.01153 166.88 0 0 0 0 1 0 0 -74.2300 22.7100 75.2100 -19.8100 0.0000 0.0000 0.0000 0.0000; + 4169 4099 0.00915 0.0625 0.01063 221 0 0 0 0 1 0 0 -56.2800 1.7700 56.5700 -0.7900 0.0000 0.0000 0.0000 0.0000; + 4169 4099 0.00915 0.0625 0.01063 221 0 0 0 0 1 0 0 -56.2800 1.7700 56.5700 -0.7900 0.0000 0.0000 0.0000 0.0000; + 4100 4120 0.00186 0.00773 0.00131 250 0 0 0 0 1 0 0 75.7800 26.4600 -75.6600 -26.0900 0.0000 0.0000 0.0000 0.0000; + 4150 4100 0.00216 0.01393 0.00266 232.05 0 0 0 0 1 0 0 -122.6700 -6.5700 123.0000 8.4500 0.0000 0.0000 0.0000 0.0000; + 4150 4100 0.00216 0.01393 0.00266 232.05 0 0 0 0 1 0 0 -122.6700 -6.5700 123.0000 8.4500 0.0000 0.0000 0.0000 0.0000; + 4168 4100 0.00185 0.01287 0.0021 221 0 0 0 0 1 0 0 124.4200 21.0800 -124.1300 -19.2400 0.0000 0.0000 0.0000 0.0000; + 4168 4100 0.00185 0.01287 0.0021 221 0 0 0 0 1 0 0 124.4200 21.0800 -124.1300 -19.2400 0.0000 0.0000 0.0000 0.0000; + 4168 4100 0.00185 0.01287 0.0021 221 0 0 0 0 1 0 0 124.4200 21.0800 -124.1300 -19.2400 0.0000 0.0000 0.0000 0.0000; + 4175 4101 0.01931 0.08013 0.0136 149 0 0 0 0 1 0 0 62.0300 15.7400 -61.2800 -14.0400 0.0000 0.0000 0.0000 0.0000; + 4197 4101 0.02022 0.09011 0.01321 156.45 0 0 0 0 1 0 0 80.3900 10.6700 -79.1300 -6.4400 0.0000 0.0000 0.0000 0.0000; + 4126 4102 0.00411 0.02652 0.00506 300 0 0 0 0 1 0 0 155.4500 -22.3800 -154.4500 28.3400 0.0000 0.0000 0.0000 0.0000; + 4126 4102 0.00411 0.02652 0.00506 300 0 0 0 0 1 0 0 155.4500 -22.3800 -154.4500 28.3400 0.0000 0.0000 0.0000 0.0000; + 4102 4171 0.00634 0.04334 0.00737 280 0 0 0 0 1 0 0 142.3600 -31.7600 -141.0300 40.1200 0.0000 0.0000 0.0000 0.0000; + 4102 4171 0.00634 0.04334 0.00737 280 0 0 0 0 1 0 0 142.3600 -31.7600 -141.0300 40.1200 0.0000 0.0000 0.0000 0.0000; + 4105 4104 0.00385 0.08871 0 143.36 0 0 1 0 1 0 0 67.5000 11.8800 -67.3200 -7.8000 0.0000 0.0000 0.0000 0.0000; + 4105 4104 0.00385 0.08871 0 143.36 0 0 1 0 1 0 0 67.5000 11.8800 -67.3200 -7.8000 0.0000 0.0000 0.0000 0.0000; + 4145 4104 0.01294 0.03109 0.00422 98 0 0 0 0 1 0 0 -7.5500 -13.3800 7.5800 13.0300 0.0000 0.0000 0.0000 0.0000; + 4170 4108 0.00818 0.0358 0.00545 149 0 0 0 0 1 0 0 -85.0700 -4.9500 85.6800 7.0600 0.0000 0.0000 0.0000 0.0000; + 4109 4156 0.00373 0.02127 0.0032 147 0 0 0 0 1 0 0 -38.5800 -37.3400 38.6900 37.6600 0.0000 0.0000 0.0000 0.0000; + 4110 4171 0.02886 0.11974 0.02032 149 0 0 0 0 1 0 0 -9.5600 -2.6400 9.5900 0.6800 0.0000 0.0000 0.0000 0.0000; + 4186 4111 0.00861 0.0384 0.00563 221 0 0 0 0 1 0 0 -77.6300 53.6700 78.4000 -50.8200 0.0000 0.0000 0.0000 0.0000; + 4124 4112 0.01932 0.13196 0.02245 221 0 0 0 0 1 0 0 -103.6200 8.7700 105.7000 3.1200 0.0000 0.0000 0.0000 0.0000; + 4124 4112 0.01932 0.13196 0.02245 221 0 0 0 0 1 0 0 -103.6200 8.7700 105.7000 3.1200 0.0000 0.0000 0.0000 0.0000; + 4112 4141 0.0066 0.04599 0.00752 221 0 0 0 0 1 0 0 -108.4900 -3.9100 109.2400 8.3300 0.0000 0.0000 0.0000 0.0000; + 4112 4141 0.0066 0.04599 0.00752 221 0 0 0 0 1 0 0 -108.4900 -3.9100 109.2400 8.3300 0.0000 0.0000 0.0000 0.0000; + 4114 4113 0.00072 0.01874 0 387 0 0 1 0 1 0 0 -212.0000 -36.4000 212.3200 44.7800 0.0000 0.0000 0.0000 0.0000; + 4115 4113 0.00101 0.05405 0 180 0 0 1 0 1 0 0 131.4400 28.4000 -131.2700 -19.3600 0.0000 0.0000 0.0000 0.0000; + 4116 4113 0.00162 0.05686 0 180 0 0 1 0 1 0 0 123.7700 25.7100 -123.5300 -17.3100 0.0000 0.0000 0.0000 0.0000; + 4146 4113 0.0025 0.02448 0.04711 548 0 0 0 0 1 0 0 -13.4300 3.2500 13.4400 -8.1700 0.0000 0.0000 0.0000 0.0000; + 4190 4114 0.00237 0.01616 0.00275 221 0 0 0 0 1 0 0 -86.7200 -22.7600 86.9000 23.7500 0.0000 0.0000 0.0000 0.0000; + 4190 4114 0.00237 0.01616 0.00275 221 0 0 0 0 1 0 0 -86.7200 -22.7600 86.9000 23.7500 0.0000 0.0000 0.0000 0.0000; + 4117 4172 0.01489 0.06176 0.01048 149 0 0 0 0 1 0 0 80.6100 -8.8900 -79.6600 11.7500 0.0000 0.0000 0.0000 0.0000; + 4139 4118 0.0147 0.08395 0.01262 98 0 0 0 0 1 0 0 31.4300 -6.1600 -31.2700 5.8100 0.0000 0.0000 0.0000 0.0000; + 4148 4118 0.0246 0.14051 0.02111 98 0 0 0 0 1 0 0 -17.3000 8.2100 17.3900 -9.7400 0.0000 0.0000 0.0000 0.0000; + 4164 4119 0.02453 0.1676 0.02851 221 0 0 0 0 1 0 0 -67.9900 11.2200 69.1500 -6.2600 0.0000 0.0000 0.0000 0.0000; + 4122 4157 0.00313 0.02183 0.00357 221 0 0 0 0 1 0 0 -121.8800 31.3100 122.3600 -28.3300 0.0000 0.0000 0.0000 0.0000; + 4122 4157 0.00313 0.02183 0.00357 221 0 0 0 0 1 0 0 -121.8800 31.3100 122.3600 -28.3300 0.0000 0.0000 0.0000 0.0000; + 4123 4180 0.01637 0.09826 0.01333 98 0 0 0 0 1 0 0 -33.9800 8.2100 34.1800 -8.2800 0.0000 0.0000 0.0000 0.0000; + 4128 4124 0.02044 0.13201 0.02518 221 0 0 0 0 1 0 0 -89.7100 20.7800 91.4300 -12.2200 0.0000 0.0000 0.0000 0.0000; + 4128 4124 0.02044 0.13201 0.02518 221 0 0 0 0 1 0 0 -89.7100 20.7800 91.4300 -12.2200 0.0000 0.0000 0.0000 0.0000; + 6264 4125 0.03218 0.07865 0.0103 98 0 0 0 0 1 0 0 48.9900 -4.5200 -48.2300 5.3600 0.0000 0.0000 0.0000 0.0000; + 4193 4126 0.00522 0.0364 0.00595 250 0 0 0 0 1 0 0 147.2000 4.1900 -146.0900 2.8900 0.0000 0.0000 0.0000 0.0000; + 4193 4126 0.00522 0.0364 0.00595 250 0 0 0 0 1 0 0 147.2000 4.1900 -146.0900 2.8900 0.0000 0.0000 0.0000 0.0000; + 4193 4126 0.00522 0.0364 0.00595 250 0 0 0 0 1 0 0 147.2000 4.1900 -146.0900 2.8900 0.0000 0.0000 0.0000 0.0000; + 4144 4127 0.02101 0.12616 0.01712 102.9 0 0 0 0 1 0 0 25.4400 -16.0900 -25.2500 15.5300 0.0000 0.0000 0.0000 0.0000; + 4129 4130 0.03748 0.09002 0.01222 98 0 0 0 0 1 0 0 27.1300 -8.5800 -26.8500 7.9500 0.0000 0.0000 0.0000 0.0000; + 4129 4176 0.02359 0.14166 0.01922 147 0 0 0 0 1 0 0 -45.6500 3.3300 46.1100 -2.6000 0.0000 0.0000 0.0000 0.0000; + 4130 4179 0.01386 0.07916 0.0119 98 0 0 0 0 1 0 0 17.3700 14.8200 -17.3000 -15.6600 0.0000 0.0000 0.0000 0.0000; + 4132 4131 0.00028 0.01679 0 246.6 0 0 1 0 1 0 0 -101.6400 -9.6300 101.6700 11.2900 0.0000 0.0000 0.0000 0.0000; + 4132 4131 0.00028 0.01679 0 246.6 0 0 1 0 1 0 0 -101.6400 -9.6300 101.6700 11.2900 0.0000 0.0000 0.0000 0.0000; + 4133 4131 0.00199 0.07159 0 101 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 4134 4131 0.00198 0.14741 0 103 0 0 1 0 1 0 0 10.2100 -3.7300 -10.2100 3.9000 0.0000 0.0000 0.0000 0.0000; + 4135 4131 0.00314 0.14014 0 103 0 0 1 0 1 0 0 10.2100 -3.7300 -10.2100 3.8900 0.0000 0.0000 0.0000 0.0000; + 4136 4131 0.00315 0.18409 0 105 0 0 1 0 1 0 0 10.2100 -3.7300 -10.2100 3.9400 0.0000 0.0000 0.0000 0.0000; + 4137 4131 0.00218 0.08044 0 140 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 4138 4131 0.00058 0.03762 0 135 0 0 1 0 1 0 0 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4131 6308 0.00739 0.05281 0.09628 443 0 0 0 0 1 0 0 33.6500 2.2300 -33.5600 -11.8000 0.0000 0.0000 0.0000 0.0000; + 4132 4143 0.02006 0.08324 0.01413 149 0 0 0 0 1 0 0 58.1600 7.0700 -57.5000 -5.8200 0.0000 0.0000 0.0000 0.0000; + 6357 4132 0.01827 0.07994 0.01217 149 0 0 0 0 1 0 0 -61.6500 6.1700 62.3200 -4.4900 0.0000 0.0000 0.0000 0.0000; + 4139 4144 0.00882 0.05038 0.00757 147 0 0 0 0 1 0 0 41.9700 -11.2200 -41.8000 11.4600 0.0000 0.0000 0.0000 0.0000; + 4139 4169 0.01144 0.05002 0.00762 149 0 0 0 0 1 0 0 -84.0100 14.3700 84.8700 -11.3800 0.0000 0.0000 0.0000 0.0000; + 4141 4140 0.00072 0.03223 0 428 0 0 1 0 1 0 0 -182.7800 0.7700 183.0100 9.3800 0.0000 0.0000 0.0000 0.0000; + 4142 4140 0.00054 0.02789 0 168 0 0 1 0 1 0 0 141.0000 27.3400 -140.9000 -22.0200 0.0000 0.0000 0.0000 0.0000; + 4140 4151 0.00411 0.02936 0.05353 443 0 0 0 0 1 0 0 77.8600 6.8200 -77.6200 -10.8000 0.0000 0.0000 0.0000 0.0000; + 4140 4196 0.01639 0.11706 0.21342 523 0 0 0 0 1 0 0 65.4500 -18.7400 -64.7900 0.7300 0.0000 0.0000 0.0000 0.0000; + 4141 4165 0.01975 0.08194 0.0139 221 0 0 0 0 1 0 0 -111.7300 38.3100 114.3400 -28.9600 0.0000 0.0000 0.0000 0.0000; + 4189 4143 0.02761 0.11455 0.01944 149 0 0 0 0 1 0 0 -42.6400 -1.6200 43.1400 1.7500 0.0000 0.0000 0.0000 0.0000; + 4147 4146 0.0002 0.0123 0 459 0 0 1 0 1 0 0 -272.4100 4.8900 272.5500 3.7700 0.0000 0.0000 0.0000 0.0000; + 4146 4196 0.00241 0.02506 0.0854 750 0 0 0 0 1 0 0 -214.7300 -3.3000 215.7900 5.1900 0.0000 0.0000 0.0000 0.0000; + 4146 4196 0.00241 0.02506 0.0854 750 0 0 0 0 1 0 0 -214.7300 -3.3000 215.7900 5.1900 0.0000 0.0000 0.0000 0.0000; + 4148 4179 0.03149 0.1891 0.02566 98 0 0 0 0 1 0 0 2.6600 -12.3600 -2.6200 10.0100 0.0000 0.0000 0.0000 0.0000; + 4173 4149 0.02612 0.11641 0.01707 170 0 0 0 0 1 0 0 64.0000 -8.8100 -62.9100 11.9400 0.0000 0.0000 0.0000 0.0000; + 4149 4182 0.00774 0.05286 0.00899 221 0 0 0 0 1 0 0 -55.7400 -7.5700 55.9900 8.3500 0.0000 0.0000 0.0000 0.0000; + 4152 4151 0.00143 0.08362 0 81.9 0 0 1 0 1 0 0 31.1600 -6.4700 -31.1500 7.2800 0.0000 0.0000 0.0000 0.0000; + 4152 4151 0.00143 0.08362 0 81.9 0 0 1 0 1 0 0 31.1600 -6.4700 -31.1500 7.2800 0.0000 0.0000 0.0000 0.0000; + 4153 4151 0.0006 0.01612 0 381 0 0 1 0 1 0 0 212.4000 60.3200 -212.1300 -53.0100 0.0000 0.0000 0.0000 0.0000; + 4151 4158 0.00609 0.06334 0.21583 750 0 0 0 0 1 0 0 -217.5000 44.3000 220.4100 -36.5300 0.0000 0.0000 0.0000 0.0000; + 4164 4155 0.00412 0.02661 0.00508 221 0 0 0 0 1 0 0 65.9700 -11.7900 -65.7900 12.4500 0.0000 0.0000 0.0000 0.0000; + 4159 4158 0.0006 0.02511 0 620 0 0 1 0 1 0 0 -297.5400 -40.6100 298.0900 63.2500 0.0000 0.0000 0.0000 0.0000; + 4159 4158 0.0006 0.02511 0 620 0 0 1 0 1 0 0 -297.5400 -40.6100 298.0900 63.2500 0.0000 0.0000 0.0000 0.0000; + 4160 4158 0.00047 0.02419 0 298 0 0 1 0 1 0 0 197.2300 64.8600 -197.0400 -55.0300 0.0000 0.0000 0.0000 0.0000; + 4161 4158 0.00081 0.05928 0 296 0 0 1 0 1 0 0 87.7900 27.1900 -87.7300 -22.4700 0.0000 0.0000 0.0000 0.0000; + 4162 4158 0.00201 0.05867 0 293 0 0 1 0 1 0 0 112.4700 26.1300 -112.2200 -18.7600 0.0000 0.0000 0.0000 0.0000; + 4163 4158 0.0037 0.15066 0 74 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 4159 4168 0.00057 0.00394 0.00064 250 0 0 0 0 1 0 0 139.7300 17.7400 -139.6100 -17.0300 0.0000 0.0000 0.0000 0.0000; + 4159 4168 0.00057 0.00394 0.00064 250 0 0 0 0 1 0 0 139.7300 17.7400 -139.6100 -17.0300 0.0000 0.0000 0.0000 0.0000; + 4159 4168 0.00057 0.00394 0.00064 250 0 0 0 0 1 0 0 139.7300 17.7400 -139.6100 -17.0300 0.0000 0.0000 0.0000 0.0000; + 4159 4168 0.00057 0.00394 0.00064 250 0 0 0 0 1 0 0 139.7300 17.7400 -139.6100 -17.0300 0.0000 0.0000 0.0000 0.0000; + 4166 4165 0.00217 0.09206 0 198 0 0 1 0 1 0 0 75.3800 -14.4700 -75.2500 19.7800 0.0000 0.0000 0.0000 0.0000; + 4166 4165 0.00217 0.09206 0 198 0 0 1 0 1 0 0 75.3800 -14.4700 -75.2500 19.7800 0.0000 0.0000 0.0000 0.0000; + 4186 4167 0.01453 0.06359 0.00968 149 0 0 0 0 1 0 0 -33.9100 13.7500 34.1000 -13.8700 0.0000 0.0000 0.0000 0.0000; + 4180 4170 0.00815 0.03567 0.00543 149 0 0 0 0 1 0 0 -49.0100 5.5700 49.2200 -5.2100 0.0000 0.0000 0.0000 0.0000; + 6221 4172 0.01492 0.06529 0.00994 149 0 0 0 0 1 0 0 32.6000 23.7100 -32.3700 -23.7300 0.0000 0.0000 0.0000 0.0000; + 4172 6346 0.01189 0.05202 0.00792 149 0 0 0 0 1 0 0 69.7300 -0.0100 -69.1600 1.6900 0.0000 0.0000 0.0000 0.0000; + 7030 4173 0.02382 0.10423 0.01587 149 0 0 0 0 1 0 0 77.4400 -0.9400 -76.0500 5.3900 0.0000 0.0000 0.0000 0.0000; + 6015 4174 0.00722 0.02995 0.00508 221 0 0 0 0 1 0 0 62.9400 -53.4100 -62.4600 54.8800 0.0000 0.0000 0.0000 0.0000; + 6276 4174 0.01173 0.04865 0.00826 149 0 0 0 0 1 0 0 -42.9900 -27.8000 43.2900 28.2100 0.0000 0.0000 0.0000 0.0000; + 4176 4175 0.02194 0.09598 0.01462 149 0 0 0 0 1 0 0 66.0800 -4.1400 -65.1900 6.4700 0.0000 0.0000 0.0000 0.0000; + 4177 4176 0.0053 0.11274 0 115 0 0 1 0 1 0 0 56.2500 -0.0700 -56.1000 3.3700 0.0000 0.0000 0.0000 0.0000; + 4177 4176 0.0053 0.11274 0 115 0 0 1 0 1 0 0 56.2500 -0.0700 -56.1000 3.3700 0.0000 0.0000 0.0000 0.0000; + 4178 6253 0.02656 0.11618 0.01769 149 0 0 0 0 1 0 0 -67.5100 23.9800 68.8200 -20.1000 0.0000 0.0000 0.0000 0.0000; + 4182 4181 0.00321 0.09306 0 169 0 0 1 0 1 0 0 -78.6700 -14.7800 78.8700 20.6800 0.0000 0.0000 0.0000 0.0000; + 7274 4181 0.01011 0.07225 0.13172 443 0 0 0 0 1 0 0 123.2700 -29.2300 -121.7300 26.5300 0.0000 0.0000 0.0000 0.0000; + 4184 4183 0.00113 0.06134 0 400 0 0 1 0 1 0 0 -224.5700 -0.8900 225.1300 31.4100 0.0000 0.0000 0.0000 0.0000; + 4191 4184 0.01223 0.08358 0.01422 221 0 0 0 0 1 0 0 37.4600 -9.0800 -37.2800 8.8700 0.0000 0.0000 0.0000 0.0000; + 4191 4184 0.01223 0.08358 0.01422 221 0 0 0 0 1 0 0 37.4600 -9.0800 -37.2800 8.8700 0.0000 0.0000 0.0000 0.0000; + 4184 4194 0.00649 0.04522 0.00739 262.5 0 0 0 0 1 0 0 149.5600 -8.4200 -148.1300 17.6800 0.0000 0.0000 0.0000 0.0000; + 4184 4194 0.00649 0.04522 0.00739 262.5 0 0 0 0 1 0 0 149.5600 -8.4200 -148.1300 17.6800 0.0000 0.0000 0.0000 0.0000; + 4187 4189 0.02899 0.12682 0.01931 149 0 0 0 0 1 0 0 -26.2200 8.3000 26.4400 -9.2500 0.0000 0.0000 0.0000 0.0000; + 4193 4192 0.00036 0.02396 0 438 0 0 1 0 1 0 0 -206.6100 -21.0300 206.7600 31.0900 0.0000 0.0000 0.0000 0.0000; + 4193 4192 0.00036 0.02396 0 438 0 0 1 0 1 0 0 -206.6100 -21.0300 206.7600 31.0900 0.0000 0.0000 0.0000 0.0000; + 4193 4192 0.00036 0.02396 0 438 0 0 1 0 1 0 0 -206.6100 -21.0300 206.7600 31.0900 0.0000 0.0000 0.0000 0.0000; + 4196 4195 8e-05 0.00576 0 1233 0 0 1 0 1 0 0 -480.4900 -21.1700 480.6600 33.6500 0.0000 0.0000 0.0000 0.0000; + 4195 6239 0.00265 0.0321 2.13231 2020 0 0 0 0 1 0 0 -411.6600 -46.9000 415.9600 -129.0200 0.0000 0.0000 0.0000 0.0000; + 4197 4196 0.00072 0.03236 0 200 0 0 1 0 1 0 0 -113.6100 -6.1200 113.7000 10.0700 0.0000 0.0000 0.0000 0.0000; + 5003 5181 0.00233 0.01026 0.00478 187 0 0 0 0 1 0 0 -41.8900 -10.4900 41.9400 10.2200 0.0000 0.0000 0.0000 0.0000; + 5213 5003 0.00127 0.0072 0.00387 251 0 0 0 0 1 0 0 77.1100 -7.5400 -77.0300 7.6000 0.0000 0.0000 0.0000 0.0000; + 5003 5436 0.00455 0.01936 0.00968 187 0 0 0 0 1 0 0 5.2800 -29.3100 -5.2400 28.5200 0.0000 0.0000 0.0000 0.0000; + 5004 5426 0.00757 0.04276 0.023 251 0 0 0 0 1 0 0 64.9800 -16.7100 -64.6300 16.3900 0.0000 0.0000 0.0000 0.0000; + 5476 5004 0.004 0.0226 0.01216 251 0 0 0 0 1 0 0 76.9200 -13.1900 -76.6700 13.3900 0.0000 0.0000 0.0000 0.0000; + 5133 5005 0.00846 0.03598 0.018 187 0 0 0 0 1 0 0 -21.9200 -0.6300 21.9600 -1.0500 0.0000 0.0000 0.0000 0.0000; + 5005 5435 0.00739 0.03256 0.01515 187 0 0 0 0 1 0 0 -30.9000 -1.4900 30.9700 0.2200 0.0000 0.0000 0.0000 0.0000; + 5006 5072 0.00074 0.00543 0.00308 310 0 0 0 0 1 0 0 -168.0600 26.5600 168.2700 -25.2800 0.0000 0.0000 0.0000 0.0000; + 5006 5072 0.00074 0.00543 0.00308 310 0 0 0 0 1 0 0 -168.0600 26.5600 168.2700 -25.2800 0.0000 0.0000 0.0000 0.0000; + 5006 5072 0.00074 0.00543 0.00308 310 0 0 0 0 1 0 0 -168.0600 26.5600 168.2700 -25.2800 0.0000 0.0000 0.0000 0.0000; + 5289 5006 0.00065 0.00498 0.00262 310 0 0 0 0 1 0 0 -158.5900 53.3200 158.7700 -52.1800 0.0000 0.0000 0.0000 0.0000; + 5289 5006 0.00065 0.00498 0.00262 310 0 0 0 0 1 0 0 -158.5900 53.3200 158.7700 -52.1800 0.0000 0.0000 0.0000 0.0000; + 5006 5294 0.00495 0.02107 0.01054 187 0 0 0 0 1 0 0 86.4400 -3.7000 -86.0600 4.2400 0.0000 0.0000 0.0000 0.0000; + 5007 5012 0.0011 0.00645 0.00322 251 0 0 0 0 1 0 0 130.1700 11.4500 -129.9800 -10.6600 0.0000 0.0000 0.0000 0.0000; + 5165 5007 0.00088 0.00648 0.00367 409 0 0 0 0 1 0 0 202.6000 34.2400 -202.2200 -31.8700 0.0000 0.0000 0.0000 0.0000; + 5134 5008 0.01009 0.05706 0.03069 251 0 0 0 0 1 0 0 -125.5700 18.0500 127.1700 -12.1500 0.0000 0.0000 0.0000 0.0000; + 5347 5008 0.01147 0.05055 0.02353 187 0 0 0 0 1 0 0 -32.5000 2.7900 32.6200 -4.6700 0.0000 0.0000 0.0000 0.0000; + 5396 5008 0.00397 0.02909 0.01648 400 0 0 0 0 1 0 0 168.4700 -8.3600 -167.3800 14.6600 0.0000 0.0000 0.0000 0.0000; + 5294 5009 0.00175 0.00769 0.00358 187 0 0 0 0 1 0 0 23.8700 -78.0900 -23.7500 78.2600 0.0000 0.0000 0.0000 0.0000; + 5311 5009 0.0016 0.00704 0.00328 187 0 0 0 0 1 0 0 14.4300 -29.9400 -14.4100 29.6900 0.0000 0.0000 0.0000 0.0000; + 5482 5009 0.00139 0.0061 0.00284 409 0 0 0 0 1 0 0 24.7400 126.4200 -24.5100 -125.7000 0.0000 0.0000 0.0000 0.0000; + 5010 5096 0.00127 0.00969 0.00509 310 0 0 0 0 1 0 0 -169.2200 18.4200 169.5900 -16.1100 0.0000 0.0000 0.0000 0.0000; + 5010 5096 0.00127 0.00969 0.00509 310 0 0 0 0 1 0 0 -169.2200 18.4200 169.5900 -16.1100 0.0000 0.0000 0.0000 0.0000; + 5386 5010 0.00106 0.00803 0.00422 310 0 0 0 0 1 0 0 -102.1600 37.9200 102.2800 -37.3900 0.0000 0.0000 0.0000 0.0000; + 5386 5010 0.00106 0.00803 0.00422 310 0 0 0 0 1 0 0 -102.1600 37.9200 102.2800 -37.3900 0.0000 0.0000 0.0000 0.0000; + 5011 5054 0.00746 0.04371 0.02183 251 0 0 0 0 1 0 0 80.5700 8.5300 -80.0900 -7.8800 0.0000 0.0000 0.0000 0.0000; + 8084 5011 0.00545 0.03193 0.01595 251 0 0 0 0 1 0 0 88.6400 11.5600 -88.2200 -10.7000 0.0000 0.0000 0.0000 0.0000; + 5012 5017 0.00663 0.0292 0.01359 187 0 0 0 0 1 0 0 48.6600 -12.3800 -48.4900 11.7800 0.0000 0.0000 0.0000 0.0000; + 5013 5101 0.00798 0.03394 0.01697 187 0 0 0 0 1 0 0 64.2200 5.4700 -63.9100 -5.9200 0.0000 0.0000 0.0000 0.0000; + 5156 5013 0.00645 0.02841 0.01322 187 0 0 0 0 1 0 0 78.9100 -34.3200 -78.4600 34.9200 0.0000 0.0000 0.0000 0.0000; + 5013 5226 0.00745 0.03283 0.01528 187 0 0 0 0 1 0 0 -5.1000 1.7600 5.1000 -3.3700 0.0000 0.0000 0.0000 0.0000; + 5014 5455 0.00556 0.03257 0.01626 251 0 0 0 0 1 0 0 -60.5400 19.7600 60.7700 -20.0500 0.0000 0.0000 0.0000 0.0000; + 5016 5015 0.00015 0.01417 0 1206 0 0 1 0 1 0 0 -571.6200 20.2900 572.1100 25.7600 0.0000 0.0000 0.0000 0.0000; + 5016 5015 0.00015 0.01417 0 1206 0 0 1 0 1 0 0 -571.6200 20.2900 572.1100 25.7600 0.0000 0.0000 0.0000 0.0000; + 5063 5015 0.00028 0.00336 0.22327 2020 0 0 0 0 1 0 0 -307.0500 222.9800 307.4600 -240.7600 0.0000 0.0000 0.0000 0.0000; + 5015 5164 0.00044 0.00534 0.35461 2020 0 0 0 0 1 0 0 249.9100 -40.4200 -249.6400 7.9500 0.0000 0.0000 0.0000 0.0000; + 5361 5015 0.00044 0.0053 0.3546 4352 0 0 0 0 1 0 0 1817.5200 -115.8700 -1803.0200 254.7800 0.0000 0.0000 0.0000 0.0000; + 5015 5479 0.00057 0.00686 0.45585 2020 0 0 0 0 1 0 0 101.4300 -25.1200 -101.3700 -20.1700 0.0000 0.0000 0.0000 0.0000; + 5265 5016 0.00128 0.00972 0.00511 409 0 0 0 0 1 0 0 -214.9600 37.0400 215.5700 -32.9700 0.0000 0.0000 0.0000 0.0000; + 5265 5016 0.00128 0.00972 0.00511 409 0 0 0 0 1 0 0 -214.9600 37.0400 215.5700 -32.9700 0.0000 0.0000 0.0000 0.0000; + 5265 5016 0.00128 0.00972 0.00511 409 0 0 0 0 1 0 0 -214.9600 37.0400 215.5700 -32.9700 0.0000 0.0000 0.0000 0.0000; + 5420 5016 0.00135 0.01028 0.0054 310 0 0 0 0 1 0 0 -157.3500 -1.5000 157.6900 3.5000 0.0000 0.0000 0.0000 0.0000; + 5420 5016 0.00135 0.01028 0.0054 310 0 0 0 0 1 0 0 -157.3500 -1.5000 157.6900 3.5000 0.0000 0.0000 0.0000 0.0000; + 5218 5017 0.0048 0.02041 0.01021 187 0 0 0 0 1 0 0 38.7000 6.1500 -38.6300 -6.8500 0.0000 0.0000 0.0000 0.0000; + 5017 5315 0.00523 0.02225 0.01113 187 0 0 0 0 1 0 0 73.2600 -8.8500 -72.9800 8.9800 0.0000 0.0000 0.0000 0.0000; + 5019 5018 0.00058 0.02598 0 590 0 0 1 0 1 0 0 -118.7200 -3.2600 118.8000 6.9000 0.0000 0.0000 0.0000 0.0000; + 5020 5018 0.00032 0.03326 0 557 0 0 1 0 1 0 0 90.0000 -16.7700 -89.9700 19.5600 0.0000 0.0000 0.0000 0.0000; + 5055 5018 0.00034 0.00414 0.27523 2020 0 0 0 0 1 0 0 -641.8500 8.8700 643.2400 -19.7300 0.0000 0.0000 0.0000 0.0000; + 5018 5236 0.00037 0.00753 0.52503 3146 0 0 0 0 1 0 0 -690.8800 15.6700 692.6300 -33.1500 0.0000 0.0000 0.0000 0.0000; + 5018 5236 0.00037 0.00753 0.52503 3146 0 0 0 0 1 0 0 -690.8800 15.6700 692.6300 -33.1500 0.0000 0.0000 0.0000 0.0000; + 5018 5413 0.00034 0.00695 0.48479 2768 0 0 0 0 1 0 0 709.6800 -38.0700 -707.9900 23.6600 0.0000 0.0000 0.0000 0.0000; + 5019 5176 0.00561 0.03288 0.01642 251 0 0 0 0 1 0 0 118.7200 3.2600 -117.9400 -0.3000 0.0000 0.0000 0.0000 0.0000; + 5022 5021 0.0001 0.01005 0 1375 0 0 1 0 1 0 0 -645.1500 3.6300 645.5600 38.2500 0.0000 0.0000 0.0000 0.0000; + 5022 5021 0.0001 0.01005 0 1375 0 0 1 0 1 0 0 -645.1500 3.6300 645.5600 38.2500 0.0000 0.0000 0.0000 0.0000; + 5023 5021 0.00028 0.02693 0 245 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5021 5401 0.00029 0.006 0.41836 3146 0 0 0 0 1 0 0 -1080.0300 -51.5800 1083.4100 79.0900 0.0000 0.0000 0.0000 0.0000; + 5021 5413 0.00056 0.01139 0.79467 3146 0 0 0 0 1 0 0 -1214.7100 72.0100 1223.0100 16.8300 0.0000 0.0000 0.0000 0.0000; + 5479 5021 0.00021 0.00435 0.30317 2768 0 0 0 0 1 0 0 -1001.5000 110.3800 1003.6200 -96.9300 0.0000 0.0000 0.0000 0.0000; + 5249 5022 0.00173 0.01314 0.0069 409 0 0 0 0 1 0 0 -219.1400 -11.4700 219.9800 17.1900 0.0000 0.0000 0.0000 0.0000; + 5249 5022 0.00173 0.01314 0.0069 409 0 0 0 0 1 0 0 -219.1400 -11.4700 219.9800 17.1900 0.0000 0.0000 0.0000 0.0000; + 5306 5022 0.00263 0.02 0.0105 310 0 0 0 0 1 0 0 -113.0400 31.4200 113.4100 -29.7300 0.0000 0.0000 0.0000 0.0000; + 5306 5022 0.00263 0.02 0.0105 310 0 0 0 0 1 0 0 -113.0400 31.4200 113.4100 -29.7300 0.0000 0.0000 0.0000 0.0000; + 5022 5441 0.00341 0.02594 0.01362 409 0 0 0 0 1 0 0 241.6400 -10.9600 -239.6400 24.7900 0.0000 0.0000 0.0000 0.0000; + 5022 5441 0.00341 0.02594 0.01362 409 0 0 0 0 1 0 0 241.6400 -10.9600 -239.6400 24.7900 0.0000 0.0000 0.0000 0.0000; + 5140 5024 0.00381 0.01679 0.00781 187 0 0 0 0 1 0 0 -47.1200 0.2100 47.2000 -0.6300 0.0000 0.0000 0.0000 0.0000; + 5024 5182 0.003 0.01323 0.00616 187 0 0 0 0 1 0 0 14.9600 -7.2200 -14.9500 6.6400 0.0000 0.0000 0.0000 0.0000; + 5452 5024 0.00923 0.05217 0.02806 251 0 0 0 0 1 0 0 114.2500 10.3100 -113.0800 -6.5700 0.0000 0.0000 0.0000 0.0000; + 5453 5025 0.00495 0.03768 0.01978 310 0 0 0 0 1 0 0 -137.7900 22.8600 138.7600 -17.4100 0.0000 0.0000 0.0000 0.0000; + 5453 5025 0.00495 0.03768 0.01978 310 0 0 0 0 1 0 0 -137.7900 22.8600 138.7600 -17.4100 0.0000 0.0000 0.0000 0.0000; + 5025 5473 0.00322 0.02357 0.01336 325.5 0 0 0 0 1 0 0 -175.9900 6.8600 177.0000 -0.8200 0.0000 0.0000 0.0000 0.0000; + 5025 5473 0.00322 0.02357 0.01336 325.5 0 0 0 0 1 0 0 -175.9900 6.8600 177.0000 -0.8200 0.0000 0.0000 0.0000 0.0000; + 5026 5104 0.0014 0.01063 0.00558 310 0 0 0 0 1 0 0 -75.5400 17.1300 75.6300 -17.0300 0.0000 0.0000 0.0000 0.0000; + 5026 5104 0.0014 0.01063 0.00558 310 0 0 0 0 1 0 0 -75.5400 17.1300 75.6300 -17.0300 0.0000 0.0000 0.0000 0.0000; + 5026 5375 0.00136 0.00798 0.00399 251 0 0 0 0 1 0 0 79.9700 -54.4100 -79.8400 54.7800 0.0000 0.0000 0.0000 0.0000; + 5027 5098 0.00294 0.01659 0.00893 409 0 0 0 0 1 0 0 11.6900 -113.2300 -11.3100 114.4800 0.0000 0.0000 0.0000 0.0000; + 5027 5469 0.00157 0.01196 0.00628 310 0 0 0 0 1 0 0 45.0700 11.6200 -45.0400 -11.9800 0.0000 0.0000 0.0000 0.0000; + 5027 5469 0.00157 0.01196 0.00628 310 0 0 0 0 1 0 0 45.0700 11.6200 -45.0400 -11.9800 0.0000 0.0000 0.0000 0.0000; + 5027 5481 0.00206 0.01564 0.00821 409 0 0 0 0 1 0 0 -175.9600 68.9800 176.7100 -64.1300 0.0000 0.0000 0.0000 0.0000; + 5097 5028 0.00096 0.00703 0.00399 310 0 0 0 0 1 0 0 158.0000 -25.3100 -157.7500 26.7100 0.0000 0.0000 0.0000 0.0000; + 5097 5028 0.00096 0.00703 0.00399 310 0 0 0 0 1 0 0 158.0000 -25.3100 -157.7500 26.7100 0.0000 0.0000 0.0000 0.0000; + 5028 5233 0.00165 0.00966 0.00482 310 0 0 0 0 1 0 0 151.5200 -43.6300 -151.1100 45.5400 0.0000 0.0000 0.0000 0.0000; + 5028 5478 0.00394 0.01736 0.00808 409 0 0 0 0 1 0 0 154.6300 -12.4500 -153.6900 15.8200 0.0000 0.0000 0.0000 0.0000; + 5029 5142 0.00477 0.02699 0.01452 251 0 0 0 0 1 0 0 83.8100 -3.1500 -83.4700 3.5700 0.0000 0.0000 0.0000 0.0000; + 5461 5029 0.00376 0.02202 0.01099 251 0 0 0 0 1 0 0 96.9300 1.4000 -96.5800 -0.4700 0.0000 0.0000 0.0000 0.0000; + 5312 5030 0.00423 0.02478 0.01237 251 0 0 0 0 1 0 0 -27.7600 -14.0600 27.8000 13.0900 0.0000 0.0000 0.0000 0.0000; + 5030 5430 0.00326 0.0248 0.01302 310 0 0 0 0 1 0 0 -107.4100 -35.6400 107.8300 37.5500 0.0000 0.0000 0.0000 0.0000; + 5031 5296 0.00345 0.0202 0.01009 251 0 0 0 0 1 0 0 -82.1900 9.2500 82.4200 -8.9000 0.0000 0.0000 0.0000 0.0000; + 5408 5031 0.00513 0.02263 0.01054 187 0 0 0 0 1 0 0 -39.7300 20.6400 39.8300 -21.2600 0.0000 0.0000 0.0000 0.0000; + 5032 5090 0.00304 0.01718 0.00924 251 0 0 0 0 1 0 0 117.3100 -51.9600 -116.8100 53.9000 0.0000 0.0000 0.0000 0.0000; + 5214 5032 0.0022 0.00969 0.00451 187 0 0 0 0 1 0 0 -55.7200 1.5400 55.7900 -1.6800 0.0000 0.0000 0.0000 0.0000; + 5032 5228 0.0023 0.01751 0.00919 310 0 0 0 0 1 0 0 -153.2500 0.8400 153.8000 2.4100 0.0000 0.0000 0.0000 0.0000; + 5032 5228 0.0023 0.01751 0.00919 310 0 0 0 0 1 0 0 -153.2500 0.8400 153.8000 2.4100 0.0000 0.0000 0.0000 0.0000; + 5329 5032 0.00188 0.00829 0.00386 187 0 0 0 0 1 0 0 -86.0700 -38.2300 86.2400 38.6000 0.0000 0.0000 0.0000 0.0000; + 5034 5033 9e-05 0.00546 0 1209 0 0 1 0 1 0 0 -720.2600 -82.5100 720.7300 110.8600 0.0000 0.0000 0.0000 0.0000; + 5035 5033 0.00084 0.07958 0 243 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 5036 5033 0.00077 0.05006 0 255 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5037 5033 0.00015 0.01216 0 985 0 0 1 0 1 0 0 93.7500 67.4100 -93.7300 -65.8500 0.0000 0.0000 0.0000 0.0000; + 5038 5033 0.00013 0.01255 0 989 0 0 1 0 1 0 0 93.7500 65.5000 -93.7400 -63.9200 0.0000 0.0000 0.0000 0.0000; + 5039 5033 8e-05 0.00552 0 994 0 0 1 0 1 0 0 93.7500 148.7900 -93.7300 -147.1500 0.0000 0.0000 0.0000 0.0000; + 5040 5033 0.00031 0.01643 0 993 0 0 1 0 1 0 0 93.7500 49.2900 -93.7200 -47.5200 0.0000 0.0000 0.0000 0.0000; + 5041 5033 0.00021 0.01142 0 1001 0 0 1 0 1 0 0 93.7500 71.2200 -93.7200 -69.7000 0.0000 0.0000 0.0000 0.0000; + 5042 5033 0.00013 0.01345 0 988 0 0 1 0 1 0 0 93.7500 61.1900 -93.7400 -59.5700 0.0000 0.0000 0.0000 0.0000; + 5033 5047 0.0004 0.00814 0.5676 2768 0 0 0 0 1 0 0 -884.1700 84.7100 887.2700 -79.4700 0.0000 0.0000 0.0000 0.0000; + 5033 5350 0.00018 0.00367 0.25593 2768 0 0 0 0 1 0 0 166.2700 131.0100 -166.1900 -155.3300 0.0000 0.0000 0.0000 0.0000; + 5033 5384 6e-05 0.00115 0.08036 3146 0 0 0 0 1 0 0 559.5400 127.1400 -559.3500 -131.6500 0.0000 0.0000 0.0000 0.0000; + 5034 5313 0.00114 0.00836 0.00474 409 0 0 0 0 1 0 0 182.4600 20.2700 -182.0800 -17.9600 0.0000 0.0000 0.0000 0.0000; + 5034 5313 0.00114 0.00836 0.00474 409 0 0 0 0 1 0 0 182.4600 20.2700 -182.0800 -17.9600 0.0000 0.0000 0.0000 0.0000; + 5034 5313 0.00114 0.00836 0.00474 409 0 0 0 0 1 0 0 182.4600 20.2700 -182.0800 -17.9600 0.0000 0.0000 0.0000 0.0000; + 5371 5034 0.0033 0.01934 0.00966 251 0 0 0 0 1 0 0 -117.0900 -4.3400 117.5400 6.0200 0.0000 0.0000 0.0000 0.0000; + 5043 5152 0.00598 0.03504 0.0175 251 0 0 0 0 1 0 0 5.6200 -17.2500 -5.6000 15.6500 0.0000 0.0000 0.0000 0.0000; + 5043 5284 0.00758 0.04445 0.0222 251 0 0 0 0 1 0 0 -73.7200 -2.0400 74.1400 2.3400 0.0000 0.0000 0.0000 0.0000; + 5044 5153 0.0031 0.0236 0.01239 409 0 0 0 0 1 0 0 -187.6900 26.6400 188.8100 -19.3600 0.0000 0.0000 0.0000 0.0000; + 5044 5153 0.0031 0.0236 0.01239 409 0 0 0 0 1 0 0 -187.6900 26.6400 188.8100 -19.3600 0.0000 0.0000 0.0000 0.0000; + 5185 5044 0.0032 0.02431 0.01276 325.5 0 0 0 0 1 0 0 -177.8900 35.8500 178.9400 -29.1200 0.0000 0.0000 0.0000 0.0000; + 5185 5044 0.0032 0.02431 0.01276 325.5 0 0 0 0 1 0 0 -177.8900 35.8500 178.9400 -29.1200 0.0000 0.0000 0.0000 0.0000; + 5046 5045 0.00031 0.02114 0 550 0 0 1 0 1 0 0 -171.4000 -4.7500 171.4900 10.8400 0.0000 0.0000 0.0000 0.0000; + 5045 5120 0.00127 0.01539 1.02213 2020 0 0 0 0 1 0 0 -262.6600 -119.6500 263.5700 24.4600 0.0000 0.0000 0.0000 0.0000; + 5260 5045 0.0005 0.00603 0.40075 2295 0 0 0 0 1 0 0 -1415.1000 100.9000 1425.0100 -22.3400 0.0000 0.0000 0.0000 0.0000; + 5413 5045 0.00055 0.00672 0.4467 2020 0 0 0 0 1 0 0 -662.9400 -56.2500 665.3400 40.0700 0.0000 0.0000 0.0000 0.0000; + 5286 5046 0.0115 0.05069 0.0236 187 0 0 0 0 1 0 0 -93.2600 19.2300 94.2900 -17.1000 0.0000 0.0000 0.0000 0.0000; + 5048 5047 0.00013 0.01253 0 1354 0 0 1 0 1 0 0 -607.6800 -61.8000 608.1600 108.8000 0.0000 0.0000 0.0000 0.0000; + 5047 5179 0.00054 0.01097 0.76512 2768 0 0 0 0 1 0 0 -357.8100 -88.7800 358.5100 24.3600 0.0000 0.0000 0.0000 0.0000; + 5047 5260 0.00078 0.00944 0.62704 2295 0 0 0 0 1 0 0 -1123.8200 118.9900 1133.6800 -63.5400 0.0000 0.0000 0.0000 0.0000; + 5047 5444 0.00019 0.00235 0.15601 2020 0 0 0 0 1 0 0 -13.8000 -59.5400 13.8100 43.7100 0.0000 0.0000 0.0000 0.0000; + 5480 5048 0.00268 0.02037 0.0107 310 0 0 0 0 1 0 0 -105.4800 -1.1500 105.7800 2.3800 0.0000 0.0000 0.0000 0.0000; + 5480 5048 0.00268 0.02037 0.0107 310 0 0 0 0 1 0 0 -105.4800 -1.1500 105.7800 2.3800 0.0000 0.0000 0.0000 0.0000; + 5480 5048 0.00268 0.02037 0.0107 310 0 0 0 0 1 0 0 -105.4800 -1.1500 105.7800 2.3800 0.0000 0.0000 0.0000 0.0000; + 5480 5048 0.00268 0.02037 0.0107 310 0 0 0 0 1 0 0 -105.4800 -1.1500 105.7800 2.3800 0.0000 0.0000 0.0000 0.0000; + 5050 5049 0.0003 0.025 0 500 0 0 1 0 1 0 0 -315.2200 1.9700 315.5100 22.6800 0.0000 0.0000 0.0000 0.0000; + 5051 5049 0.00024 0.01633 0 409 0 0 1 0 1 0 0 84.4700 43.1100 -84.4500 -41.6800 0.0000 0.0000 0.0000 0.0000; + 5052 5049 0.00067 0.0499 0 308 0 0 1 0 1 0 0 -112.3300 2.4900 112.4200 3.7300 0.0000 0.0000 0.0000 0.0000; + 5049 5304 0.00059 0.00713 0.47354 2295 0 0 0 0 1 0 0 856.8400 -101.5700 -852.5400 105.4100 0.0000 0.0000 0.0000 0.0000; + 5049 5350 0.0007 0.0085 0.5646 2295 0 0 0 0 1 0 0 899.1600 -56.8400 -893.5700 67.3900 0.0000 0.0000 0.0000 0.0000; + 5049 8074 0.00142 0.02903 2.02497 2768 0 0 0 0 1 0 0 -540.1400 -110.5500 544.2200 -15.9400 0.0000 0.0000 0.0000 0.0000; + 8126 5049 0.006 0.01 0.83 3146 0 0 0 0 1 0 0 1006.9900 -324.3100 -945.4800 340.4800 0.0000 0.0000 0.0000 0.0000; + 5454 5050 0.00279 0.02125 0.01116 310 0 0 0 0 1 0 0 -124.8700 12.3400 125.3100 -10.1400 0.0000 0.0000 0.0000 0.0000; + 5454 5050 0.00279 0.02125 0.01116 310 0 0 0 0 1 0 0 -124.8700 12.3400 125.3100 -10.1400 0.0000 0.0000 0.0000 0.0000; + 5052 8038 0.013 0.054 0.027 186 0 0 0 0 1 0 0 44.6900 9.2300 -44.4200 -10.8100 0.0000 0.0000 0.0000 0.0000; + 5052 8124 0.013 0.054 0.027 186 0 0 0 0 1 0 0 67.6400 -11.7200 -67.0400 11.4900 0.0000 0.0000 0.0000 0.0000; + 5173 5053 0.00088 0.00647 0.00367 310 0 0 0 0 1 0 0 -52.8100 8.5500 52.8400 -8.7300 0.0000 0.0000 0.0000 0.0000; + 5173 5053 0.00088 0.00647 0.00367 310 0 0 0 0 1 0 0 -52.8100 8.5500 52.8400 -8.7300 0.0000 0.0000 0.0000 0.0000; + 5053 5357 0.00118 0.00895 0.0047 310 0 0 0 0 1 0 0 -129.2300 -12.9200 129.4300 13.9900 0.0000 0.0000 0.0000 0.0000; + 5053 5357 0.00118 0.00895 0.0047 310 0 0 0 0 1 0 0 -129.2300 -12.9200 129.4300 13.9900 0.0000 0.0000 0.0000 0.0000; + 5054 5223 0.00543 0.03069 0.01651 251 0 0 0 0 1 0 0 58.9200 1.8800 -58.7300 -2.4400 0.0000 0.0000 0.0000 0.0000; + 5056 5055 0.00023 0.01209 0 913 0 0 1 0 1 0 0 -124.0800 -7.7300 124.1100 9.5900 0.0000 0.0000 0.0000 0.0000; + 5057 5055 0.00023 0.01324 0 1036 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5058 5055 0.00031 0.01928 0 1023 0 0 1 0 1 0 0 251.1800 -19.5000 -250.9800 31.7400 0.0000 0.0000 0.0000 0.0000; + 5055 5196 0.00034 0.0041 0.275 2020 0 0 0 0 1 0 0 768.7200 -50.1900 -766.7300 46.5600 0.0000 0.0000 0.0000 0.0000; + 5187 5056 0.01355 0.05765 0.02883 187 0 0 0 0 1 0 0 20.6600 -13.6600 -20.5800 11.1000 0.0000 0.0000 0.0000 0.0000; + 5197 5056 0.0075 0.04397 0.02196 263.55 0 0 0 0 1 0 0 -103.4300 17.4400 104.2500 -14.8200 0.0000 0.0000 0.0000 0.0000; + 5060 5059 0.00378 0.07811 0 151 0 0 1 0 1 0 0 -51.8100 9.8800 51.9100 -7.7300 0.0000 0.0000 0.0000 0.0000; + 5059 5426 0.00507 0.02868 0.01543 251 0 0 0 0 1 0 0 67.3600 14.4900 -67.1100 -14.6500 0.0000 0.0000 0.0000 0.0000; + 8148 5059 0.00396 0.03012 0.01581 310 0 0 0 0 1 0 0 119.8300 9.4600 -119.2700 -6.7600 0.0000 0.0000 0.0000 0.0000; + 5061 5060 0.00305 0.13464 0 200 0 0 1 0 1 0 0 -43.8800 21.5200 43.9500 -18.4900 0.0000 0.0000 0.0000 0.0000; + 5060 8065 0.00719 0.04106 0.00617 98 0 0 0 0 1 0 0 7.8500 8.6100 -7.8400 -9.1700 0.0000 0.0000 0.0000 0.0000; + 5062 5061 0.00697 0.17819 0 100 0 0 1 0 1 0 0 -43.7400 -12.3900 43.8800 16.0600 0.0000 0.0000 0.0000 0.0000; + 5064 5063 0.00013 0.00901 0 1277 0 0 1 0 1 0 0 -824.7700 -49.2000 825.6500 110.3100 0.0000 0.0000 0.0000 0.0000; + 5064 5063 0.00013 0.00901 0 1277 0 0 1 0 1 0 0 -824.7700 -49.2000 825.6500 110.3100 0.0000 0.0000 0.0000 0.0000; + 5065 5063 0.00025 0.01754 0 290 0 0 1 0 1 0 0 10.5700 5.4000 -10.5700 -5.3800 0.0000 0.0000 0.0000 0.0000; + 5066 5063 0.00142 0.09165 0 213 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 5067 5063 0.00011 0.01076 0 1078 0 0 1 0 1 0 0 437.0700 182.7000 -436.8400 -159.9400 0.0000 0.0000 0.0000 0.0000; + 5068 5063 0.00017 0.0113 0 1073 0 0 1 0 1 0 0 437.0700 172.5700 -436.7200 -149.0500 0.0000 0.0000 0.0000 0.0000; + 5069 5063 0.00021 0.01202 0 1079 0 0 1 0 1 0 0 437.0700 162.0400 -436.6400 -137.4200 0.0000 0.0000 0.0000 0.0000; + 5063 5304 0.00078 0.0095 0.6308 2020 0 0 0 0 1 0 0 236.4100 -30.1400 -235.9800 -29.0900 0.0000 0.0000 0.0000 0.0000; + 5322 5063 0.00026 0.00314 0.20858 2295 0 0 0 0 1 0 0 -849.1700 69.9400 851.0200 -68.9500 0.0000 0.0000 0.0000 0.0000; + 5063 5401 0.0005 0.01016 0.70838 3146 0 0 0 0 1 0 0 -1110.9200 107.2700 1117.0600 -54.9500 0.0000 0.0000 0.0000 0.0000; + 5064 5125 0.00095 0.00721 0.00379 409 0 0 0 0 1 0 0 231.5100 5.2000 -231.0000 -1.7400 0.0000 0.0000 0.0000 0.0000; + 5064 5125 0.00095 0.00721 0.00379 409 0 0 0 0 1 0 0 231.5100 5.2000 -231.0000 -1.7400 0.0000 0.0000 0.0000 0.0000; + 5064 5125 0.00095 0.00721 0.00379 409 0 0 0 0 1 0 0 231.5100 5.2000 -231.0000 -1.7400 0.0000 0.0000 0.0000 0.0000; + 5064 5125 0.00095 0.00721 0.00379 409 0 0 0 0 1 0 0 231.5100 5.2000 -231.0000 -1.7400 0.0000 0.0000 0.0000 0.0000; + 5143 5064 0.00084 0.00642 0.00337 409 0 0 0 0 1 0 0 -215.0900 -15.9500 215.4800 18.6000 0.0000 0.0000 0.0000 0.0000; + 5143 5064 0.00084 0.00642 0.00337 409 0 0 0 0 1 0 0 -215.0900 -15.9500 215.4800 18.6000 0.0000 0.0000 0.0000 0.0000; + 5143 5064 0.00084 0.00642 0.00337 409 0 0 0 0 1 0 0 -215.0900 -15.9500 215.4800 18.6000 0.0000 0.0000 0.0000 0.0000; + 5070 5128 0.00204 0.00902 0.0042 187 0 0 0 0 1 0 0 51.3300 -18.4500 -51.2700 18.3100 0.0000 0.0000 0.0000 0.0000; + 5425 5070 0.00111 0.00651 0.00325 251 0 0 0 0 1 0 0 126.1600 3.4300 -125.9800 -2.7000 0.0000 0.0000 0.0000 0.0000; + 5138 5071 0.0037 0.02168 0.01083 251 0 0 0 0 1 0 0 -51.0800 24.8700 51.2000 -25.3000 0.0000 0.0000 0.0000 0.0000; + 5071 5359 0.00459 0.03488 0.01831 310 0 0 0 0 1 0 0 -125.3100 4.3000 126.0100 -0.8200 0.0000 0.0000 0.0000 0.0000; + 5103 5072 0.00114 0.00868 0.00456 310 0 0 0 0 1 0 0 170.2600 -11.1200 -169.9300 13.2000 0.0000 0.0000 0.0000 0.0000; + 5103 5072 0.00114 0.00868 0.00456 310 0 0 0 0 1 0 0 170.2600 -11.1200 -169.9300 13.2000 0.0000 0.0000 0.0000 0.0000; + 5103 5072 0.00114 0.00868 0.00456 310 0 0 0 0 1 0 0 170.2600 -11.1200 -169.9300 13.2000 0.0000 0.0000 0.0000 0.0000; + 5103 5072 0.00114 0.00868 0.00456 310 0 0 0 0 1 0 0 170.2600 -11.1200 -169.9300 13.2000 0.0000 0.0000 0.0000 0.0000; + 5103 5072 0.00114 0.00868 0.00456 310 0 0 0 0 1 0 0 170.2600 -11.1200 -169.9300 13.2000 0.0000 0.0000 0.0000 0.0000; + 5116 5072 0.00108 0.0079 0.00448 310 0 0 0 0 1 0 0 -136.0500 6.3700 136.2500 -5.3400 0.0000 0.0000 0.0000 0.0000; + 5116 5072 0.00108 0.0079 0.00448 310 0 0 0 0 1 0 0 -136.0500 6.3700 136.2500 -5.3400 0.0000 0.0000 0.0000 0.0000; + 5121 5073 0.00516 0.02272 0.01058 187 0 0 0 0 1 0 0 -52.1900 17.0600 52.3400 -17.5100 0.0000 0.0000 0.0000 0.0000; + 5484 5073 0.0111 0.06505 0.03248 251 0 0 0 0 1 0 0 61.6000 -15.8800 -61.1700 15.0000 0.0000 0.0000 0.0000 0.0000; + 5074 5147 0.0043 0.03272 0.01718 310 0 0 0 0 1 0 0 69.8800 14.6200 -69.6600 -14.6400 0.0000 0.0000 0.0000 0.0000; + 5074 5331 0.00369 0.02161 0.01079 251 0 0 0 0 1 0 0 -72.6000 30.1500 72.8300 -29.8800 0.0000 0.0000 0.0000 0.0000; + 5075 5267 0.02194 0.09333 0.04668 187 0 0 0 0 1 0 0 8.2200 -0.9500 -8.2000 -3.6900 0.0000 0.0000 0.0000 0.0000; + 5075 5377 0.02449 0.10791 0.05023 187 0 0 0 0 1 0 0 -12.1800 -0.1700 12.2200 -4.7500 0.0000 0.0000 0.0000 0.0000; + 5077 5076 0.0015 0.06519 0 260 0 0 1 0 1 0 0 -25.6400 37.1500 25.6700 -35.8900 0.0000 0.0000 0.0000 0.0000; + 5227 5076 0.00533 0.02268 0.01134 187 0 0 0 0 1 0 0 25.7800 -36.5900 -25.6700 35.8900 0.0000 0.0000 0.0000 0.0000; + 8108 5077 0.00971 0.05831 0.00791 98 0 0 0 0 1 0 0 -6.9600 -44.0600 7.1500 44.3700 0.0000 0.0000 0.0000 0.0000; + 5160 5078 0.00399 0.01757 0.00818 187 0 0 0 0 1 0 0 81.4300 5.0000 -81.1700 -4.6300 0.0000 0.0000 0.0000 0.0000; + 5079 5138 0.00181 0.01379 0.00724 310 0 0 0 0 1 0 0 -100.0800 17.4400 100.2600 -16.8000 0.0000 0.0000 0.0000 0.0000; + 5079 5138 0.00181 0.01379 0.00724 310 0 0 0 0 1 0 0 -100.0800 17.4400 100.2600 -16.8000 0.0000 0.0000 0.0000 0.0000; + 5378 5079 0.00152 0.00891 0.00445 409 0 0 0 0 1 0 0 -161.5500 47.6800 161.9600 -45.7000 0.0000 0.0000 0.0000 0.0000; + 5142 5080 0.00553 0.03127 0.01682 251 0 0 0 0 1 0 0 60.2100 -0.9000 -60.0100 0.3500 0.0000 0.0000 0.0000 0.0000; + 5080 5328 0.00866 0.03817 0.01777 187 0 0 0 0 1 0 0 22.3900 -11.0100 -22.3400 9.4700 0.0000 0.0000 0.0000 0.0000; + 5081 5163 0.00516 0.03024 0.0151 251 0 0 0 0 1 0 0 -101.5900 -9.0800 102.1200 10.6600 0.0000 0.0000 0.0000 0.0000; + 5221 5081 0.00517 0.0228 0.01061 187 0 0 0 0 1 0 0 0.8800 6.7600 -0.8800 -7.8200 0.0000 0.0000 0.0000 0.0000; + 5081 5377 0.0068 0.039 0.005 221 0 0 0 0 1 0 0 12.6400 -8.5600 -12.6200 8.1400 0.0000 0.0000 0.0000 0.0000; + 5082 5086 0.00219 0.01283 0.00641 251 0 0 0 0 1 0 0 -47.5600 53.8100 47.6700 -53.7700 0.0000 0.0000 0.0000 0.0000; + 5082 5330 0.00214 0.01253 0.00625 409 0 0 0 0 1 0 0 -200.1200 22.1500 201.0000 -17.6500 0.0000 0.0000 0.0000 0.0000; + 5082 5440 0.00107 0.00605 0.00326 409 0 0 0 0 1 0 0 145.4600 -104.9200 -145.1200 106.5500 0.0000 0.0000 0.0000 0.0000; + 5084 5083 0.00024 0.01146 0 1295 0 0 1 0 1 0 0 -657.7000 -85.8700 658.7700 136.6600 0.0000 0.0000 0.0000 0.0000; + 5083 5295 7e-05 0.00134 0.09371 2768 0 0 0 0 1 0 0 -701.2000 -163.9100 701.5500 161.1000 0.0000 0.0000 0.0000 0.0000; + 5083 5322 0.0007 0.00853 0.56646 2020 0 0 0 0 1 0 0 2.6100 -38.8300 -2.6100 -19.0600 0.0000 0.0000 0.0000 0.0000; + 5083 5464 0.0002 0.00237 0.15714 2020 0 0 0 0 1 0 0 288.4200 92.7300 -288.2400 -106.5600 0.0000 0.0000 0.0000 0.0000; + 5357 5084 0.00149 0.01134 0.00596 310 0 0 0 0 1 0 0 -144.1900 -5.6500 144.5000 7.4500 0.0000 0.0000 0.0000 0.0000; + 5357 5084 0.00149 0.01134 0.00596 310 0 0 0 0 1 0 0 -144.1900 -5.6500 144.5000 7.4500 0.0000 0.0000 0.0000 0.0000; + 5357 5084 0.00149 0.01134 0.00596 310 0 0 0 0 1 0 0 -144.1900 -5.6500 144.5000 7.4500 0.0000 0.0000 0.0000 0.0000; + 5157 5085 0.00229 0.01293 0.00695 251 0 0 0 0 1 0 0 37.6100 -28.3900 -37.5600 28.0100 0.0000 0.0000 0.0000 0.0000; + 5085 5468 0.00181 0.00797 0.00371 187 0 0 0 0 1 0 0 -13.7500 -42.5400 13.7800 42.3400 0.0000 0.0000 0.0000 0.0000; + 5086 5177 0.00288 0.01629 0.00876 251 0 0 0 0 1 0 0 -23.2600 11.5200 23.2800 -12.2700 0.0000 0.0000 0.0000 0.0000; + 5086 5210 0.00527 0.02323 0.01081 187 0 0 0 0 1 0 0 -38.1200 -20.5600 38.2200 19.9300 0.0000 0.0000 0.0000 0.0000; + 5086 5447 0.00451 0.01917 0.00959 187 0 0 0 0 1 0 0 -78.3300 36.7300 78.6800 -36.2000 0.0000 0.0000 0.0000 0.0000; + 5257 5087 0.00596 0.02626 0.01222 187 0 0 0 0 1 0 0 -35.2200 5.0200 35.3000 -5.8900 0.0000 0.0000 0.0000 0.0000; + 5087 5345 0.00569 0.03217 0.01731 251 0 0 0 0 1 0 0 -79.2900 15.8800 79.6700 -15.4400 0.0000 0.0000 0.0000 0.0000; + 5087 5348 0.0048 0.02814 0.01405 251 0 0 0 0 1 0 0 39.8600 -11.1700 -39.7700 10.2700 0.0000 0.0000 0.0000 0.0000; + 5089 5088 0.00382 0.09418 0 150 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5088 5290 0.00328 0.01851 0.00996 251 0 0 0 0 1 0 0 70.2500 0.3400 -70.0900 -0.4100 0.0000 0.0000 0.0000 0.0000; + 5088 5393 0.00614 0.03602 0.01799 251 0 0 0 0 1 0 0 -70.2500 -0.3400 70.5600 0.3100 0.0000 0.0000 0.0000 0.0000; + 5090 5122 0.00277 0.0122 0.00568 187 0 0 0 0 1 0 0 -26.0800 39.6400 26.1400 -39.9300 0.0000 0.0000 0.0000 0.0000; + 5090 5230 0.00189 0.00834 0.00388 187 0 0 0 0 1 0 0 -59.8900 34.5800 59.9800 -34.5600 0.0000 0.0000 0.0000 0.0000; + 5090 5311 0.00167 0.0098 0.00489 251 0 0 0 0 1 0 0 94.0300 15.9800 -93.8800 -15.5700 0.0000 0.0000 0.0000 0.0000; + 5171 5091 0.00311 0.01823 0.0091 251 0 0 0 0 1 0 0 72.6400 -7.3800 -72.4700 7.4700 0.0000 0.0000 0.0000 0.0000; + 5091 5257 0.00494 0.02894 0.01445 251 0 0 0 0 1 0 0 67.1400 -8.9800 -66.9100 8.9000 0.0000 0.0000 0.0000 0.0000; + 5092 5186 0.00539 0.03162 0.01579 251 0 0 0 0 1 0 0 -16.1800 6.3900 16.1900 -7.8500 0.0000 0.0000 0.0000 0.0000; + 5453 5092 0.00849 0.03611 0.01806 187 0 0 0 0 1 0 0 72.4000 -9.1600 -71.9500 9.3000 0.0000 0.0000 0.0000 0.0000; + 5475 5092 0.00472 0.02665 0.01434 251 0 0 0 0 1 0 0 -70.2400 20.7100 70.5000 -20.6800 0.0000 0.0000 0.0000 0.0000; + 5093 5291 0.00299 0.01754 0.00876 251 0 0 0 0 1 0 0 54.1400 75.5800 -53.8800 -74.9500 0.0000 0.0000 0.0000 0.0000; + 5332 5093 0.00371 0.02175 0.01086 251 0 0 0 0 1 0 0 -108.3200 -44.6800 108.8300 46.6000 0.0000 0.0000 0.0000 0.0000; + 5093 5434 0.0015 0.01141 0.00599 310 0 0 0 0 1 0 0 -105.4800 41.3400 105.6700 -40.5000 0.0000 0.0000 0.0000 0.0000; + 5093 5434 0.0015 0.01141 0.00599 310 0 0 0 0 1 0 0 -105.4800 41.3400 105.6700 -40.5000 0.0000 0.0000 0.0000 0.0000; + 5094 5381 0.00329 0.025 0.01312 310 0 0 0 0 1 0 0 79.4600 -3.8100 -79.2500 4.0300 0.0000 0.0000 0.0000 0.0000; + 5485 5094 0.00237 0.01799 0.00945 310 0 0 0 0 1 0 0 82.2800 -2.8300 -82.1200 3.0600 0.0000 0.0000 0.0000 0.0000; + 5277 5095 0.0038 0.01676 0.0078 187 0 0 0 0 1 0 0 -8.4800 -58.2000 8.6100 57.9900 0.0000 0.0000 0.0000 0.0000; + 5341 5095 0.00257 0.01134 0.00528 187 0 0 0 0 1 0 0 41.0100 67.2800 -40.8500 -67.1300 0.0000 0.0000 0.0000 0.0000; + 5305 5096 0.00176 0.01289 0.0073 310 0 0 0 0 1 0 0 161.7900 -0.3400 -161.3300 2.9800 0.0000 0.0000 0.0000 0.0000; + 5305 5096 0.00176 0.01289 0.0073 310 0 0 0 0 1 0 0 161.7900 -0.3400 -161.3300 2.9800 0.0000 0.0000 0.0000 0.0000; + 5305 5096 0.00176 0.01289 0.0073 310 0 0 0 0 1 0 0 161.7900 -0.3400 -161.3300 2.9800 0.0000 0.0000 0.0000 0.0000; + 5096 5412 0.00234 0.01373 0.00686 251 0 0 0 0 1 0 0 83.0800 5.7900 -82.9100 -5.5100 0.0000 0.0000 0.0000 0.0000; + 5097 5125 0.00078 0.00569 0.00322 409 0 0 0 0 1 0 0 -199.2800 13.6200 199.5900 -11.6700 0.0000 0.0000 0.0000 0.0000; + 5097 5125 0.00078 0.00569 0.00322 409 0 0 0 0 1 0 0 -199.2800 13.6200 199.5900 -11.6700 0.0000 0.0000 0.0000 0.0000; + 5098 5453 0.00529 0.04026 0.02114 310 0 0 0 0 1 0 0 -134.1200 62.2900 135.2600 -55.8000 0.0000 0.0000 0.0000 0.0000; + 5098 5475 0.01191 0.05066 0.02533 187 0 0 0 0 1 0 0 -10.7900 35.6800 10.9700 -37.5100 0.0000 0.0000 0.0000 0.0000; + 5099 5195 0.00308 0.0174 0.00936 409 0 0 0 0 1 0 0 -142.3500 143.9500 143.5500 -138.1500 0.0000 0.0000 0.0000 0.0000; + 5099 5339 0.00266 0.01561 0.00779 409 0 0 0 0 1 0 0 74.7100 48.4600 -74.5100 -48.1000 0.0000 0.0000 0.0000 0.0000; + 5229 5100 0.00057 0.00414 0.00235 310 0 0 0 0 1 0 0 -119.9700 -19.6800 120.0500 20.0600 0.0000 0.0000 0.0000 0.0000; + 5229 5100 0.00057 0.00414 0.00235 310 0 0 0 0 1 0 0 -119.9700 -19.6800 120.0500 20.0600 0.0000 0.0000 0.0000 0.0000; + 5250 5100 0.00124 0.0091 0.00516 409 0 0 0 0 1 0 0 198.1300 6.3300 -197.6400 -3.2800 0.0000 0.0000 0.0000 0.0000; + 5250 5100 0.00124 0.0091 0.00516 409 0 0 0 0 1 0 0 198.1300 6.3300 -197.6400 -3.2800 0.0000 0.0000 0.0000 0.0000; + 5250 5100 0.00124 0.0091 0.00516 409 0 0 0 0 1 0 0 198.1300 6.3300 -197.6400 -3.2800 0.0000 0.0000 0.0000 0.0000; + 5100 5352 0.00056 0.00426 0.00224 310 0 0 0 0 1 0 0 165.1800 -18.3200 -165.0300 19.2800 0.0000 0.0000 0.0000 0.0000; + 5100 5352 0.00056 0.00426 0.00224 310 0 0 0 0 1 0 0 165.1800 -18.3200 -165.0300 19.2800 0.0000 0.0000 0.0000 0.0000; + 5231 5101 0.01968 0.08674 0.04038 187 0 0 0 0 1 0 0 -40.9500 -2.2900 41.2700 -0.4900 0.0000 0.0000 0.0000 0.0000; + 5103 5102 0.00026 0.0114 0 1345 0 0 1 0 1 0 0 -656.1200 -39.9800 657.2500 89.5300 0.0000 0.0000 0.0000 0.0000; + 5103 5102 0.00026 0.0114 0 1345 0 0 1 0 1 0 0 -656.1200 -39.9800 657.2500 89.5300 0.0000 0.0000 0.0000 0.0000; + 5102 5304 0.00023 0.00277 0.18414 2295 0 0 0 0 1 0 0 -817.0000 -62.7200 818.5300 62.3600 0.0000 0.0000 0.0000 0.0000; + 5384 5102 0.00039 0.0047 0.31216 2020 0 0 0 0 1 0 0 148.2400 57.7200 -148.1400 -88.1800 0.0000 0.0000 0.0000 0.0000; + 5464 5102 0.00028 0.00339 0.22498 2020 0 0 0 0 1 0 0 349.7000 9.4500 -349.3700 -28.1600 0.0000 0.0000 0.0000 0.0000; + 5103 5130 0.00117 0.00856 0.00485 310 0 0 0 0 1 0 0 113.2100 34.5500 -113.0500 -33.8200 0.0000 0.0000 0.0000 0.0000; + 5103 5130 0.00117 0.00856 0.00485 310 0 0 0 0 1 0 0 113.2100 34.5500 -113.0500 -33.8200 0.0000 0.0000 0.0000 0.0000; + 5104 5199 0.00503 0.02843 0.01529 251 0 0 0 0 1 0 0 67.9300 -23.7500 -67.6700 23.7400 0.0000 0.0000 0.0000 0.0000; + 5447 5104 0.00135 0.01026 0.00539 310 0 0 0 0 1 0 0 -175.0300 -6.8600 175.4600 9.5600 0.0000 0.0000 0.0000 0.0000; + 5447 5104 0.00135 0.01026 0.00539 310 0 0 0 0 1 0 0 -175.0300 -6.8600 175.4600 9.5600 0.0000 0.0000 0.0000 0.0000; + 5104 5480 0.00236 0.01795 0.00942 310 0 0 0 0 1 0 0 -162.2800 4.0800 162.9100 -0.1800 0.0000 0.0000 0.0000 0.0000; + 5104 5480 0.00236 0.01795 0.00942 310 0 0 0 0 1 0 0 -162.2800 4.0800 162.9100 -0.1800 0.0000 0.0000 0.0000 0.0000; + 5104 5480 0.00236 0.01795 0.00942 310 0 0 0 0 1 0 0 -162.2800 4.0800 162.9100 -0.1800 0.0000 0.0000 0.0000 0.0000; + 5104 5480 0.00236 0.01795 0.00942 310 0 0 0 0 1 0 0 -162.2800 4.0800 162.9100 -0.1800 0.0000 0.0000 0.0000 0.0000; + 5106 5105 0.00709 0.19751 0 82 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5107 5105 0.00966 0.19527 0 75 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5105 5148 0.00212 0.009 0.0045 187 0 0 0 0 1 0 0 41.7400 50.7100 -41.6500 -50.7700 0.0000 0.0000 0.0000 0.0000; + 5105 5253 0.00604 0.02664 0.0124 187 0 0 0 0 1 0 0 -92.5000 43.6700 93.1300 -42.0800 0.0000 0.0000 0.0000 0.0000; + 5105 5422 0.00354 0.02074 0.01036 251 0 0 0 0 1 0 0 -54.5100 -124.2100 55.1600 126.9500 0.0000 0.0000 0.0000 0.0000; + 5108 5266 0.00144 0.01098 0.00577 310 0 0 0 0 1 0 0 129.1500 60.8700 -128.8600 -59.2700 0.0000 0.0000 0.0000 0.0000; + 5108 5266 0.00144 0.01098 0.00577 310 0 0 0 0 1 0 0 129.1500 60.8700 -128.8600 -59.2700 0.0000 0.0000 0.0000 0.0000; + 5108 5353 0.00106 0.00809 0.00425 310 0 0 0 0 1 0 0 92.9800 91.4200 -92.8100 -90.5100 0.0000 0.0000 0.0000 0.0000; + 5108 5353 0.00106 0.00809 0.00425 310 0 0 0 0 1 0 0 92.9800 91.4200 -92.8100 -90.5100 0.0000 0.0000 0.0000 0.0000; + 5449 5108 0.0015 0.01102 0.00625 310 0 0 0 0 1 0 0 161.8700 -41.8200 -161.4600 44.1900 0.0000 0.0000 0.0000 0.0000; + 5449 5108 0.0015 0.01102 0.00625 310 0 0 0 0 1 0 0 161.8700 -41.8200 -161.4600 44.1900 0.0000 0.0000 0.0000 0.0000; + 5449 5108 0.0015 0.01102 0.00625 310 0 0 0 0 1 0 0 161.8700 -41.8200 -161.4600 44.1900 0.0000 0.0000 0.0000 0.0000; + 5274 5109 0.00268 0.01516 0.00815 251 0 0 0 0 1 0 0 9.5900 35.6800 -9.5500 -36.2600 0.0000 0.0000 0.0000 0.0000; + 5109 5333 0.00213 0.01247 0.00623 251 0 0 0 0 1 0 0 -44.4300 20.9700 44.4800 -21.2600 0.0000 0.0000 0.0000 0.0000; + 5176 5110 0.00503 0.02841 0.01528 251 0 0 0 0 1 0 0 110.6400 -1.7700 -110.0200 3.7600 0.0000 0.0000 0.0000 0.0000; + 5110 5200 0.0045 0.02638 0.01317 251 0 0 0 0 1 0 0 106.5700 -4.7400 -106.0500 6.5000 0.0000 0.0000 0.0000 0.0000; + 5203 5111 0.00135 0.00792 0.00396 251 0 0 0 0 1 0 0 -0.2800 -64.3900 0.3400 64.3300 0.0000 0.0000 0.0000 0.0000; + 5111 5289 0.00089 0.00652 0.0037 310 0 0 0 0 1 0 0 -60.5700 -20.6700 60.6100 20.5700 0.0000 0.0000 0.0000 0.0000; + 5111 5289 0.00089 0.00652 0.0037 310 0 0 0 0 1 0 0 -60.5700 -20.6700 60.6100 20.5700 0.0000 0.0000 0.0000 0.0000; + 5111 5372 0.00119 0.007 0.0035 251 0 0 0 0 1 0 0 83.5600 -33.5500 -83.4600 33.7700 0.0000 0.0000 0.0000 0.0000; + 5112 5133 0.01714 0.07289 0.03645 187 0 0 0 0 1 0 0 -9.7400 -0.8600 9.7600 -2.8100 0.0000 0.0000 0.0000 0.0000; + 5191 5112 0.008 0.03402 0.01701 187 0 0 0 0 1 0 0 -45.8700 25.5400 46.0900 -26.3700 0.0000 0.0000 0.0000 0.0000; + 5112 5246 0.01038 0.04415 0.02208 187 0 0 0 0 1 0 0 -3.5800 7.0200 3.5900 -9.2400 0.0000 0.0000 0.0000 0.0000; + 5286 5112 0.018 0.078 0.012 150 0 0 0 0 1 0 0 47.4500 -15.5000 -47.0200 16.1700 0.0000 0.0000 0.0000 0.0000; + 5113 5195 0.00674 0.0395 0.01972 251 0 0 0 0 1 0 0 19.6900 -17.6800 -19.6400 15.9400 0.0000 0.0000 0.0000 0.0000; + 5113 5218 0.00858 0.0378 0.01759 187 0 0 0 0 1 0 0 -29.5800 21.3300 29.6900 -22.5700 0.0000 0.0000 0.0000 0.0000; + 5220 5113 0.00567 0.0241 0.01205 187 0 0 0 0 1 0 0 11.7000 8.6000 -11.6900 -9.7600 0.0000 0.0000 0.0000 0.0000; + 5219 5114 0.00883 0.03893 0.01812 187 0 0 0 0 1 0 0 34.5500 12.5200 -34.4300 -13.7900 0.0000 0.0000 0.0000 0.0000; + 5114 5222 0.00513 0.03755 0.02128 310 0 0 0 0 1 0 0 -112.2300 24.5700 112.9200 -21.6300 0.0000 0.0000 0.0000 0.0000; + 5227 5114 0.005 0.03803 0.01997 310 0 0 0 0 1 0 0 -89.2700 28.2800 89.7100 -26.9100 0.0000 0.0000 0.0000 0.0000; + 5115 5421 0.0025 0.01413 0.0076 251 0 0 0 0 1 0 0 64.5300 -61.7800 -64.3400 62.0900 0.0000 0.0000 0.0000 0.0000; + 5454 5115 0.00397 0.02326 0.01161 251 0 0 0 0 1 0 0 82.6500 -55.6500 -82.2600 56.7600 0.0000 0.0000 0.0000 0.0000; + 5116 5224 0.00199 0.01514 0.00795 310 0 0 0 0 1 0 0 65.2700 -26.4300 -65.1700 26.3900 0.0000 0.0000 0.0000 0.0000; + 5116 5224 0.00199 0.01514 0.00795 310 0 0 0 0 1 0 0 65.2700 -26.4300 -65.1700 26.3900 0.0000 0.0000 0.0000 0.0000; + 5117 5216 0.00157 0.00695 0.00323 251 0 0 0 0 1 0 0 -104.2200 -56.9100 104.4400 57.6000 0.0000 0.0000 0.0000 0.0000; + 5117 5409 0.00292 0.01288 0.00599 187 0 0 0 0 1 0 0 -24.0700 20.5700 24.1000 -21.0100 0.0000 0.0000 0.0000 0.0000; + 5334 5118 0.01328 0.05646 0.02824 187 0 0 0 0 1 0 0 95.3200 -14.5000 -94.1300 16.6400 0.0000 0.0000 0.0000 0.0000; + 5347 5118 0.01023 0.04352 0.02177 187 0 0 0 0 1 0 0 13.8200 -8.0800 -13.7900 5.9500 0.0000 0.0000 0.0000 0.0000; + 5118 5456 0.00988 0.05791 0.02892 251 0 0 0 0 1 0 0 99.2700 -25.0400 -98.2700 27.9200 0.0000 0.0000 0.0000 0.0000; + 5119 5205 0.00604 0.02658 0.01237 187 0 0 0 0 1 0 0 41.3900 -14.6600 -41.2700 13.9200 0.0000 0.0000 0.0000 0.0000; + 5337 5119 0.01103 0.04691 0.02346 187 0 0 0 0 1 0 0 46.0400 -14.6800 -45.7900 13.4100 0.0000 0.0000 0.0000 0.0000; + 5121 5120 0.00064 0.04599 0 298 0 0 1 0 1 0 0 -24.4700 -7.3800 24.4700 7.6700 0.0000 0.0000 0.0000 0.0000; + 5120 5239 0.00087 0.01049 0.69666 2020 0 0 0 0 1 0 0 321.5600 -94.2700 -320.6700 31.2100 0.0000 0.0000 0.0000 0.0000; + 5122 5252 0.0046 0.01958 0.00979 187 0 0 0 0 1 0 0 33.2700 2.7500 -33.2200 -3.4900 0.0000 0.0000 0.0000 0.0000; + 5122 5308 0.00469 0.02752 0.01374 251 0 0 0 0 1 0 0 -124.4000 18.7700 125.1500 -15.7300 0.0000 0.0000 0.0000 0.0000; + 5124 5123 0.00266 0.07286 0 214 0 0 1 0 1 0 0 23.0500 -4.2000 -23.0300 4.5900 0.0000 0.0000 0.0000 0.0000; + 5159 5123 0.00799 0.03521 0.01639 187 0 0 0 0 1 0 0 -22.9900 3.1100 23.0300 -4.5900 0.0000 0.0000 0.0000 0.0000; + 8157 5124 0.01256 0.05593 0.0082 149 0 0 0 0 1 0 0 50.0500 3.8900 -49.7400 -3.3700 0.0000 0.0000 0.0000 0.0000; + 5125 5330 0.00087 0.0064 0.00362 409 0 0 0 0 1 0 0 228.4500 5.5200 -227.9900 -2.5400 0.0000 0.0000 0.0000 0.0000; + 5125 5330 0.00087 0.0064 0.00362 409 0 0 0 0 1 0 0 228.4500 5.5200 -227.9900 -2.5400 0.0000 0.0000 0.0000 0.0000; + 5126 5252 0.0023 0.00978 0.00489 187 0 0 0 0 1 0 0 -35.2300 -23.6200 35.2700 23.3200 0.0000 0.0000 0.0000 0.0000; + 5126 5309 0.00399 0.01755 0.00817 187 0 0 0 0 1 0 0 -26.4300 6.0300 26.4600 -6.7000 0.0000 0.0000 0.0000 0.0000; + 5126 5386 0.00259 0.01969 0.01034 310 0 0 0 0 1 0 0 -111.5500 -31.4900 111.9000 33.1600 0.0000 0.0000 0.0000 0.0000; + 5191 5127 0.00791 0.03487 0.01623 187 0 0 0 0 1 0 0 -32.8600 16.6600 32.9700 -17.8700 0.0000 0.0000 0.0000 0.0000; + 5127 5231 0.01585 0.06741 0.03371 187 0 0 0 0 1 0 0 -41.3000 8.1600 41.5800 -10.4400 0.0000 0.0000 0.0000 0.0000; + 5314 5127 0.01301 0.05729 0.02667 187 0 0 0 0 1 0 0 -4.4300 -11.2700 4.4400 8.6100 0.0000 0.0000 0.0000 0.0000; + 5128 5214 0.00143 0.0084 0.0042 251 0 0 0 0 1 0 0 -91.5700 18.7100 91.6900 -18.3800 0.0000 0.0000 0.0000 0.0000; + 5128 5467 0.00166 0.00974 0.00486 251 0 0 0 0 1 0 0 52.3200 -62.6600 -52.2100 62.8300 0.0000 0.0000 0.0000 0.0000; + 5226 5129 0.00964 0.04249 0.01978 187 0 0 0 0 1 0 0 -10.5900 1.8100 10.6000 -3.8600 0.0000 0.0000 0.0000 0.0000; + 5129 5240 0.01196 0.05272 0.02454 187 0 0 0 0 1 0 0 -25.4900 -0.3600 25.5700 -1.9300 0.0000 0.0000 0.0000 0.0000; + 5173 5130 0.00095 0.00693 0.00393 310 0 0 0 0 1 0 0 -63.1100 -19.7600 63.1500 19.6800 0.0000 0.0000 0.0000 0.0000; + 5173 5130 0.00095 0.00693 0.00393 310 0 0 0 0 1 0 0 -63.1100 -19.7600 63.1500 19.6800 0.0000 0.0000 0.0000 0.0000; + 5132 5131 0.00037 0.01821 0 981 0 0 1 0 1 0 0 -221.5400 -30.6700 221.7200 39.5000 0.0000 0.0000 0.0000 0.0000; + 5131 5279 0.00022 0.00271 0.1803 2020 0 0 0 0 1 0 0 -86.1100 98.3900 86.1500 -116.7300 0.0000 0.0000 0.0000 0.0000; + 5131 5410 0.00018 0.00365 0.25434 2768 0 0 0 0 1 0 0 324.0900 -56.1100 -323.9100 33.1900 0.0000 0.0000 0.0000 0.0000; + 5131 6107 0.00051 0.01038 0.72429 2768 0 0 0 0 1 0 0 -459.6900 -81.7800 460.7300 26.5300 0.0000 0.0000 0.0000 0.0000; + 5163 5132 0.00318 0.01866 0.00932 251 0 0 0 0 1 0 0 -118.5900 -0.0200 119.0200 1.6300 0.0000 0.0000 0.0000 0.0000; + 5155 5134 0.0067 0.0393 0.01962 251 0 0 0 0 1 0 0 -97.9100 27.6700 98.5900 -25.7000 0.0000 0.0000 0.0000 0.0000; + 5155 5135 0.00905 0.05304 0.02648 251 0 0 0 0 1 0 0 94.2100 -28.7200 -93.3600 30.9600 0.0000 0.0000 0.0000 0.0000; + 5169 5135 0.01055 0.04486 0.02244 187 0 0 0 0 1 0 0 0.2400 1.6800 -0.2400 -4.0200 0.0000 0.0000 0.0000 0.0000; + 5135 5264 0.00751 0.04244 0.02283 251 0 0 0 0 1 0 0 66.0000 -34.7600 -65.6100 34.5900 0.0000 0.0000 0.0000 0.0000; + 5136 5288 0.00558 0.03152 0.01695 251 0 0 0 0 1 0 0 66.1300 -3.5300 -65.8900 3.2500 0.0000 0.0000 0.0000 0.0000; + 5138 5137 0.00014 0.0092 0 945 0 0 1 0 1 0 0 -254.4800 -21.0300 254.5700 26.8500 0.0000 0.0000 0.0000 0.0000; + 5137 5388 0.00021 0.00253 0.16793 2020 0 0 0 0 1 0 0 127.8200 34.0400 -127.7900 -50.9700 0.0000 0.0000 0.0000 0.0000; + 5137 5451 0.00114 0.01383 0.91863 2020 0 0 0 0 1 0 0 -382.4000 -60.9000 384.0100 -15.3700 0.0000 0.0000 0.0000 0.0000; + 5139 5183 0.00187 0.00825 0.00384 310 0 0 0 0 1 0 0 5.0000 108.9600 -4.7800 -108.3900 0.0000 0.0000 0.0000 0.0000; + 5139 5233 0.00826 0.03638 0.01694 409 0 0 0 0 1 0 0 -102.8200 48.2200 103.8700 -45.3100 0.0000 0.0000 0.0000 0.0000; + 5344 5139 0.00178 0.00785 0.00365 310 0 0 0 0 1 0 0 -11.2800 -93.7500 11.4400 94.0700 0.0000 0.0000 0.0000 0.0000; + 5140 5466 0.00143 0.00633 0.00295 187 0 0 0 0 1 0 0 38.4700 -2.6600 -38.4500 2.4600 0.0000 0.0000 0.0000 0.0000; + 5141 5408 0.00702 0.03094 0.0144 187 0 0 0 0 1 0 0 9.7300 -33.2900 -9.6500 32.2100 0.0000 0.0000 0.0000 0.0000; + 5142 5466 0.01638 0.07217 0.03359 187 0 0 0 0 1 0 0 7.7300 -7.0800 -7.7100 3.7700 0.0000 0.0000 0.0000 0.0000; + 5143 5216 0.00311 0.01826 0.00912 409 0 0 0 0 1 0 0 159.9300 19.1200 -159.1200 -15.2900 0.0000 0.0000 0.0000 0.0000; + 5428 5143 0.00107 0.00811 0.00426 409 0 0 0 0 1 0 0 -198.5300 0.8100 198.9500 1.9800 0.0000 0.0000 0.0000 0.0000; + 5428 5143 0.00107 0.00811 0.00426 409 0 0 0 0 1 0 0 -198.5300 0.8100 198.9500 1.9800 0.0000 0.0000 0.0000 0.0000; + 5144 5314 0.01178 0.05011 0.02506 187 0 0 0 0 1 0 0 -3.5500 -5.1900 3.5500 2.6600 0.0000 0.0000 0.0000 0.0000; + 5389 5144 0.00473 0.02084 0.0097 187 0 0 0 0 1 0 0 70.1200 15.6800 -69.8800 -15.6200 0.0000 0.0000 0.0000 0.0000; + 5145 5251 0.00125 0.00917 0.0052 310 0 0 0 0 1 0 0 164.8800 -1.0700 -164.5400 3.0600 0.0000 0.0000 0.0000 0.0000; + 5145 5251 0.00125 0.00917 0.0052 310 0 0 0 0 1 0 0 164.8800 -1.0700 -164.5400 3.0600 0.0000 0.0000 0.0000 0.0000; + 5145 5323 0.00133 0.00973 0.00551 310 0 0 0 0 1 0 0 -149.2000 -10.4200 149.5000 12.0500 0.0000 0.0000 0.0000 0.0000; + 5145 5323 0.00133 0.00973 0.00551 310 0 0 0 0 1 0 0 -149.2000 -10.4200 149.5000 12.0500 0.0000 0.0000 0.0000 0.0000; + 5145 5323 0.00133 0.00973 0.00551 310 0 0 0 0 1 0 0 -149.2000 -10.4200 149.5000 12.0500 0.0000 0.0000 0.0000 0.0000; + 5146 5149 0.00482 0.02826 0.01411 251 0 0 0 0 1 0 0 116.8700 -6.3500 -116.2000 8.8700 0.0000 0.0000 0.0000 0.0000; + 5146 5152 0.00096 0.0073 0.00383 310 0 0 0 0 1 0 0 147.7700 0.2600 -147.5600 0.9700 0.0000 0.0000 0.0000 0.0000; + 5146 5152 0.00096 0.0073 0.00383 310 0 0 0 0 1 0 0 147.7700 0.2600 -147.5600 0.9700 0.0000 0.0000 0.0000 0.0000; + 5336 5146 0.00105 0.00797 0.00418 310 0 0 0 0 1 0 0 167.8600 5.3700 -167.5600 -3.5200 0.0000 0.0000 0.0000 0.0000; + 5336 5146 0.00105 0.00797 0.00418 310 0 0 0 0 1 0 0 167.8600 5.3700 -167.5600 -3.5200 0.0000 0.0000 0.0000 0.0000; + 5336 5146 0.00105 0.00797 0.00418 310 0 0 0 0 1 0 0 167.8600 5.3700 -167.5600 -3.5200 0.0000 0.0000 0.0000 0.0000; + 5146 5412 0.00262 0.01534 0.00766 251 0 0 0 0 1 0 0 -0.4700 -9.3300 0.4700 8.5800 0.0000 0.0000 0.0000 0.0000; + 5147 5188 0.00308 0.01312 0.00656 187 0 0 0 0 1 0 0 -51.8900 18.1600 51.9900 -18.3900 0.0000 0.0000 0.0000 0.0000; + 5147 5224 0.00362 0.02124 0.01061 251 0 0 0 0 1 0 0 13.4300 -34.1500 -13.3800 33.3800 0.0000 0.0000 0.0000 0.0000; + 5148 5335 0.00222 0.00945 0.00473 187 0 0 0 0 1 0 0 51.2400 6.5700 -51.1800 -6.7800 0.0000 0.0000 0.0000 0.0000; + 5148 5457 0.00612 0.02601 0.01301 187 0 0 0 0 1 0 0 -83.2800 17.7800 83.7300 -17.1400 0.0000 0.0000 0.0000 0.0000; + 5463 5148 0.00259 0.01144 0.00532 187 0 0 0 0 1 0 0 9.7200 -3.2900 -9.7100 2.7800 0.0000 0.0000 0.0000 0.0000; + 5294 5149 0.00116 0.00679 0.00339 251 0 0 0 0 1 0 0 -48.9600 42.3500 49.0100 -42.4000 0.0000 0.0000 0.0000 0.0000; + 5149 5309 0.0028 0.01233 0.00574 187 0 0 0 0 1 0 0 -24.2600 7.6100 24.2800 -8.1000 0.0000 0.0000 0.0000 0.0000; + 5197 5150 0.00186 0.01364 0.00773 310 0 0 0 0 1 0 0 134.0800 -6.0200 -133.7400 7.6900 0.0000 0.0000 0.0000 0.0000; + 5150 5432 0.01516 0.11531 0.06054 310 0 0 0 0 1 0 0 129.6300 -8.8500 -127.0800 22.2000 0.0000 0.0000 0.0000 0.0000; + 5154 5151 0.00778 0.0343 0.01597 187 0 0 0 0 1 0 0 -42.2600 -13.8200 42.4100 12.8600 0.0000 0.0000 0.0000 0.0000; + 5191 5151 0.008 0.03526 0.01641 187 0 0 0 0 1 0 0 39.7100 10.1200 -39.5800 -11.2300 0.0000 0.0000 0.0000 0.0000; + 5407 5151 0.00814 0.03465 0.01733 187 0 0 0 0 1 0 0 8.1700 1.3900 -8.1600 -3.1400 0.0000 0.0000 0.0000 0.0000; + 5181 5152 0.00134 0.00979 0.00555 310 0 0 0 0 1 0 0 -119.6700 18.3400 119.8700 -17.4300 0.0000 0.0000 0.0000 0.0000; + 5181 5152 0.00134 0.00979 0.00555 310 0 0 0 0 1 0 0 -119.6700 18.3400 119.8700 -17.4300 0.0000 0.0000 0.0000 0.0000; + 5205 5153 0.00418 0.03177 0.01668 409 0 0 0 0 1 0 0 198.4300 -6.3300 -196.8000 17.0900 0.0000 0.0000 0.0000 0.0000; + 5205 5153 0.00418 0.03177 0.01668 409 0 0 0 0 1 0 0 198.4300 -6.3300 -196.8000 17.0900 0.0000 0.0000 0.0000 0.0000; + 5154 5247 0.0072 0.03174 0.01477 187 0 0 0 0 1 0 0 -47.4500 4.2300 47.6100 -5.0000 0.0000 0.0000 0.0000 0.0000; + 5290 5154 0.00545 0.03196 0.01596 251 0 0 0 0 1 0 0 -73.8300 -5.0100 74.1300 5.1800 0.0000 0.0000 0.0000 0.0000; + 5456 5156 0.00659 0.03866 0.0193 251 0 0 0 0 1 0 0 85.6500 -31.5000 -85.1300 32.5600 0.0000 0.0000 0.0000 0.0000; + 5157 5194 0.00346 0.01472 0.00736 187 0 0 0 0 1 0 0 -62.7300 -45.3100 62.9400 45.4900 0.0000 0.0000 0.0000 0.0000; + 5333 5157 0.00236 0.01792 0.00941 310 0 0 0 0 1 0 0 60.8500 -16.2700 -60.7600 16.0800 0.0000 0.0000 0.0000 0.0000; + 5333 5157 0.00236 0.01792 0.00941 310 0 0 0 0 1 0 0 60.8500 -16.2700 -60.7600 16.0800 0.0000 0.0000 0.0000 0.0000; + 5316 5158 0.00121 0.0089 0.00504 409 0 0 0 0 1 0 0 -174.5100 134.7400 175.0700 -131.1400 0.0000 0.0000 0.0000 0.0000; + 5316 5158 0.00121 0.0089 0.00504 409 0 0 0 0 1 0 0 -174.5100 134.7400 175.0700 -131.1400 0.0000 0.0000 0.0000 0.0000; + 5374 5158 0.00143 0.01044 0.00592 500 0 0 0 0 1 0 0 260.2600 -99.9500 -259.1700 107.3200 0.0000 0.0000 0.0000 0.0000; + 5374 5158 0.00143 0.01044 0.00592 500 0 0 0 0 1 0 0 260.2600 -99.9500 -259.1700 107.3200 0.0000 0.0000 0.0000 0.0000; + 5271 5159 0.01947 0.08578 0.03993 187 0 0 0 0 1 0 0 -8.4300 3.2300 8.4400 -7.2300 0.0000 0.0000 0.0000 0.0000; + 5165 5160 0.00151 0.00888 0.00443 310 0 0 0 0 1 0 0 141.0900 23.1900 -140.7800 -21.8200 0.0000 0.0000 0.0000 0.0000; + 5161 5181 0.00545 0.02401 0.01118 187 0 0 0 0 1 0 0 -18.6400 98.6500 19.1700 -97.4000 0.0000 0.0000 0.0000 0.0000; + 5161 5272 0.00401 0.01705 0.00853 310 0 0 0 0 1 0 0 -23.8700 94.8700 24.2500 -94.1400 0.0000 0.0000 0.0000 0.0000; + 5316 5161 0.00144 0.00846 0.00422 409 0 0 0 0 1 0 0 124.6100 98.7800 -124.2600 -97.1800 0.0000 0.0000 0.0000 0.0000; + 5161 5356 0.00487 0.02856 0.01426 251 0 0 0 0 1 0 0 -32.8800 63.5200 33.1300 -63.5200 0.0000 0.0000 0.0000 0.0000; + 5162 5211 0.01066 0.04696 0.02186 187 0 0 0 0 1 0 0 -12.1400 1.7300 12.1600 -3.8400 0.0000 0.0000 0.0000 0.0000; + 5162 5437 0.00505 0.02226 0.01036 187 0 0 0 0 1 0 0 5.4500 -3.6300 -5.4500 2.6100 0.0000 0.0000 0.0000 0.0000; + 5163 5235 0.00709 0.03019 0.0151 187 0 0 0 0 1 0 0 1.3100 -14.9300 -1.2900 13.4400 0.0000 0.0000 0.0000 0.0000; + 5165 5164 8e-05 0.00485 0 1379 0 0 1 0 1 0 0 -1096.4600 -45.8000 1097.4300 104.1800 0.0000 0.0000 0.0000 0.0000; + 5166 5164 0.00042 0.02718 0 579 0 0 1 0 1 0 0 126.1500 64.3900 -126.0700 -59.1700 0.0000 0.0000 0.0000 0.0000; + 5167 5164 0.0012 0.09028 0 215 0 0 1 0 1 0 0 1.6000 0.8100 -1.6000 -0.8100 0.0000 0.0000 0.0000 0.0000; + 5164 5204 0.00057 0.01164 0.81214 3146 0 0 0 0 1 0 0 -1066.7400 83.6100 1073.2600 -32.5600 0.0000 0.0000 0.0000 0.0000; + 5164 5464 0.00018 0.00364 0.25416 2768 0 0 0 0 1 0 0 828.3900 -122.0900 -827.1500 121.5300 0.0000 0.0000 0.0000 0.0000; + 5175 5165 0.00126 0.00958 0.00503 409 0 0 0 0 1 0 0 -231.7400 13.8000 232.4200 -9.1200 0.0000 0.0000 0.0000 0.0000; + 5175 5165 0.00126 0.00958 0.00503 409 0 0 0 0 1 0 0 -231.7400 13.8000 232.4200 -9.1200 0.0000 0.0000 0.0000 0.0000; + 5175 5165 0.00126 0.00958 0.00503 409 0 0 0 0 1 0 0 -231.7400 13.8000 232.4200 -9.1200 0.0000 0.0000 0.0000 0.0000; + 5168 5203 0.00632 0.02787 0.01297 187 0 0 0 0 1 0 0 -39.4700 15.1700 39.5900 -15.9400 0.0000 0.0000 0.0000 0.0000; + 5168 5245 0.00821 0.03616 0.01683 187 0 0 0 0 1 0 0 -47.7500 -16.6600 47.9600 15.9200 0.0000 0.0000 0.0000 0.0000; + 5168 5311 0.00162 0.00948 0.00473 251 0 0 0 0 1 0 0 -38.4500 -34.1200 38.4900 33.9000 0.0000 0.0000 0.0000 0.0000; + 5170 5169 0.00185 0.06575 0 222 0 0 1 0 1 0 0 45.0000 -8.6400 -44.9600 9.9800 0.0000 0.0000 0.0000 0.0000; + 5471 5169 0.00598 0.02635 0.01226 187 0 0 0 0 1 0 0 -44.6000 10.9100 44.7200 -11.6600 0.0000 0.0000 0.0000 0.0000; + 5171 5174 0.00411 0.02409 0.01203 251 0 0 0 0 1 0 0 -73.7100 7.0800 73.9400 -6.9300 0.0000 0.0000 0.0000 0.0000; + 5306 5172 0.00438 0.02476 0.01332 251 0 0 0 0 1 0 0 39.0500 -77.4400 -38.7300 77.9000 0.0000 0.0000 0.0000 0.0000; + 5430 5172 0.00249 0.01461 0.0073 251 0 0 0 0 1 0 0 35.8300 -107.9800 -35.5100 109.0900 0.0000 0.0000 0.0000 0.0000; + 5173 5203 0.00375 0.02199 0.01098 251 0 0 0 0 1 0 0 95.4900 -16.2200 -95.1400 17.2400 0.0000 0.0000 0.0000 0.0000; + 5474 5174 0.00547 0.03094 0.01664 251 0 0 0 0 1 0 0 78.6000 -5.4200 -78.2600 5.7000 0.0000 0.0000 0.0000 0.0000; + 5195 5175 0.00254 0.01433 0.00771 409 0 0 0 0 1 0 0 -179.1600 106.5500 180.2500 -101.2000 0.0000 0.0000 0.0000 0.0000; + 5175 5370 0.00192 0.01457 0.00765 409 0 0 0 0 1 0 0 198.1400 13.0900 -197.3800 -8.0800 0.0000 0.0000 0.0000 0.0000; + 5175 5370 0.00192 0.01457 0.00765 409 0 0 0 0 1 0 0 198.1400 13.0900 -197.3800 -8.0800 0.0000 0.0000 0.0000 0.0000; + 5177 5186 0.00555 0.04069 0.02305 310 0 0 0 0 1 0 0 -90.2700 5.6700 90.7400 -4.5300 0.0000 0.0000 0.0000 0.0000; + 5177 5186 0.00555 0.04069 0.02305 310 0 0 0 0 1 0 0 -90.2700 5.6700 90.7400 -4.5300 0.0000 0.0000 0.0000 0.0000; + 5177 5287 0.00483 0.02054 0.01027 360 0 0 0 0 1 0 0 65.8800 -24.9600 -65.6400 24.9800 0.0000 0.0000 0.0000 0.0000; + 5258 5178 0.00517 0.02281 0.01062 187 0 0 0 0 1 0 0 9.8800 -16.4000 -9.8700 15.4300 0.0000 0.0000 0.0000 0.0000; + 5308 5178 0.00366 0.02147 0.01072 251 0 0 0 0 1 0 0 112.1400 -4.1800 -111.6700 5.8400 0.0000 0.0000 0.0000 0.0000; + 5178 5354 0.00769 0.03272 0.01636 187 0 0 0 0 1 0 0 37.5800 -45.0600 -37.3200 44.5400 0.0000 0.0000 0.0000 0.0000; + 5180 5179 0.00019 0.01541 0 946 0 0 1 0 1 0 0 -175.5200 -23.9400 175.5800 28.6600 0.0000 0.0000 0.0000 0.0000; + 5358 5179 0.00053 0.01093 0.76232 3146 0 0 0 0 1 0 0 1272.4300 3.4800 -1264.1600 88.1900 0.0000 0.0000 0.0000 0.0000; + 5179 5380 0.00018 0.004 0.34742 3146 0 0 0 0 1 0 0 1295.4600 -25.8400 -1292.5400 54.8600 0.0000 0.0000 0.0000 0.0000; + 5179 8043 0.00039 0.00798 0.55658 2768 0 0 0 0 1 0 0 -641.1700 19.1300 642.7200 -44.7700 0.0000 0.0000 0.0000 0.0000; + 5179 8057 0.00045 0.00923 0.64362 2768 0 0 0 0 1 0 0 75.7800 -134.5000 -75.7100 68.7900 0.0000 0.0000 0.0000 0.0000; + 5180 5485 0.00261 0.01983 0.01041 310 0 0 0 0 1 0 0 87.1600 -1.0900 -86.9700 1.5000 0.0000 0.0000 0.0000 0.0000; + 5182 5314 0.01253 0.05522 0.0257 187 0 0 0 0 1 0 0 11.1300 -7.7200 -11.1100 5.2100 0.0000 0.0000 0.0000 0.0000; + 5183 5224 0.00147 0.00831 0.00447 251 0 0 0 0 1 0 0 -134.3100 68.9800 134.6500 -67.5300 0.0000 0.0000 0.0000 0.0000; + 5184 5373 0.00681 0.02896 0.01448 187 0 0 0 0 1 0 0 37.5300 -6.9700 -37.4300 6.0000 0.0000 0.0000 0.0000 0.0000; + 5387 5184 0.00193 0.01132 0.00565 263.55 0 0 0 0 1 0 0 118.0500 16.8700 -117.7600 -15.7600 0.0000 0.0000 0.0000 0.0000; + 5185 5218 0.00352 0.02066 0.01032 281.12 0 0 0 0 1 0 0 108.1000 -3.9100 -107.6900 5.2900 0.0000 0.0000 0.0000 0.0000; + 5434 5185 0.00242 0.01843 0.00967 310 0 0 0 0 1 0 0 -110.6500 39.0900 110.9800 -37.5400 0.0000 0.0000 0.0000 0.0000; + 5434 5185 0.00242 0.01843 0.00967 310 0 0 0 0 1 0 0 -110.6500 39.0900 110.9800 -37.5400 0.0000 0.0000 0.0000 0.0000; + 5186 5355 0.00341 0.02495 0.01414 310 0 0 0 0 1 0 0 -111.3200 4.9100 111.7500 -3.1600 0.0000 0.0000 0.0000 0.0000; + 5186 5355 0.00341 0.02495 0.01414 310 0 0 0 0 1 0 0 -111.3200 4.9100 111.7500 -3.1600 0.0000 0.0000 0.0000 0.0000; + 5188 5203 0.00199 0.01122 0.00604 251 0 0 0 0 1 0 0 91.3600 -21.0200 -91.1800 21.4300 0.0000 0.0000 0.0000 0.0000; + 5188 5234 0.00344 0.02618 0.01374 310 0 0 0 0 1 0 0 -140.1000 10.3300 140.7900 -6.4100 0.0000 0.0000 0.0000 0.0000; + 5188 5253 0.00739 0.03143 0.01572 187 0 0 0 0 1 0 0 -68.0700 10.7200 68.4300 -10.7300 0.0000 0.0000 0.0000 0.0000; + 5189 5230 0.00077 0.00451 0.00225 251 0 0 0 0 1 0 0 93.6000 -2.9900 -93.5300 3.1700 0.0000 0.0000 0.0000 0.0000; + 5189 5272 0.00079 0.00346 0.00161 409 0 0 0 0 1 0 0 115.3500 -72.2500 -115.2000 72.7300 0.0000 0.0000 0.0000 0.0000; + 5189 5352 0.00101 0.00766 0.00402 310 0 0 0 0 1 0 0 -143.8900 26.4500 144.1100 -25.2100 0.0000 0.0000 0.0000 0.0000; + 5189 5352 0.00101 0.00766 0.00402 310 0 0 0 0 1 0 0 -143.8900 26.4500 144.1100 -25.2100 0.0000 0.0000 0.0000 0.0000; + 5190 5255 0.01063 0.06231 0.03111 251 0 0 0 0 1 0 0 -29.9900 25.0500 30.1600 -27.1700 0.0000 0.0000 0.0000 0.0000; + 5190 5264 0.01177 0.06902 0.03446 251 0 0 0 0 1 0 0 -94.6800 -16.4900 95.7500 19.1700 0.0000 0.0000 0.0000 0.0000; + 5190 5430 0.01256 0.09556 0.05017 310 0 0 0 0 1 0 0 121.3000 -9.5200 -119.4700 18.3500 0.0000 0.0000 0.0000 0.0000; + 5191 5407 0.00806 0.03551 0.01653 187 0 0 0 0 1 0 0 31.4500 7.6500 -31.3700 -8.9900 0.0000 0.0000 0.0000 0.0000; + 5193 5192 0.00022 0.01302 0 890 0 0 1 0 1 0 0 -180.7200 -24.8400 180.7900 29.0500 0.0000 0.0000 0.0000 0.0000; + 5192 5279 0.00078 0.00941 0.62487 2020 0 0 0 0 1 0 0 -180.7900 -29.0500 181.0300 -32.9900 0.0000 0.0000 0.0000 0.0000; + 6316 5193 0.00674 0.02866 0.01433 187 0 0 0 0 1 0 0 -45.8000 12.5000 45.9400 -13.3400 0.0000 0.0000 0.0000 0.0000; + 5194 5330 0.0059 0.03459 0.01728 251 0 0 0 0 1 0 0 -43.5800 0.3200 43.6900 -1.3800 0.0000 0.0000 0.0000 0.0000; + 5194 5376 0.00067 0.0051 0.00268 310 0 0 0 0 1 0 0 -164.2200 -67.9100 164.4300 69.2700 0.0000 0.0000 0.0000 0.0000; + 5194 5462 0.00205 0.01202 0.006 251 0 0 0 0 1 0 0 85.8500 5.3900 -85.7000 -5.0800 0.0000 0.0000 0.0000 0.0000; + 5197 5196 0.00034 0.03164 0 305 0 0 1 0 1 0 0 -95.7700 -1.9500 95.8000 4.8400 0.0000 0.0000 0.0000 0.0000; + 5198 5196 0.00018 0.01116 0 594 0 0 1 0 1 0 0 112.5000 -21.6000 -112.4800 23.0600 0.0000 0.0000 0.0000 0.0000; + 5196 5204 0.00058 0.00708 0.47032 2020 0 0 0 0 1 0 0 783.4000 -74.4700 -779.8500 70.4000 0.0000 0.0000 0.0000 0.0000; + 5337 5197 0.00702 0.03093 0.0144 187 0 0 0 0 1 0 0 -64.8200 9.3600 65.1200 -9.4700 0.0000 0.0000 0.0000 0.0000; + 5199 5375 0.0038 0.01619 0.0081 187 0 0 0 0 1 0 0 -30.7100 2.6500 30.7500 -3.3000 0.0000 0.0000 0.0000 0.0000; + 5199 5438 0.00104 0.00589 0.00317 251 0 0 0 0 1 0 0 74.0400 -33.2800 -73.9700 33.3600 0.0000 0.0000 0.0000 0.0000; + 5255 5200 0.00506 0.02964 0.0148 251 0 0 0 0 1 0 0 -39.5900 24.5000 39.7000 -25.3000 0.0000 0.0000 0.0000 0.0000; + 5276 5201 0.00365 0.02142 0.0107 251 0 0 0 0 1 0 0 98.9300 1.5400 -98.5800 -0.5700 0.0000 0.0000 0.0000 0.0000; + 5327 5201 0.00494 0.02792 0.01502 251 0 0 0 0 1 0 0 -93.3400 1.7200 93.7700 -0.8000 0.0000 0.0000 0.0000 0.0000; + 5202 5381 0.00904 0.03848 0.01924 187 0 0 0 0 1 0 0 -67.6500 -4.0100 68.0600 3.8300 0.0000 0.0000 0.0000 0.0000; + 5426 5202 0.01126 0.04962 0.0231 187 0 0 0 0 1 0 0 -58.6100 -2.1200 59.0100 1.5600 0.0000 0.0000 0.0000 0.0000; + 5205 5204 7e-05 0.00858 0 1134 0 0 1 0 1 0 0 -355.5900 -1.2600 355.6800 12.0400 0.0000 0.0000 0.0000 0.0000; + 5206 5204 0.00033 0.01983 0 903 0 0 1 0 1 0 0 207.1200 30.6700 -206.9700 -22.1500 0.0000 0.0000 0.0000 0.0000; + 5207 5204 0.00016 0.01066 0 915 0 0 1 0 1 0 0 180.0200 54.6900 -179.9600 -50.9900 0.0000 0.0000 0.0000 0.0000; + 5208 5204 0.00019 0.01341 0 913 0 0 1 0 1 0 0 180.0200 43.8500 -179.9600 -39.3400 0.0000 0.0000 0.0000 0.0000; + 5361 5204 0.00011 0.00234 0.16342 2768 0 0 0 0 1 0 0 -628.1000 -33.3100 628.5400 26.0500 0.0000 0.0000 0.0000 0.0000; + 5204 5413 0.00075 0.00906 0.60178 2020 0 0 0 0 1 0 0 -710.7300 36.5500 714.5200 -51.5100 0.0000 0.0000 0.0000 0.0000; + 5209 5246 0.00635 0.02797 0.01302 187 0 0 0 0 1 0 0 -54.6400 3.6800 54.8300 -4.1700 0.0000 0.0000 0.0000 0.0000; + 5247 5209 0.00664 0.02927 0.01362 187 0 0 0 0 1 0 0 -50.8700 4.0700 51.0500 -4.6900 0.0000 0.0000 0.0000 0.0000; + 5210 5233 0.00199 0.01164 0.00581 251 0 0 0 0 1 0 0 103.1500 -55.5200 -102.8800 56.5400 0.0000 0.0000 0.0000 0.0000; + 5210 5428 0.00112 0.00634 0.00341 409 0 0 0 0 1 0 0 -181.0000 24.3600 181.3800 -22.5800 0.0000 0.0000 0.0000 0.0000; + 5211 5275 0.00613 0.02704 0.01259 187 0 0 0 0 1 0 0 69.9300 -1.5800 -69.6300 1.6600 0.0000 0.0000 0.0000 0.0000; + 5211 5327 0.00415 0.02348 0.01263 251 0 0 0 0 1 0 0 -88.9900 3.4600 89.3200 -2.8500 0.0000 0.0000 0.0000 0.0000; + 5212 5256 0.00634 0.04821 0.02531 310 0 0 0 0 1 0 0 -97.6800 0.8600 98.3100 1.4100 0.0000 0.0000 0.0000 0.0000; + 5333 5212 0.00352 0.02679 0.01407 310 0 0 0 0 1 0 0 -63.6400 10.2500 63.7900 -10.4600 0.0000 0.0000 0.0000 0.0000; + 5213 5250 0.00303 0.02223 0.01259 409 0 0 0 0 1 0 0 -169.2100 -18.5600 170.1000 23.8600 0.0000 0.0000 0.0000 0.0000; + 5214 5229 0.00374 0.01647 0.00767 187 0 0 0 0 1 0 0 -45.6900 -11.2400 45.7700 10.8500 0.0000 0.0000 0.0000 0.0000; + 5468 5214 0.00075 0.0057 0.00299 310 0 0 0 0 1 0 0 92.4500 1.0600 -92.3900 -0.8600 0.0000 0.0000 0.0000 0.0000; + 5215 5277 0.00671 0.03931 0.01963 251 0 0 0 0 1 0 0 55.5000 -12.2900 -55.2800 11.6200 0.0000 0.0000 0.0000 0.0000; + 5216 5442 0.00087 0.00508 0.00254 251 0 0 0 0 1 0 0 77.2500 -31.7400 -77.1900 31.8500 0.0000 0.0000 0.0000 0.0000; + 5216 5443 0.00194 0.00852 0.00397 187 0 0 0 0 1 0 0 -89.1600 -29.4400 89.3300 29.8100 0.0000 0.0000 0.0000 0.0000; + 5217 5310 0.00171 0.00755 0.00351 187 0 0 0 0 1 0 0 85.9300 57.3700 -85.7500 -56.9400 0.0000 0.0000 0.0000 0.0000; + 5217 5310 0.00171 0.00755 0.00351 187 0 0 0 0 1 0 0 85.9300 57.3700 -85.7500 -56.9400 0.0000 0.0000 0.0000 0.0000; + 5217 5433 0.00438 0.01931 0.00899 251 0 0 0 0 1 0 0 91.7400 85.3200 -91.0700 -83.2600 0.0000 0.0000 0.0000 0.0000; + 5483 5217 0.00126 0.00922 0.00522 409 0 0 0 0 1 0 0 182.5200 -107.6000 -181.9700 111.1600 0.0000 0.0000 0.0000 0.0000; + 5483 5217 0.00126 0.00922 0.00522 409 0 0 0 0 1 0 0 182.5200 -107.6000 -181.9700 111.1600 0.0000 0.0000 0.0000 0.0000; + 5219 5371 0.00781 0.03325 0.01663 187 0 0 0 0 1 0 0 -47.9000 14.3700 48.0900 -15.2100 0.0000 0.0000 0.0000 0.0000; + 5221 5411 0.00803 0.03536 0.01646 187 0 0 0 0 1 0 0 -92.1700 -32.6200 92.9200 34.2500 0.0000 0.0000 0.0000 0.0000; + 5222 5426 0.00404 0.0307 0.01612 310 0 0 0 0 1 0 0 -73.0300 6.1200 73.2500 -6.0200 0.0000 0.0000 0.0000 0.0000; + 5222 5426 0.00404 0.0307 0.01612 310 0 0 0 0 1 0 0 -73.0300 6.1200 73.2500 -6.0200 0.0000 0.0000 0.0000 0.0000; + 5223 5275 0.00911 0.05341 0.02667 251 0 0 0 0 1 0 0 23.9300 -7.4200 -23.8700 5.1200 0.0000 0.0000 0.0000 0.0000; + 5307 5224 0.00171 0.01303 0.00684 310 0 0 0 0 1 0 0 146.2400 65.1200 -145.8100 -62.5200 0.0000 0.0000 0.0000 0.0000; + 5225 5259 0.00243 0.01424 0.00711 251 0 0 0 0 1 0 0 71.6700 47.0700 -71.5000 -46.7600 0.0000 0.0000 0.0000 0.0000; + 5421 5225 0.00183 0.0134 0.00759 310 0 0 0 0 1 0 0 84.9000 51.2600 -84.7300 -50.7700 0.0000 0.0000 0.0000 0.0000; + 5227 5354 0.00753 0.04412 0.02203 251 0 0 0 0 1 0 0 -7.3900 -11.7700 7.4000 9.6300 0.0000 0.0000 0.0000 0.0000; + 5313 5228 0.00155 0.01183 0.00621 409 0 0 0 0 1 0 0 176.7000 16.4400 -176.2200 -13.3500 0.0000 0.0000 0.0000 0.0000; + 5313 5228 0.00155 0.01183 0.00621 409 0 0 0 0 1 0 0 176.7000 16.4400 -176.2200 -13.3500 0.0000 0.0000 0.0000 0.0000; + 5313 5228 0.00155 0.01183 0.00621 409 0 0 0 0 1 0 0 176.7000 16.4400 -176.2200 -13.3500 0.0000 0.0000 0.0000 0.0000; + 5349 5228 0.0013 0.00988 0.00519 310 0 0 0 0 1 0 0 -139.5900 -10.7900 139.8500 12.2300 0.0000 0.0000 0.0000 0.0000; + 5229 5309 0.0027 0.01582 0.0079 409 0 0 0 0 1 0 0 150.2200 16.0700 -149.6000 -13.2100 0.0000 0.0000 0.0000 0.0000; + 5230 5478 0.00568 0.02417 0.01209 187 0 0 0 0 1 0 0 -32.8200 12.5900 32.8900 -13.4900 0.0000 0.0000 0.0000 0.0000; + 5286 5231 0.01945 0.08572 0.0399 187 0 0 0 0 1 0 0 15.6300 -12.2900 -15.5600 8.5000 0.0000 0.0000 0.0000 0.0000; + 5232 5251 0.00634 0.02792 0.013 187 0 0 0 0 1 0 0 -18.1600 6.3700 18.1900 -7.5600 0.0000 0.0000 0.0000 0.0000; + 5440 5232 0.00256 0.01088 0.00544 300 0 0 0 0 1 0 0 -22.0000 46.7500 22.0700 -47.0100 0.0000 0.0000 0.0000 0.0000; + 5232 5442 0.00617 0.02716 0.01264 187 0 0 0 0 1 0 0 -53.8800 26.4700 54.1100 -26.7300 0.0000 0.0000 0.0000 0.0000; + 5233 5339 0.00532 0.02343 0.01091 187 0 0 0 0 1 0 0 51.3500 -84.7600 -50.8300 85.9200 0.0000 0.0000 0.0000 0.0000; + 5234 5296 0.00408 0.03102 0.01628 310 0 0 0 0 1 0 0 -141.7300 -17.0000 142.5700 21.7800 0.0000 0.0000 0.0000 0.0000; + 5234 5296 0.00408 0.03102 0.01628 310 0 0 0 0 1 0 0 -141.7300 -17.0000 142.5700 21.7800 0.0000 0.0000 0.0000 0.0000; + 5235 5271 0.01401 0.06175 0.02875 187 0 0 0 0 1 0 0 -11.1800 7.5600 11.2100 -10.4000 0.0000 0.0000 0.0000 0.0000; + 5411 5235 0.00717 0.03052 0.01526 187 0 0 0 0 1 0 0 7.9500 25.4000 -7.9000 -26.7700 0.0000 0.0000 0.0000 0.0000; + 5237 5236 0.00052 0.04304 0 287 0 0 1 0 1 0 0 95.8200 -15.2600 -95.7700 19.3200 0.0000 0.0000 0.0000 0.0000; + 5238 5236 0.00016 0.00976 0 826 0 0 1 0 1 0 0 168.7500 -32.4000 -168.7000 35.2600 0.0000 0.0000 0.0000 0.0000; + 5236 5394 0.00122 0.01485 0.98624 2020 0 0 0 0 1 0 0 -664.9000 -78.5000 670.2300 41.8300 0.0000 0.0000 0.0000 0.0000; + 5240 5239 0.00052 0.03641 0 477 0 0 1 0 1 0 0 -91.8200 7.4600 91.8600 -4.5500 0.0000 0.0000 0.0000 0.0000; + 5243 5239 0.00038 0.02602 0 584 0 0 1 0 1 0 0 112.5000 -21.6000 -112.4500 24.8500 0.0000 0.0000 0.0000 0.0000; + 5451 5239 0.00065 0.00791 0.52569 2020 0 0 0 0 1 0 0 -614.5100 -31.0400 616.8400 3.9600 0.0000 0.0000 0.0000 0.0000; + 5239 6210 0.00119 0.01447 0.96116 2020 0 0 0 0 1 0 0 -275.5800 -55.4600 276.4300 -36.6600 0.0000 0.0000 0.0000 0.0000; + 5241 5240 0.00087 0.0425 0 204 0 0 1 0 1 0 0 -66.2200 7.2900 66.2600 -5.5300 0.0000 0.0000 0.0000 0.0000; + 5242 5241 0.01845 0.47482 0 24 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5244 5306 0.00707 0.04143 0.02069 251 0 0 0 0 1 0 0 -144.7300 3.7400 146.2300 3.0300 0.0000 0.0000 0.0000 0.0000; + 5244 5442 0.00508 0.02158 0.01079 187 0 0 0 0 1 0 0 79.6000 -22.1900 -79.2400 22.6200 0.0000 0.0000 0.0000 0.0000; + 5245 5254 0.00731 0.03219 0.01498 251 0 0 0 0 1 0 0 -119.6400 42.6400 120.8100 -38.9500 0.0000 0.0000 0.0000 0.0000; + 5245 5339 0.00345 0.01469 0.00734 187 0 0 0 0 1 0 0 -67.2900 -97.9300 67.7700 99.2300 0.0000 0.0000 0.0000 0.0000; + 5261 5246 0.0031 0.01817 0.00907 251 0 0 0 0 1 0 0 79.8200 -7.1800 -79.6300 7.4000 0.0000 0.0000 0.0000 0.0000; + 5248 5428 0.0019 0.01112 0.00555 251 0 0 0 0 1 0 0 -130.0900 4.5400 130.4100 -3.2000 0.0000 0.0000 0.0000 0.0000; + 5248 5457 0.00198 0.00875 0.00407 409 0 0 0 0 1 0 0 118.9300 9.8200 -118.6400 -8.9600 0.0000 0.0000 0.0000 0.0000; + 5248 5483 0.00348 0.01531 0.00713 187 0 0 0 0 1 0 0 -89.8600 -42.9800 90.2000 43.7900 0.0000 0.0000 0.0000 0.0000; + 5292 5249 0.0018 0.0137 0.0072 310 0 0 0 0 1 0 0 -161.3200 7.7000 161.8000 -4.7800 0.0000 0.0000 0.0000 0.0000; + 5292 5249 0.0018 0.0137 0.0072 310 0 0 0 0 1 0 0 -161.3200 7.7000 161.8000 -4.7800 0.0000 0.0000 0.0000 0.0000; + 5250 5385 0.00149 0.0113 0.00593 500 0 0 0 0 1 0 0 -232.3900 -22.4100 233.2000 27.9600 0.0000 0.0000 0.0000 0.0000; + 5250 5385 0.00149 0.0113 0.00593 500 0 0 0 0 1 0 0 -232.3900 -22.4100 233.2000 27.9600 0.0000 0.0000 0.0000 0.0000; + 5250 5385 0.00149 0.0113 0.00593 500 0 0 0 0 1 0 0 -232.3900 -22.4100 233.2000 27.9600 0.0000 0.0000 0.0000 0.0000; + 5250 5385 0.00149 0.0113 0.00593 500 0 0 0 0 1 0 0 -232.3900 -22.4100 233.2000 27.9600 0.0000 0.0000 0.0000 0.0000; + 5251 5478 0.00129 0.00945 0.00536 310 0 0 0 0 1 0 0 93.8800 -16.7200 -93.7600 17.0500 0.0000 0.0000 0.0000 0.0000; + 5251 5478 0.00129 0.00945 0.00536 310 0 0 0 0 1 0 0 93.8800 -16.7200 -93.7600 17.0500 0.0000 0.0000 0.0000 0.0000; + 5252 5340 0.00558 0.0237 0.01185 187 0 0 0 0 1 0 0 -24.4100 -10.5100 24.4500 9.5100 0.0000 0.0000 0.0000 0.0000; + 5252 5436 0.00133 0.00585 0.00272 187 0 0 0 0 1 0 0 -58.4500 -32.2100 58.5100 32.2000 0.0000 0.0000 0.0000 0.0000; + 5370 5253 0.00126 0.00956 0.00502 310 0 0 0 0 1 0 0 144.3900 -6.9300 -144.1200 8.4600 0.0000 0.0000 0.0000 0.0000; + 5370 5253 0.00126 0.00956 0.00502 310 0 0 0 0 1 0 0 144.3900 -6.9300 -144.1200 8.4600 0.0000 0.0000 0.0000 0.0000; + 5254 5332 0.00765 0.03373 0.0157 187 0 0 0 0 1 0 0 26.4400 5.7400 -26.3800 -7.0500 0.0000 0.0000 0.0000 0.0000; + 5254 5420 0.00202 0.01533 0.00805 310 0 0 0 0 1 0 0 -149.5600 3.2200 150.0200 -0.5800 0.0000 0.0000 0.0000 0.0000; + 5254 5420 0.00202 0.01533 0.00805 310 0 0 0 0 1 0 0 -149.5600 3.2200 150.0200 -0.5800 0.0000 0.0000 0.0000 0.0000; + 5254 5457 0.00634 0.02792 0.01299 187 0 0 0 0 1 0 0 68.9300 3.2800 -68.6300 -3.2300 0.0000 0.0000 0.0000 0.0000; + 5257 5256 0.00207 0.0117 0.00629 251 0 0 0 0 1 0 0 92.2300 -16.7300 -92.0500 17.1600 0.0000 0.0000 0.0000 0.0000; + 5256 5427 0.00474 0.02777 0.01387 251 0 0 0 0 1 0 0 93.2500 -5.6200 -92.8300 6.7200 0.0000 0.0000 0.0000 0.0000; + 5439 5256 0.0037 0.02813 0.01477 310 0 0 0 0 1 0 0 101.2000 14.8000 -100.8100 -13.3100 0.0000 0.0000 0.0000 0.0000; + 5308 5258 0.00332 0.01947 0.00972 310 0 0 0 0 1 0 0 110.4900 13.4600 -110.0700 -11.9900 0.0000 0.0000 0.0000 0.0000; + 5259 5412 0.00233 0.01365 0.00681 251 0 0 0 0 1 0 0 62.2900 44.1500 -62.1500 -44.0400 0.0000 0.0000 0.0000 0.0000; + 5261 5260 0.00045 0.02804 0 375 0 0 1 0 1 0 0 -79.8200 7.1800 79.8500 -5.4200 0.0000 0.0000 0.0000 0.0000; + 5262 5260 0.0001 0.00632 0 1450 0 0 1 0 1 0 0 1211.6700 43.0000 -1210.2300 48.0800 0.0000 0.0000 0.0000 0.0000; + 5263 5260 6e-05 0.00451 0 1450 0 0 1 0 1 0 0 1024.0400 32.8800 -1023.4200 13.5300 0.0000 0.0000 0.0000 0.0000; + 5317 5260 4e-05 0.00088 0.07608 4352 0 0 0 0 1 0 0 -2432.9000 137.1300 2435.2300 -93.5400 0.0000 0.0000 0.0000 0.0000; + 5264 5471 0.00664 0.03754 0.02019 251 0 0 0 0 1 0 0 -42.2700 28.6600 42.4300 -29.8400 0.0000 0.0000 0.0000 0.0000; + 5483 5265 0.00103 0.00785 0.00412 409 0 0 0 0 1 0 0 -179.9600 49.1500 180.3200 -46.8600 0.0000 0.0000 0.0000 0.0000; + 5483 5265 0.00103 0.00785 0.00412 409 0 0 0 0 1 0 0 -179.9600 49.1500 180.3200 -46.8600 0.0000 0.0000 0.0000 0.0000; + 5483 5265 0.00103 0.00785 0.00412 409 0 0 0 0 1 0 0 -179.9600 49.1500 180.3200 -46.8600 0.0000 0.0000 0.0000 0.0000; + 5287 5266 0.0022 0.01287 0.00643 310 0 0 0 0 1 0 0 -121.1500 -77.9100 121.6100 79.9700 0.0000 0.0000 0.0000 0.0000; + 5267 5466 0.00868 0.03823 0.01779 187 0 0 0 0 1 0 0 -38.5900 7.1400 38.7300 -8.3400 0.0000 0.0000 0.0000 0.0000; + 5470 5267 0.01229 0.05415 0.02521 187 0 0 0 0 1 0 0 -7.4500 12.1600 7.4800 -14.5900 0.0000 0.0000 0.0000 0.0000; + 5268 5288 0.00791 0.03365 0.01683 187 0 0 0 0 1 0 0 0.2700 -6.8800 -0.2700 5.2400 0.0000 0.0000 0.0000 0.0000; + 5427 5269 0.00325 0.02378 0.01347 310 0 0 0 0 1 0 0 -144.2400 -5.6000 144.9400 9.3300 0.0000 0.0000 0.0000 0.0000; + 5445 5269 0.0017 0.01248 0.00707 310 0 0 0 0 1 0 0 116.1800 18.0100 -115.9500 -16.9900 0.0000 0.0000 0.0000 0.0000; + 5445 5269 0.0017 0.01248 0.00707 310 0 0 0 0 1 0 0 116.1800 18.0100 -115.9500 -16.9900 0.0000 0.0000 0.0000 0.0000; + 5270 5389 0.00793 0.04646 0.0232 251 0 0 0 0 1 0 0 -108.0400 -5.6300 108.9600 8.7100 0.0000 0.0000 0.0000 0.0000; + 5270 5437 0.00885 0.03762 0.01882 187 0 0 0 0 1 0 0 3.5700 3.2900 -3.5700 -5.1600 0.0000 0.0000 0.0000 0.0000; + 5270 5474 0.00513 0.03004 0.015 251 0 0 0 0 1 0 0 82.0600 -4.0100 -81.7100 4.5400 0.0000 0.0000 0.0000 0.0000; + 5271 5390 0.00759 0.03346 0.01557 187 0 0 0 0 1 0 0 -12.7900 4.3300 12.8000 -5.8600 0.0000 0.0000 0.0000 0.0000; + 5467 5272 0.00108 0.00476 0.00222 187 0 0 0 0 1 0 0 -72.0600 -16.0400 72.1200 16.0800 0.0000 0.0000 0.0000 0.0000; + 5273 5339 0.00649 0.02763 0.01382 187 0 0 0 0 1 0 0 -25.4700 5.3500 25.5100 -6.6100 0.0000 0.0000 0.0000 0.0000; + 5273 5422 0.00204 0.01195 0.00597 251 0 0 0 0 1 0 0 -90.5300 -38.2200 90.7200 38.7000 0.0000 0.0000 0.0000 0.0000; + 5274 5329 0.00478 0.02801 0.01399 251 0 0 0 0 1 0 0 62.3700 3.5100 -62.1800 -3.7700 0.0000 0.0000 0.0000 0.0000; + 5274 5374 0.00568 0.02418 0.01209 187 0 0 0 0 1 0 0 -83.8300 -42.5500 84.3400 43.4900 0.0000 0.0000 0.0000 0.0000; + 5275 5476 0.01075 0.063 0.03146 251 0 0 0 0 1 0 0 88.7500 -8.1200 -87.8900 10.0800 0.0000 0.0000 0.0000 0.0000; + 5359 5276 0.00542 0.03062 0.01647 251 0 0 0 0 1 0 0 110.1100 6.4500 -109.4700 -4.5300 0.0000 0.0000 0.0000 0.0000; + 5277 5315 0.00953 0.04199 0.01955 187 0 0 0 0 1 0 0 -41.0500 16.8800 41.2400 -17.9700 0.0000 0.0000 0.0000 0.0000; + 5280 5278 0.00202 0.01184 0.00591 251 0 0 0 0 1 0 0 108.3700 7.0700 -108.1400 -6.3300 0.0000 0.0000 0.0000 0.0000; + 5390 5278 0.00646 0.02848 0.01326 187 0 0 0 0 1 0 0 -57.2400 7.6100 57.4500 -8.0300 0.0000 0.0000 0.0000 0.0000; + 5280 5279 0.0001 0.00635 0 1112 0 0 1 0 1 0 0 -373.4500 -60.3000 373.5800 69.1100 0.0000 0.0000 0.0000 0.0000; + 5281 5279 0.00021 0.01977 0 942 0 0 1 0 1 0 0 267.0000 -29.7200 -266.8500 43.6000 0.0000 0.0000 0.0000 0.0000; + 5282 5279 0.00021 0.01672 0 940 0 0 1 0 1 0 0 267.0000 -29.7200 -266.8500 41.4300 0.0000 0.0000 0.0000 0.0000; + 5283 5279 0.00027 0.01279 0 935 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5279 5358 0.00074 0.00901 0.5983 2020 0 0 0 0 1 0 0 -107.0800 -4.4200 107.1600 -56.7300 0.0000 0.0000 0.0000 0.0000; + 5280 5461 0.00246 0.01871 0.00982 310 0 0 0 0 1 0 0 170.4400 26.4200 -169.7300 -22.0300 0.0000 0.0000 0.0000 0.0000; + 5284 5454 0.00377 0.02759 0.01564 310 0 0 0 0 1 0 0 -118.7900 -14.9900 119.3300 17.4300 0.0000 0.0000 0.0000 0.0000; + 5289 5436 0.00048 0.00367 0.00192 310 0 0 0 0 1 0 0 63.1000 40.7000 -63.0800 -40.6900 0.0000 0.0000 0.0000 0.0000; + 5289 5436 0.00048 0.00367 0.00192 310 0 0 0 0 1 0 0 63.1000 40.7000 -63.0800 -40.6900 0.0000 0.0000 0.0000 0.0000; + 5290 5345 0.00613 0.03593 0.01794 251 0 0 0 0 1 0 0 113.5800 -3.1700 -112.7800 6.0600 0.0000 0.0000 0.0000 0.0000; + 5291 5292 0.00267 0.01563 0.0078 409 0 0 0 0 1 0 0 -205.2100 48.0800 206.4100 -41.8000 0.0000 0.0000 0.0000 0.0000; + 5429 5291 0.00544 0.024 0.01117 187 0 0 0 0 1 0 0 -84.5300 0.7500 84.9200 -0.0900 0.0000 0.0000 0.0000 0.0000; + 5291 5438 0.00699 0.03084 0.01436 187 0 0 0 0 1 0 0 29.9900 -13.8900 -29.9200 12.8000 0.0000 0.0000 0.0000 0.0000; + 5292 5312 0.004 0.01704 0.00852 187 0 0 0 0 1 0 0 54.1700 8.8100 -54.0500 -9.1200 0.0000 0.0000 0.0000 0.0000; + 5293 5338 0.00404 0.03072 0.01613 310 0 0 0 0 1 0 0 159.1200 -3.6400 -158.0700 9.9900 0.0000 0.0000 0.0000 0.0000; + 5293 5338 0.00404 0.03072 0.01613 310 0 0 0 0 1 0 0 159.1200 -3.6400 -158.0700 9.9900 0.0000 0.0000 0.0000 0.0000; + 5293 5402 0.00355 0.02603 0.01475 409 0 0 0 0 1 0 0 -190.6000 -5.2900 191.9100 13.4700 0.0000 0.0000 0.0000 0.0000; + 5293 5402 0.00355 0.02603 0.01475 409 0 0 0 0 1 0 0 -190.6000 -5.2900 191.9100 13.4700 0.0000 0.0000 0.0000 0.0000; + 5296 5295 0.00014 0.00709 0 1233 0 0 1 0 1 0 0 -653.5700 -92.1200 654.1700 122.7100 0.0000 0.0000 0.0000 0.0000; + 5297 5295 0.00085 0.06248 0 223 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5298 5295 0.00015 0.01082 0 525 0 0 1 0 1 0 0 114.6800 58.5300 -114.6600 -56.8000 0.0000 0.0000 0.0000 0.0000; + 5299 5295 0.0003 0.02227 0 524 0 0 1 0 1 0 0 114.6800 58.5300 -114.6400 -55.0200 0.0000 0.0000 0.0000 0.0000; + 5300 5295 0.00025 0.01848 0 519 0 0 1 0 1 0 0 114.6800 58.5300 -114.6500 -55.6100 0.0000 0.0000 0.0000 0.0000; + 5301 5295 0.00058 0.03088 0 403 0 0 1 0 1 0 0 82.4700 42.0900 -82.4300 -39.5800 0.0000 0.0000 0.0000 0.0000; + 5302 5295 0.0003 0.01763 0 1123 0 0 1 0 1 0 0 462.4800 167.5700 -461.8100 -128.1300 0.0000 0.0000 0.0000 0.0000; + 5303 5295 0.00017 0.01315 0 1117 0 0 1 0 1 0 0 462.4800 218.7000 -462.0700 -186.8800 0.0000 0.0000 0.0000 0.0000; + 5304 5295 0.00011 0.00134 0.08928 2020 0 0 0 0 1 0 0 -405.4300 -239.2200 405.6700 232.9700 0.0000 0.0000 0.0000 0.0000; + 5295 5444 0.00069 0.01404 0.97894 2768 0 0 0 0 1 0 0 -411.1500 5.2400 412.3100 -81.8900 0.0000 0.0000 0.0000 0.0000; + 5296 5400 0.00214 0.01566 0.00887 409 0 0 0 0 1 0 0 183.6800 28.4600 -182.9500 -23.9900 0.0000 0.0000 0.0000 0.0000; + 5305 5304 0.00014 0.01047 0 1239 0 0 1 0 1 0 0 -674.7900 -52.6500 675.4300 100.5400 0.0000 0.0000 0.0000 0.0000; + 5307 5341 0.00111 0.00847 0.00445 310 0 0 0 0 1 0 0 -144.9000 -52.9000 145.1600 54.4200 0.0000 0.0000 0.0000 0.0000; + 5307 5341 0.00111 0.00847 0.00445 310 0 0 0 0 1 0 0 -144.9000 -52.9000 145.1600 54.4200 0.0000 0.0000 0.0000 0.0000; + 5351 5308 0.0016 0.01174 0.00665 409 0 0 0 0 1 0 0 182.1000 2.1800 -181.5700 1.0500 0.0000 0.0000 0.0000 0.0000; + 5351 5308 0.0016 0.01174 0.00665 409 0 0 0 0 1 0 0 182.1000 2.1800 -181.5700 1.0500 0.0000 0.0000 0.0000 0.0000; + 5310 5339 0.00596 0.02626 0.01222 187 0 0 0 0 1 0 0 48.2500 -54.5500 -47.9400 54.6500 0.0000 0.0000 0.0000 0.0000; + 5310 5379 0.00162 0.00712 0.00331 409 0 0 0 0 1 0 0 106.6200 87.8300 -106.3200 -86.8200 0.0000 0.0000 0.0000 0.0000; + 5310 5438 0.00421 0.02468 0.01232 251 0 0 0 0 1 0 0 -53.3700 60.7700 53.6400 -60.4000 0.0000 0.0000 0.0000 0.0000; + 5316 5354 0.00517 0.02278 0.01061 187 0 0 0 0 1 0 0 48.2100 76.9100 -47.8000 -76.2000 0.0000 0.0000 0.0000 0.0000; + 5318 5317 0.00013 0.01555 0 1106 0 0 1 0 1 0 0 -359.5800 -9.3500 359.7400 29.2500 0.0000 0.0000 0.0000 0.0000; + 5319 5317 0.00024 0.01893 0 925 0 0 1 0 1 0 0 79.8700 4.9100 -79.8600 -3.7200 0.0000 0.0000 0.0000 0.0000; + 5320 5317 0.00046 0.02092 0 917 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 5321 5317 0.00026 0.01811 0 921 0 0 1 0 1 0 0 79.8700 4.9900 -79.8600 -3.8600 0.0000 0.0000 0.0000 0.0000; + 5388 5317 0.00128 0.01548 1.02824 2020 0 0 0 0 1 0 0 78.9700 -11.3000 -78.8700 -92.9500 0.0000 0.0000 0.0000 0.0000; + 5401 5317 5e-05 0.00111 0.09678 3146 0 0 0 0 1 0 0 -1155.2100 37.6500 1155.8700 -32.9300 0.0000 0.0000 0.0000 0.0000; + 5401 5317 5e-05 0.00111 0.09678 3146 0 0 0 0 1 0 0 -1155.2100 37.6500 1155.8700 -32.9300 0.0000 0.0000 0.0000 0.0000; + 5473 5318 0.00242 0.01844 0.00968 347.2 0 0 0 0 1 0 0 -179.0100 0.2500 179.7900 4.6800 0.0000 0.0000 0.0000 0.0000; + 5473 5318 0.00242 0.01844 0.00968 347.2 0 0 0 0 1 0 0 -179.0100 0.2500 179.7900 4.6800 0.0000 0.0000 0.0000 0.0000; + 5323 5322 0.00012 0.01249 0 1334 0 0 1 0 1 0 0 -607.7900 -53.0900 608.2400 99.4600 0.0000 0.0000 0.0000 0.0000; + 5323 5322 0.00012 0.01249 0 1334 0 0 1 0 1 0 0 -607.7900 -53.0900 608.2400 99.4600 0.0000 0.0000 0.0000 0.0000; + 5324 5322 0.00037 0.02069 0 952 0 0 1 0 1 0 0 283.2900 144.5900 -282.9500 -125.2300 0.0000 0.0000 0.0000 0.0000; + 5325 5322 0.00022 0.0207 0 945 0 0 1 0 1 0 0 283.2900 144.5900 -283.0900 -125.2000 0.0000 0.0000 0.0000 0.0000; + 5326 5322 0.00014 0.00711 0 953 0 0 1 0 1 0 0 283.2900 144.5900 -283.1600 -137.7000 0.0000 0.0000 0.0000 0.0000; + 5322 5384 0.00031 0.00376 0.24969 2020 0 0 0 0 1 0 0 307.8300 0.1200 -307.5400 -22.1400 0.0000 0.0000 0.0000 0.0000; + 5448 5322 0.00014 0.00164 0.10912 2020 0 0 0 0 1 0 0 -176.6100 -148.5200 176.6800 138.2200 0.0000 0.0000 0.0000 0.0000; + 5376 5323 0.00121 0.00887 0.00503 310 0 0 0 0 1 0 0 -116.0700 12.3000 116.2300 -11.6000 0.0000 0.0000 0.0000 0.0000; + 5376 5323 0.00121 0.00887 0.00503 310 0 0 0 0 1 0 0 -116.0700 12.3000 116.2300 -11.6000 0.0000 0.0000 0.0000 0.0000; + 5323 5425 0.00265 0.02018 0.01059 310 0 0 0 0 1 0 0 157.5900 15.5200 -156.9200 -11.5300 0.0000 0.0000 0.0000 0.0000; + 5323 5425 0.00265 0.02018 0.01059 310 0 0 0 0 1 0 0 157.5900 15.5200 -156.9200 -11.5300 0.0000 0.0000 0.0000 0.0000; + 5446 5328 0.00871 0.03704 0.01852 187 0 0 0 0 1 0 0 -8.6800 11.5600 8.7000 -13.3300 0.0000 0.0000 0.0000 0.0000; + 5330 5433 0.00293 0.02226 0.01169 310 0 0 0 0 1 0 0 146.5200 5.7700 -145.8900 -2.1200 0.0000 0.0000 0.0000 0.0000; + 5400 5331 0.00473 0.02774 0.01385 251 0 0 0 0 1 0 0 74.6800 -6.6900 -74.4100 6.8800 0.0000 0.0000 0.0000 0.0000; + 5450 5331 0.00779 0.03434 0.01599 187 0 0 0 0 1 0 0 24.8400 -16.8000 -24.7700 15.5300 0.0000 0.0000 0.0000 0.0000; + 5429 5332 0.00313 0.01379 0.00642 187 0 0 0 0 1 0 0 -49.4800 -27.7900 49.5800 27.6100 0.0000 0.0000 0.0000 0.0000; + 5427 5333 0.00478 0.03636 0.01909 310 0 0 0 0 1 0 0 105.8800 -4.1500 -105.3300 6.4600 0.0000 0.0000 0.0000 0.0000; + 5427 5333 0.00478 0.03636 0.01909 310 0 0 0 0 1 0 0 105.8800 -4.1500 -105.3300 6.4600 0.0000 0.0000 0.0000 0.0000; + 5334 5484 0.01111 0.06511 0.03251 251 0 0 0 0 1 0 0 68.4100 -14.4200 -67.8900 14.1000 0.0000 0.0000 0.0000 0.0000; + 5335 5372 0.00458 0.02019 0.0094 187 0 0 0 0 1 0 0 18.7900 -38.0000 -18.7100 37.4400 0.0000 0.0000 0.0000 0.0000; + 5335 5425 0.00232 0.01697 0.00961 310 0 0 0 0 1 0 0 -134.3200 -2.4500 134.7500 4.6200 0.0000 0.0000 0.0000 0.0000; + 5351 5336 0.00118 0.00899 0.00472 409 0 0 0 0 1 0 0 193.0200 15.2800 -192.5800 -12.3800 0.0000 0.0000 0.0000 0.0000; + 5351 5336 0.00118 0.00899 0.00472 409 0 0 0 0 1 0 0 193.0200 15.2800 -192.5800 -12.3800 0.0000 0.0000 0.0000 0.0000; + 5351 5336 0.00118 0.00899 0.00472 409 0 0 0 0 1 0 0 193.0200 15.2800 -192.5800 -12.3800 0.0000 0.0000 0.0000 0.0000; + 5481 5338 0.00337 0.02561 0.01345 310 0 0 0 0 1 0 0 -117.4500 23.8200 117.9400 -21.3600 0.0000 0.0000 0.0000 0.0000; + 5481 5338 0.00337 0.02561 0.01345 310 0 0 0 0 1 0 0 -117.4500 23.8200 117.9400 -21.3600 0.0000 0.0000 0.0000 0.0000; + 5340 5462 0.00437 0.02559 0.01278 251 0 0 0 0 1 0 0 -77.9700 26.3600 78.2700 -25.8800 0.0000 0.0000 0.0000 0.0000; + 5340 5467 0.00082 0.00348 0.00174 187 0 0 0 0 1 0 0 19.5800 -45.4800 -19.5600 45.4000 0.0000 0.0000 0.0000 0.0000; + 5342 5341 0.01026 0.25106 0 49 0 0 1 0 1 0 0 8.4000 3.2000 -8.3900 -3.0100 0.0000 0.0000 0.0000 0.0000; + 5343 5341 0.00091 0.04835 0 240 0 0 1 0 1 0 0 207.5000 60.2800 -207.1100 -39.4100 0.0000 0.0000 0.0000 0.0000; + 5422 5341 0.00126 0.00925 0.00524 409 0 0 0 0 1 0 0 -158.2300 142.5200 158.7800 -139.0700 0.0000 0.0000 0.0000 0.0000; + 5422 5341 0.00126 0.00925 0.00524 409 0 0 0 0 1 0 0 -158.2300 142.5200 158.7800 -139.0700 0.0000 0.0000 0.0000 0.0000; + 5341 5465 0.00307 0.02252 0.01276 310 0 0 0 0 1 0 0 -118.0200 33.3700 118.4700 -31.3800 0.0000 0.0000 0.0000 0.0000; + 5341 5465 0.00307 0.02252 0.01276 310 0 0 0 0 1 0 0 -118.0200 33.3700 118.4700 -31.3800 0.0000 0.0000 0.0000 0.0000; + 5341 5465 0.00307 0.02252 0.01276 310 0 0 0 0 1 0 0 -118.0200 33.3700 118.4700 -31.3800 0.0000 0.0000 0.0000 0.0000; + 5341 5465 0.00307 0.02252 0.01276 310 0 0 0 0 1 0 0 -118.0200 33.3700 118.4700 -31.3800 0.0000 0.0000 0.0000 0.0000; + 5372 5344 0.00186 0.00821 0.00382 187 0 0 0 0 1 0 0 62.3700 -82.4800 -62.1700 82.9800 0.0000 0.0000 0.0000 0.0000; + 5344 5482 0.00385 0.01695 0.00789 187 0 0 0 0 1 0 0 -21.2600 -16.0700 21.2900 15.3900 0.0000 0.0000 0.0000 0.0000; + 5375 5346 0.00103 0.00605 0.00302 251 0 0 0 0 1 0 0 -13.0000 -69.0700 13.0500 69.0700 0.0000 0.0000 0.0000 0.0000; + 5346 5441 0.00168 0.01277 0.0067 310 0 0 0 0 1 0 0 -166.5400 48.5500 167.0500 -45.3600 0.0000 0.0000 0.0000 0.0000; + 5346 5441 0.00168 0.01277 0.0067 310 0 0 0 0 1 0 0 -166.5400 48.5500 167.0500 -45.3600 0.0000 0.0000 0.0000 0.0000; + 5443 5346 0.0007 0.00512 0.0029 310 0 0 0 0 1 0 0 -114.2700 -33.2900 114.3700 33.7300 0.0000 0.0000 0.0000 0.0000; + 5443 5346 0.0007 0.00512 0.0029 310 0 0 0 0 1 0 0 -114.2700 -33.2900 114.3700 33.7300 0.0000 0.0000 0.0000 0.0000; + 5348 5355 0.0081 0.0357 0.01662 187 0 0 0 0 1 0 0 30.5200 -12.8900 -30.4300 11.6300 0.0000 0.0000 0.0000 0.0000; + 5349 5462 0.00235 0.01326 0.00713 251 0 0 0 0 1 0 0 78.7700 -6.4500 -78.6200 6.5800 0.0000 0.0000 0.0000 0.0000; + 5351 5350 8e-05 0.00906 0 1258 0 0 1 0 1 0 0 -623.6700 -51.0000 623.9800 86.5000 0.0000 0.0000 0.0000 0.0000; + 5351 5350 8e-05 0.00906 0 1258 0 0 1 0 1 0 0 -623.6700 -51.0000 623.9800 86.5000 0.0000 0.0000 0.0000 0.0000; + 5350 5448 0.00061 0.00734 0.48762 2020 0 0 0 0 1 0 0 -114.9700 -48.7800 115.0500 0.2700 0.0000 0.0000 0.0000 0.0000; + 5350 5464 0.00053 0.00645 0.4286 2020 0 0 0 0 1 0 0 -73.2300 -36.2800 73.2600 -6.8300 0.0000 0.0000 0.0000 0.0000; + 5351 5431 0.00463 0.02714 0.01355 251 0 0 0 0 1 0 0 129.8000 2.4300 -129.0200 0.8100 0.0000 0.0000 0.0000 0.0000; + 5376 5353 0.001 0.007 0.005 350 0 0 0 0 1 0 0 9.9300 -53.7100 -9.9000 53.4200 0.0000 0.0000 0.0000 0.0000; + 5376 5353 0.001 0.007 0.005 350 0 0 0 0 1 0 0 9.9300 -53.7100 -9.9000 53.4200 0.0000 0.0000 0.0000 0.0000; + 5353 5468 0.00184 0.01402 0.00736 310 0 0 0 0 1 0 0 148.8300 58.1500 -148.3600 -55.3300 0.0000 0.0000 0.0000 0.0000; + 5355 5445 0.00332 0.02526 0.01326 310 0 0 0 0 1 0 0 -99.3600 -3.4600 99.6900 4.6600 0.0000 0.0000 0.0000 0.0000; + 5355 5445 0.00332 0.02526 0.01326 310 0 0 0 0 1 0 0 -99.3600 -3.4600 99.6900 4.6600 0.0000 0.0000 0.0000 0.0000; + 5386 5356 0.001 0.00567 0.00305 251 0 0 0 0 1 0 0 111.2500 -4.5900 -111.1300 4.9900 0.0000 0.0000 0.0000 0.0000; + 5356 5431 0.00571 0.0323 0.01737 251 0 0 0 0 1 0 0 -44.4300 23.8400 44.5800 -24.7300 0.0000 0.0000 0.0000 0.0000; + 5357 5386 0.00324 0.02375 0.01346 310 0 0 0 0 1 0 0 82.6500 -36.8400 -82.3900 37.4600 0.0000 0.0000 0.0000 0.0000; + 5359 5358 0.00026 0.01828 0 1057 0 0 1 0 1 0 0 -236.1300 -5.6200 236.2700 15.5000 0.0000 0.0000 0.0000 0.0000; + 5360 5358 0.00015 0.0112 0 1333 0 0 1 0 1 0 0 1005.2400 -38.5800 -1003.7500 149.6900 0.0000 0.0000 0.0000 0.0000; + 8155 5358 0.00037 0.0075 0.52342 2768 0 0 0 0 1 0 0 613.4700 84.6800 -612.1100 -111.9400 0.0000 0.0000 0.0000 0.0000; + 5362 5361 0.00018 0.01755 0 646 0 0 1 0 1 0 0 -96.6300 -9.5200 96.6500 11.1700 0.0000 0.0000 0.0000 0.0000; + 5363 5361 0.00057 0.03295 0 282 0 0 1 0 1 0 0 10.3700 -1.1500 -10.3700 1.1900 0.0000 0.0000 0.0000 0.0000; + 5364 5361 0.00014 0.00948 0 798 0 0 1 0 1 0 0 212.7500 -23.6800 -212.6800 28.0200 0.0000 0.0000 0.0000 0.0000; + 5365 5361 0.00026 0.01973 0 787 0 0 1 0 1 0 0 212.7500 -12.2300 -212.6300 21.1900 0.0000 0.0000 0.0000 0.0000; + 5366 5361 0.00038 0.02244 0 795 0 0 1 0 1 0 0 212.7500 -10.7400 -212.5700 20.9200 0.0000 0.0000 0.0000 0.0000; + 5367 5361 0.00031 0.02178 0 809 0 0 1 0 1 0 0 212.7500 -10.6800 -212.6000 20.5700 0.0000 0.0000 0.0000 0.0000; + 5368 5361 0.00022 0.01449 0 798 0 0 1 0 1 0 0 212.7500 -18.8600 -212.6400 25.4700 0.0000 0.0000 0.0000 0.0000; + 5369 5361 0.00041 0.02362 0 796 0 0 1 0 1 0 0 212.7500 -9.9500 -212.5600 20.6600 0.0000 0.0000 0.0000 0.0000; + 5373 5433 0.0024 0.01407 0.00702 263.55 0 0 0 0 1 0 0 -119.5600 -50.4800 119.9800 52.2400 0.0000 0.0000 0.0000 0.0000; + 5385 5374 0.00128 0.00939 0.00532 409 0 0 0 0 1 0 0 225.3100 -41.3000 -224.6500 45.6100 0.0000 0.0000 0.0000 0.0000; + 5385 5374 0.00128 0.00939 0.00532 409 0 0 0 0 1 0 0 225.3100 -41.3000 -224.6500 45.6100 0.0000 0.0000 0.0000 0.0000; + 5385 5374 0.00128 0.00939 0.00532 409 0 0 0 0 1 0 0 225.3100 -41.3000 -224.6500 45.6100 0.0000 0.0000 0.0000 0.0000; + 5377 5477 0.00328 0.01925 0.00961 251 0 0 0 0 1 0 0 -57.2100 -19.7100 57.3300 19.4300 0.0000 0.0000 0.0000 0.0000; + 5470 5378 0.00267 0.01179 0.00549 409 0 0 0 0 1 0 0 -93.2000 -49.3100 93.4900 50.0400 0.0000 0.0000 0.0000 0.0000; + 5379 5442 0.00383 0.02248 0.01122 251 0 0 0 0 1 0 0 -58.4200 40.1400 58.6100 -40.1200 0.0000 0.0000 0.0000 0.0000; + 5381 5380 0.00015 0.00982 0 1057 0 0 1 0 1 0 0 -284.3800 -80.4000 284.5000 88.8500 0.0000 0.0000 0.0000 0.0000; + 5382 5380 0.00021 0.01436 0 786 0 0 1 0 1 0 0 63.5200 106.3800 -63.4900 -104.3100 0.0000 0.0000 0.0000 0.0000; + 5383 5380 0.00023 0.01636 0 787 0 0 1 0 1 0 0 63.5200 106.3800 -63.4900 -104.0300 0.0000 0.0000 0.0000 0.0000; + 5380 5384 0.00026 0.0059 0.51266 3146 0 0 0 0 1 0 0 1135.0100 64.6200 -1131.7400 -43.1600 0.0000 0.0000 0.0000 0.0000; + 5381 5439 0.00275 0.02093 0.01099 310 0 0 0 0 1 0 0 107.8800 24.9600 -107.5500 -23.5300 0.0000 0.0000 0.0000 0.0000; + 5381 5439 0.00275 0.02093 0.01099 310 0 0 0 0 1 0 0 107.8800 24.9600 -107.5500 -23.5300 0.0000 0.0000 0.0000 0.0000; + 5385 5384 4e-05 0.00492 0 2019 0 0 1 0 1 0 0 -924.8600 -28.1000 925.1900 69.6100 0.0000 0.0000 0.0000 0.0000; + 5385 5384 4e-05 0.00492 0 2019 0 0 1 0 1 0 0 -924.8600 -28.1000 925.1900 69.6100 0.0000 0.0000 0.0000 0.0000; + 5387 5429 0.00362 0.01597 0.00743 187 0 0 0 0 1 0 0 -27.8000 2.4400 27.8300 -3.0400 0.0000 0.0000 0.0000 0.0000; + 5469 5387 0.00095 0.00722 0.00379 310 0 0 0 0 1 0 0 168.2800 43.1800 -167.9900 -41.3400 0.0000 0.0000 0.0000 0.0000; + 5389 5388 0.00011 0.00666 0 1064 0 0 1 0 1 0 0 -352.5400 -54.6200 352.6800 62.9000 0.0000 0.0000 0.0000 0.0000; + 5388 8067 0.00062 0.01267 0.8835 2768 0 0 0 0 1 0 0 -303.8600 -0.6300 304.4200 -78.7800 0.0000 0.0000 0.0000 0.0000; + 5389 5393 0.00709 0.04153 0.02074 251 0 0 0 0 1 0 0 85.9900 5.4500 -85.4800 -4.5400 0.0000 0.0000 0.0000 0.0000; + 5391 5390 0.0041 0.10984 0 65 0 0 1 0 1 0 0 -22.3000 0.4200 22.3200 0.1100 0.0000 0.0000 0.0000 0.0000; + 5390 5458 0.00669 0.02948 0.01372 187 0 0 0 0 1 0 0 22.1200 -1.8500 -22.0900 0.5900 0.0000 0.0000 0.0000 0.0000; + 5392 5391 0.01427 0.30897 0 50 0 0 1 0 1 0 0 -7.4900 -2.1200 7.5000 2.3100 0.0000 0.0000 0.0000 0.0000; + 5459 5391 0.00912 0.05206 0.00782 98 0 0 0 0 1 0 0 -14.7700 2.0500 14.7900 -2.7300 0.0000 0.0000 0.0000 0.0000; + 5395 5394 9e-05 0.00527 0 1163 0 0 1 0 1 0 0 725.1600 -18.0500 -724.7100 44.5800 0.0000 0.0000 0.0000 0.0000; + 5399 5394 9e-05 0.01069 0 645 0 0 1 0 1 0 0 124.2000 35.2700 -124.1900 -33.5800 0.0000 0.0000 0.0000 0.0000; + 5396 5395 0.00057 0.04373 0 320 0 0 1 0 1 0 0 -114.2600 -9.0100 114.3300 14.5600 0.0000 0.0000 0.0000 0.0000; + 5397 5396 0.00233 0.0652 0 168 0 0 1 0 1 0 0 54.2900 -15.3200 -54.2200 17.3600 0.0000 0.0000 0.0000 0.0000; + 5398 5397 0.01999 0.78238 0 21 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5402 5401 0.00019 0.01369 0 1174 0 0 1 0 1 0 0 -449.8000 -45.6200 450.1800 73.6200 0.0000 0.0000 0.0000 0.0000; + 5403 5401 0.00028 0.02956 0 426 0 0 1 0 1 0 0 89.1500 45.5000 -89.1300 -42.6600 0.0000 0.0000 0.0000 0.0000; + 5404 5401 0.00027 0.01999 0 435 0 0 1 0 1 0 0 77.2400 45.5000 -77.2100 -43.9500 0.0000 0.0000 0.0000 0.0000; + 5405 5401 0.0003 0.02018 0 440 0 0 1 0 1 0 0 84.7800 45.5000 -84.7500 -43.7000 0.0000 0.0000 0.0000 0.0000; + 5406 5401 0.00024 0.02866 0 433 0 0 1 0 1 0 0 89.1500 45.5000 -89.1300 -42.7500 0.0000 0.0000 0.0000 0.0000; + 5407 5470 0.01779 0.07838 0.03648 187 0 0 0 0 1 0 0 1.9200 1.5700 -1.9200 -5.2800 0.0000 0.0000 0.0000 0.0000; + 5408 5421 0.00543 0.02392 0.01113 187 0 0 0 0 1 0 0 22.8000 -60.3800 -22.5800 60.2000 0.0000 0.0000 0.0000 0.0000; + 5409 5447 0.00189 0.01068 0.00574 251 0 0 0 0 1 0 0 -116.6500 -5.2100 116.9200 6.1600 0.0000 0.0000 0.0000 0.0000; + 5411 5410 0.00015 0.01564 0 1041 0 0 1 0 1 0 0 -333.2800 14.9100 333.4300 1.6700 0.0000 0.0000 0.0000 0.0000; + 5410 5451 0.0004 0.0049 0.32555 2020 0 0 0 0 1 0 0 -9.5300 -34.8600 9.5300 0.7100 0.0000 0.0000 0.0000 0.0000; + 5411 5477 0.00331 0.01942 0.0097 251 0 0 0 0 1 0 0 137.0200 44.6700 -136.3600 -41.8200 0.0000 0.0000 0.0000 0.0000; + 6316 5411 0.00833 0.03543 0.01772 187 0 0 0 0 1 0 0 24.8100 -31.4000 -24.6900 30.0800 0.0000 0.0000 0.0000 0.0000; + 5414 5413 0.00122 0.05952 0 315 0 0 1 0 1 0 0 -35.0500 20.6700 35.0700 -19.7200 0.0000 0.0000 0.0000 0.0000; + 5415 5413 0.00043 0.03186 0 561 0 0 1 0 1 0 0 121.6700 -13.5400 -121.6000 18.3100 0.0000 0.0000 0.0000 0.0000; + 5416 5413 0.00034 0.03222 0 559 0 0 1 0 1 0 0 121.6700 -13.5400 -121.6100 18.3600 0.0000 0.0000 0.0000 0.0000; + 5417 5413 0.00024 0.0284 0 574 0 0 1 0 1 0 0 121.6700 -13.5400 -121.6300 17.7800 0.0000 0.0000 0.0000 0.0000; + 5418 5413 0.00058 0.02748 0 551 0 0 1 0 1 0 0 118.4700 -13.1900 -118.3900 17.0800 0.0000 0.0000 0.0000 0.0000; + 5419 5413 0.00029 0.01611 0 561 0 0 1 0 1 0 0 118.4700 -13.1900 -118.4300 15.4600 0.0000 0.0000 0.0000 0.0000; + 5414 5471 0.01049 0.04462 0.02231 187 0 0 0 0 1 0 0 35.0500 -20.6700 -34.8900 19.0500 0.0000 0.0000 0.0000 0.0000; + 5423 5422 0.00234 0.09836 0 94 0 0 1 0 1 0 0 12.3700 -1.3800 -12.3600 1.5300 0.0000 0.0000 0.0000 0.0000; + 5424 5422 0.00826 0.16541 0 77 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 5432 5430 0.00343 0.02608 0.01369 310 0 0 0 0 1 0 0 85.0600 -34.1000 -84.7700 34.9100 0.0000 0.0000 0.0000 0.0000; + 5435 5471 0.01193 0.05076 0.02538 187 0 0 0 0 1 0 0 -35.4700 -1.5000 35.6100 -0.5300 0.0000 0.0000 0.0000 0.0000; + 5443 5469 0.00205 0.00902 0.0042 380 0 0 0 0 1 0 0 86.8700 21.9400 -86.7000 -21.6200 0.0000 0.0000 0.0000 0.0000; + 5445 5444 0.0002 0.01571 0 1266 0 0 1 0 1 0 0 -431.7500 -45.3300 432.1300 74.9500 0.0000 0.0000 0.0000 0.0000; + 5470 5446 0.00445 0.01961 0.00913 187 0 0 0 0 1 0 0 32.0500 22.4600 -31.9800 -23.0800 0.0000 0.0000 0.0000 0.0000; + 5449 5448 7e-05 0.00805 0 1267 0 0 1 0 1 0 0 -752.6100 49.8000 753.0000 -4.9500 0.0000 0.0000 0.0000 0.0000; + 5448 5479 0.00039 0.00471 0.31303 2020 0 0 0 0 1 0 0 -691.4500 153.2000 693.3900 -161.4600 0.0000 0.0000 0.0000 0.0000; + 5452 5451 0.00023 0.01073 0 960 0 0 1 0 1 0 0 -220.8600 -40.5100 220.9700 45.7100 0.0000 0.0000 0.0000 0.0000; + 5459 5458 0.00338 0.11671 0 80 0 0 1 0 1 0 0 -22.0700 1.1500 22.0900 -0.5900 0.0000 0.0000 0.0000 0.0000; + 5460 5459 0.01905 0.34714 0 35 0 0 1 0 1 0 0 -14.1600 -4.0100 14.2000 4.7700 0.0000 0.0000 0.0000 0.0000; + 6140 5459 0.01042 0.04644 0.00681 149 0 0 0 0 1 0 0 -44.8900 16.5900 45.1200 -16.2500 0.0000 0.0000 0.0000 0.0000; + 5459 6325 0.01669 0.07435 0.0109 149 0 0 0 0 1 0 0 -22.4800 8.2800 22.5700 -8.9600 0.0000 0.0000 0.0000 0.0000; + 5463 5478 0.00106 0.00601 0.00323 409 0 0 0 0 1 0 0 -170.0400 -42.1400 170.3700 43.6900 0.0000 0.0000 0.0000 0.0000; + 5465 5464 8e-05 0.00976 0 1284 0 0 1 0 1 0 0 -692.0500 63.6900 692.4300 -17.5800 0.0000 0.0000 0.0000 0.0000; + 5467 5482 0.00166 0.00971 0.00485 409 0 0 0 0 1 0 0 115.6000 -100.1900 -115.2200 101.9800 0.0000 0.0000 0.0000 0.0000; + 5480 5479 0.00031 0.01505 0 961 0 0 1 0 1 0 0 -408.9500 -45.4700 409.4800 71.2500 0.0000 0.0000 0.0000 0.0000; + 6001 6281 0.00258 0.01473 0.00221 250 0 0 0 0 1 0 0 -15.4600 116.3600 15.8000 -114.6800 0.0000 0.0000 0.0000 0.0000; + 6001 6283 0.01462 0.03576 0.00468 98 0 0 0 0 1 0 0 15.4400 38.9700 -15.2000 -38.8600 0.0000 0.0000 0.0000 0.0000; + 6001 6312 0.00777 0.03462 0.00508 221 0 0 0 0 1 0 0 -103.7900 66.9200 104.9100 -62.4700 0.0000 0.0000 0.0000 0.0000; + 6002 6060 0.00991 0.05949 0.00807 98 0 0 0 0 1 0 0 30.7700 -1.8900 -30.6800 1.6200 0.0000 0.0000 0.0000 0.0000; + 6002 6291 0.00199 0.01285 0.00245 221 0 0 0 0 1 0 0 -19.3000 -8.3500 19.3100 8.1500 0.0000 0.0000 0.0000 0.0000; + 6002 6291 0.00199 0.01285 0.00245 221 0 0 0 0 1 0 0 -19.3000 -8.3500 19.3100 8.1500 0.0000 0.0000 0.0000 0.0000; + 6002 6332 0.00746 0.03326 0.00488 149 0 0 0 0 1 0 0 -24.6400 9.3900 24.6900 -9.6600 0.0000 0.0000 0.0000 0.0000; + 6004 6003 0.00026 0.01763 0 1117 0 0 1 0 1 0 0 370.8400 -65.1700 -370.4800 89.2200 0.0000 0.0000 0.0000 0.0000; + 6006 6003 0.00024 0.01241 0 788 0 0 1 0 1 0 0 212.4200 67.9100 -212.3100 -62.2000 0.0000 0.0000 0.0000 0.0000; + 6007 6003 0.00012 0.00801 0 1069 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 6008 6003 0.00019 0.01445 0 754 0 0 1 0 1 0 0 197.7900 59.6500 -197.7100 -53.9500 0.0000 0.0000 0.0000 0.0000; + 6009 6003 0.00033 0.02418 0 758 0 0 1 0 1 0 0 197.7900 37.3300 -197.6600 -28.2700 0.0000 0.0000 0.0000 0.0000; + 6010 6003 0.00034 0.01683 0 758 0 0 1 0 1 0 0 197.7900 50.2400 -197.6600 -43.7600 0.0000 0.0000 0.0000 0.0000; + 6003 6107 0.00065 0.00791 0.5258 2020 0 0 0 0 1 0 0 357.3000 -41.9600 -356.5200 -4.4600 0.0000 0.0000 0.0000 0.0000; + 6292 6003 0.0002 0.00409 0.28512 2768 0 0 0 0 1 0 0 -817.2100 -144.3800 818.5100 140.9200 0.0000 0.0000 0.0000 0.0000; + 6005 6004 0.00134 0.05853 0 200 0 0 1 0 1 0 0 -99.3300 10.6300 99.4500 -5.0400 0.0000 0.0000 0.0000 0.0000; + 6005 6004 0.00134 0.05853 0 200 0 0 1 0 1 0 0 -99.3300 10.6300 99.4500 -5.0400 0.0000 0.0000 0.0000 0.0000; + 6102 6004 0.00197 0.0205 0.06986 1400 0 0 0 0 1 0 0 576.0200 -17.2600 -569.7500 75.2500 0.0000 0.0000 0.0000 0.0000; + 6012 6005 0.00833 0.0569 0.00968 221 0 0 0 0 1 0 0 -118.4300 34.4000 119.6200 -27.2400 0.0000 0.0000 0.0000 0.0000; + 6012 6005 0.00833 0.0569 0.00968 221 0 0 0 0 1 0 0 -118.4300 34.4000 119.6200 -27.2400 0.0000 0.0000 0.0000 0.0000; + 6005 6117 0.00772 0.04984 0.00951 221 0 0 0 0 1 0 0 -58.0400 5.9200 58.2900 -5.2900 0.0000 0.0000 0.0000 0.0000; + 6005 6117 0.00772 0.04984 0.00951 221 0 0 0 0 1 0 0 -58.0400 5.9200 58.2900 -5.2900 0.0000 0.0000 0.0000 0.0000; + 6011 6068 0.00433 0.03013 0.00493 221 0 0 0 0 1 0 0 54.8800 -7.3300 -54.7500 7.7200 0.0000 0.0000 0.0000 0.0000; + 6163 6011 0.00329 0.02128 0.00406 221 0 0 0 0 1 0 0 79.1000 0.3500 -78.9000 0.5200 0.0000 0.0000 0.0000 0.0000; + 6027 6012 0.00646 0.04503 0.00736 221 0 0 0 0 1 0 0 -110.9000 -8.8000 111.6700 13.4000 0.0000 0.0000 0.0000 0.0000; + 6027 6012 0.00646 0.04503 0.00736 221 0 0 0 0 1 0 0 -110.9000 -8.8000 111.6700 13.4000 0.0000 0.0000 0.0000 0.0000; + 6026 6013 0.00518 0.03346 0.00638 221 0 0 0 0 1 0 0 97.2300 7.1800 -96.7400 -4.6400 0.0000 0.0000 0.0000 0.0000; + 6013 6128 0.0055 0.033 0.00448 98 0 0 0 0 1 0 0 24.5400 -5.2400 -24.5000 5.0100 0.0000 0.0000 0.0000 0.0000; + 6013 6168 0.00398 0.0174 0.00265 149 0 0 0 0 1 0 0 -0.8100 -22.4300 0.8300 22.2500 0.0000 0.0000 0.0000 0.0000; + 6013 6225 0.0082 0.04681 0.00703 98 0 0 0 0 1 0 0 -21.8800 5.4300 21.9200 -5.8800 0.0000 0.0000 0.0000 0.0000; + 6014 6096 0.02367 0.05785 0.00758 98 0 0 0 0 1 0 0 36.6400 -32.5600 -36.1000 33.0800 0.0000 0.0000 0.0000 0.0000; + 6133 6014 0.01059 0.04636 0.00706 149 0 0 0 0 1 0 0 71.8100 -20.9000 -71.2400 22.6600 0.0000 0.0000 0.0000 0.0000; + 6014 6139 0.00975 0.05851 0.00794 98 0 0 0 0 1 0 0 29.0900 8.3300 -29.0000 -8.6300 0.0000 0.0000 0.0000 0.0000; + 6015 6112 0.0199 0.04863 0.00637 98 0 0 0 0 1 0 0 -31.2300 25.0300 31.5500 -24.9000 0.0000 0.0000 0.0000 0.0000; + 6236 6015 0.00985 0.04086 0.00693 149 0 0 0 0 1 0 0 56.8300 -20.5900 -56.4700 21.3600 0.0000 0.0000 0.0000 0.0000; + 6016 6168 0.00378 0.0263 0.0043 221 0 0 0 0 1 0 0 69.4000 40.9400 -69.1600 -39.7000 0.0000 0.0000 0.0000 0.0000; + 6016 6168 0.00378 0.0263 0.0043 221 0 0 0 0 1 0 0 69.4000 40.9400 -69.1600 -39.7000 0.0000 0.0000 0.0000 0.0000; + 6199 6016 0.00208 0.01421 0.00242 221 0 0 0 0 1 0 0 144.7000 -9.7300 -144.2700 12.3900 0.0000 0.0000 0.0000 0.0000; + 6199 6016 0.00208 0.01421 0.00242 221 0 0 0 0 1 0 0 144.7000 -9.7300 -144.2700 12.3900 0.0000 0.0000 0.0000 0.0000; + 6199 6016 0.00208 0.01421 0.00242 221 0 0 0 0 1 0 0 144.7000 -9.7300 -144.2700 12.3900 0.0000 0.0000 0.0000 0.0000; + 6016 6356 0.00315 0.01306 0.00222 400 0 0 0 0 1 0 0 117.5900 -169.0500 -116.2900 174.2300 0.0000 0.0000 0.0000 0.0000; + 6068 6017 0.00427 0.02759 0.00526 221 0 0 0 0 1 0 0 124.8100 2.4500 -124.1600 1.2100 0.0000 0.0000 0.0000 0.0000; + 6068 6017 0.00427 0.02759 0.00526 221 0 0 0 0 1 0 0 124.8100 2.4500 -124.1600 1.2100 0.0000 0.0000 0.0000 0.0000; + 6068 6017 0.00427 0.02759 0.00526 221 0 0 0 0 1 0 0 124.8100 2.4500 -124.1600 1.2100 0.0000 0.0000 0.0000 0.0000; + 6017 6159 0.00233 0.01593 0.00271 221 0 0 0 0 1 0 0 96.3900 -9.0800 -96.1800 10.2700 0.0000 0.0000 0.0000 0.0000; + 6017 6159 0.00233 0.01593 0.00271 221 0 0 0 0 1 0 0 96.3900 -9.0800 -96.1800 10.2700 0.0000 0.0000 0.0000 0.0000; + 6017 6159 0.00233 0.01593 0.00271 221 0 0 0 0 1 0 0 96.3900 -9.0800 -96.1800 10.2700 0.0000 0.0000 0.0000 0.0000; + 6160 6018 0.00176 0.01201 0.00204 221 0 0 0 0 1 0 0 -106.3300 -11.3500 106.5300 12.5500 0.0000 0.0000 0.0000 0.0000; + 6160 6018 0.00176 0.01201 0.00204 221 0 0 0 0 1 0 0 -106.3300 -11.3500 106.5300 12.5500 0.0000 0.0000 0.0000 0.0000; + 6160 6018 0.00176 0.01201 0.00204 221 0 0 0 0 1 0 0 -106.3300 -11.3500 106.5300 12.5500 0.0000 0.0000 0.0000 0.0000; + 6018 6256 0.00261 0.01687 0.00322 221 0 0 0 0 1 0 0 -107.3500 -12.7800 107.6600 14.4600 0.0000 0.0000 0.0000 0.0000; + 6018 6256 0.00261 0.01687 0.00322 221 0 0 0 0 1 0 0 -107.3500 -12.7800 107.6600 14.4600 0.0000 0.0000 0.0000 0.0000; + 6018 6256 0.00261 0.01687 0.00322 221 0 0 0 0 1 0 0 -107.3500 -12.7800 107.6600 14.4600 0.0000 0.0000 0.0000 0.0000; + 6040 6019 0.0008 0.00518 0.00099 221 0 0 0 0 1 0 0 84.0600 10.3300 -84.0000 -10.0500 0.0000 0.0000 0.0000 0.0000; + 6040 6019 0.0008 0.00518 0.00099 221 0 0 0 0 1 0 0 84.0600 10.3300 -84.0000 -10.0500 0.0000 0.0000 0.0000 0.0000; + 6040 6019 0.0008 0.00518 0.00099 221 0 0 0 0 1 0 0 84.0600 10.3300 -84.0000 -10.0500 0.0000 0.0000 0.0000 0.0000; + 6019 6113 0.00154 0.00995 0.0019 221 0 0 0 0 1 0 0 71.3200 17.8000 -71.2300 -17.4400 0.0000 0.0000 0.0000 0.0000; + 6019 6113 0.00154 0.00995 0.0019 221 0 0 0 0 1 0 0 71.3200 17.8000 -71.2300 -17.4400 0.0000 0.0000 0.0000 0.0000; + 6019 6306 0.01058 0.02586 0.00339 98 0 0 0 0 1 0 0 7.5600 10.6700 -7.5400 -10.9600 0.0000 0.0000 0.0000 0.0000; + 6019 6313 0.00538 0.03672 0.00625 221 0 0 0 0 1 0 0 21.3700 -16.4300 -21.3300 16.0800 0.0000 0.0000 0.0000 0.0000; + 6019 6313 0.00538 0.03672 0.00625 221 0 0 0 0 1 0 0 21.3700 -16.4300 -21.3300 16.0800 0.0000 0.0000 0.0000 0.0000; + 6020 6212 0.00352 0.0146 0.00248 149 0 0 0 0 1 0 0 -85.3600 -10.5100 85.6100 11.2900 0.0000 0.0000 0.0000 0.0000; + 6020 6252 0.01082 0.04487 0.00761 149 0 0 0 0 1 0 0 68.8400 5.8300 -68.3400 -4.5500 0.0000 0.0000 0.0000 0.0000; + 6022 6021 0.00033 0.01733 0 948 0 0 1 0 1 0 0 -284.3400 -53.2600 284.6000 67.3100 0.0000 0.0000 0.0000 0.0000; + 6118 6021 0.00013 0.00161 0.10699 2020 0 0 0 0 1 0 0 -501.8500 1.0900 502.1600 -8.5300 0.0000 0.0000 0.0000 0.0000; + 6021 6210 0.00053 0.00643 0.42698 2020 0 0 0 0 1 0 0 -786.7600 -58.7700 789.8800 51.1700 0.0000 0.0000 0.0000 0.0000; + 6023 6022 0.00043 0.02783 0 438 0 0 1 0 1 0 0 -241.3400 -44.8700 241.6000 61.6200 0.0000 0.0000 0.0000 0.0000; + 6315 6022 0.0043 0.03071 0.05598 443 0 0 0 0 1 0 0 -51.5200 -4.0500 51.6400 -0.9200 0.0000 0.0000 0.0000 0.0000; + 6022 6350 0.00257 0.01837 0.03349 443 0 0 0 0 1 0 0 -8.9000 -7.4400 8.9000 3.9900 0.0000 0.0000 0.0000 0.0000; + 6120 6023 0.00776 0.03392 0.00517 221 0 0 0 0 1 0 0 -34.4200 1.8000 34.5100 -1.9100 0.0000 0.0000 0.0000 0.0000; + 6023 6262 0.00666 0.04639 0.00758 221 0 0 0 0 1 0 0 36.9700 4.5600 -36.8800 -4.6700 0.0000 0.0000 0.0000 0.0000; + 6023 6262 0.00666 0.04639 0.00758 221 0 0 0 0 1 0 0 36.9700 4.5600 -36.8800 -4.6700 0.0000 0.0000 0.0000 0.0000; + 6024 6181 0.01205 0.05372 0.00788 221 0 0 0 0 1 0 0 -65.7700 40.6700 66.4600 -38.4000 0.0000 0.0000 0.0000 0.0000; + 6024 6219 0.004 0.02403 0.00326 300 0 0 0 0 1 0 0 -25.9000 121.3000 26.4900 -118.0900 0.0000 0.0000 0.0000 0.0000; + 6024 6330 0.00775 0.04653 0.00631 221 0 0 0 0 1 0 0 6.6800 75.7300 -6.2500 -73.7800 0.0000 0.0000 0.0000 0.0000; + 6025 6060 0.00724 0.04134 0.00621 250 0 0 0 0 1 0 0 38.0100 46.7200 -37.7600 -45.9400 0.0000 0.0000 0.0000 0.0000; + 6121 6025 0.00399 0.02277 0.00342 221 0 0 0 0 1 0 0 22.5300 -96.3900 -22.1400 98.2200 0.0000 0.0000 0.0000 0.0000; + 6025 6337 0.00373 0.02598 0.00425 221 0 0 0 0 1 0 0 -29.0600 65.1800 29.2400 -64.3700 0.0000 0.0000 0.0000 0.0000; + 6025 6337 0.00373 0.02598 0.00425 221 0 0 0 0 1 0 0 -29.0600 65.1800 29.2400 -64.3700 0.0000 0.0000 0.0000 0.0000; + 6352 6025 0.00808 0.01942 0.00264 221 0 0 0 0 1 0 0 23.1700 -97.5100 -22.3800 99.1300 0.0000 0.0000 0.0000 0.0000; + 6026 6182 0.00598 0.04088 0.00695 221 0 0 0 0 1 0 0 95.0400 -5.7900 -94.5000 8.7900 0.0000 0.0000 0.0000 0.0000; + 6236 6026 0.00321 0.02074 0.00396 221 0 0 0 0 1 0 0 107.5600 5.8100 -107.2000 -3.8300 0.0000 0.0000 0.0000 0.0000; + 6236 6026 0.00321 0.02074 0.00396 221 0 0 0 0 1 0 0 107.5600 5.8100 -107.2000 -3.8300 0.0000 0.0000 0.0000 0.0000; + 6027 6181 0.00709 0.0494 0.00808 300 0 0 0 0 1 0 0 156.8300 -0.8100 -155.1400 11.7000 0.0000 0.0000 0.0000 0.0000; + 6126 6028 0.00239 0.01662 0.00272 221 0 0 0 0 1 0 0 0.3600 13.5300 -0.3600 -13.7700 0.0000 0.0000 0.0000 0.0000; + 6126 6028 0.00239 0.01662 0.00272 221 0 0 0 0 1 0 0 0.3600 13.5300 -0.3600 -13.7700 0.0000 0.0000 0.0000 0.0000; + 6028 6223 0.00261 0.01816 0.00297 221 0 0 0 0 1 0 0 -67.0500 -3.1500 67.1700 3.6900 0.0000 0.0000 0.0000 0.0000; + 6028 6223 0.00261 0.01816 0.00297 221 0 0 0 0 1 0 0 -67.0500 -3.1500 67.1700 3.6900 0.0000 0.0000 0.0000 0.0000; + 6028 6289 0.0098 0.05596 0.00841 98 0 0 0 0 1 0 0 31.4800 4.5600 -31.3800 -4.8000 0.0000 0.0000 0.0000 0.0000; + 6029 6221 0.02678 0.11107 0.01885 149 0 0 0 0 1 0 0 46.8600 -19.0600 -46.2100 19.7600 0.0000 0.0000 0.0000 0.0000; + 6329 6029 0.01886 0.07826 0.01328 149 0 0 0 0 1 0 0 54.4200 -16.0500 -53.8400 17.0800 0.0000 0.0000 0.0000 0.0000; + 6031 6030 0.00319 0.1363 0 124 0 0 1 0 1 0 0 -34.9100 -1.4300 34.9500 3.0500 0.0000 0.0000 0.0000 0.0000; + 6030 6172 0.00307 0.02195 0.04002 443 0 0 0 0 1 0 0 68.8300 -4.3900 -68.6900 1.2700 0.0000 0.0000 0.0000 0.0000; + 6030 6188 0.01107 0.07911 0.14424 443 0 0 0 0 1 0 0 -49.5600 -2.5800 49.8200 -10.4500 0.0000 0.0000 0.0000 0.0000; + 6030 7274 0.0079 0.05646 0.10294 443 0 0 0 0 1 0 0 -54.2200 3.9200 54.4500 -12.8900 0.0000 0.0000 0.0000 0.0000; + 6173 6031 0.03353 0.08197 0.01073 98 0 0 0 0 1 0 0 -5.7000 5.8000 5.7300 -6.8400 0.0000 0.0000 0.0000 0.0000; + 6032 6207 0.01092 0.04528 0.00768 149 0 0 0 0 1 0 0 -67.9700 -52.7200 68.7800 55.2700 0.0000 0.0000 0.0000 0.0000; + 6217 6032 0.00379 0.02164 0.00325 98 0 0 0 0 1 0 0 -31.4600 -42.1200 31.5700 42.4100 0.0000 0.0000 0.0000 0.0000; + 6034 6033 0.00014 0.00944 0 1058 0 0 1 0 1 0 0 -411.0600 -96.7100 411.3000 113.3200 0.0000 0.0000 0.0000 0.0000; + 6107 6033 0.00039 0.00803 0.56039 2768 0 0 0 0 1 0 0 665.2900 134.4200 -663.5700 -157.6900 0.0000 0.0000 0.0000 0.0000; + 6033 6342 0.00011 0.00135 0.0896 2020 0 0 0 0 1 0 0 252.2700 44.3700 -252.2000 -52.7600 0.0000 0.0000 0.0000 0.0000; + 6035 6034 0.0004 0.01618 0 540 0 0 1 0 1 0 0 -328.0000 -50.3300 328.4400 68.3000 0.0000 0.0000 0.0000 0.0000; + 6035 6034 0.0004 0.01618 0 540 0 0 1 0 1 0 0 -328.0000 -50.3300 328.4400 68.3000 0.0000 0.0000 0.0000 0.0000; + 6108 6034 0.00498 0.04865 0.0936 548 0 0 0 0 1 0 0 183.3900 -5.4000 -181.7600 11.8700 0.0000 0.0000 0.0000 0.0000; + 6034 6119 0.00307 0.02194 0.04 443 0 0 0 0 1 0 0 0.3200 -16.5000 -0.3100 12.4800 0.0000 0.0000 0.0000 0.0000; + 6034 6255 0.00338 0.02413 0.044 443 0 0 0 0 1 0 0 -147.5200 -14.0400 148.2500 14.7600 0.0000 0.0000 0.0000 0.0000; + 6034 6343 0.00082 0.00798 0.01535 548 0 0 0 0 1 0 0 83.1300 -21.2200 -83.0700 20.2400 0.0000 0.0000 0.0000 0.0000; + 6061 6035 0.00446 0.03049 0.00519 221 0 0 0 0 1 0 0 -105.7600 -1.0400 106.2700 4.0000 0.0000 0.0000 0.0000 0.0000; + 6061 6035 0.00446 0.03049 0.00519 221 0 0 0 0 1 0 0 -105.7600 -1.0400 106.2700 4.0000 0.0000 0.0000 0.0000 0.0000; + 6123 6035 0.00473 0.03056 0.00583 221 0 0 0 0 1 0 0 -94.6800 -12.4100 95.1200 14.6900 0.0000 0.0000 0.0000 0.0000; + 6123 6035 0.00473 0.03056 0.00583 221 0 0 0 0 1 0 0 -94.6800 -12.4100 95.1200 14.6900 0.0000 0.0000 0.0000 0.0000; + 6035 6306 0.00918 0.05241 0.00787 98 0 0 0 0 1 0 0 46.8500 4.7900 -46.6500 -4.3900 0.0000 0.0000 0.0000 0.0000; + 6037 6036 0.00033 0.0183 0 467 0 0 1 0 1 0 0 -262.1600 -11.7900 262.3800 24.1500 0.0000 0.0000 0.0000 0.0000; + 6037 6036 0.00033 0.0183 0 467 0 0 1 0 1 0 0 -262.1600 -11.7900 262.3800 24.1500 0.0000 0.0000 0.0000 0.0000; + 6037 6036 0.00033 0.0183 0 467 0 0 1 0 1 0 0 -262.1600 -11.7900 262.3800 24.1500 0.0000 0.0000 0.0000 0.0000; + 6036 6067 0.00172 0.01789 0.06095 750 0 0 0 0 1 0 0 -236.1600 -11.0800 237.1000 14.5000 0.0000 0.0000 0.0000 0.0000; + 6036 6142 0.00123 0.01275 0.04344 750 0 0 0 0 1 0 0 -290.6700 -13.4600 291.6900 19.4700 0.0000 0.0000 0.0000 0.0000; + 6036 6142 0.00123 0.01275 0.04344 750 0 0 0 0 1 0 0 -290.6700 -13.4600 291.6900 19.4700 0.0000 0.0000 0.0000 0.0000; + 6287 6036 0.00203 0.01984 0.03818 548 0 0 0 0 1 0 0 -65.3300 -2.0600 65.4200 -1.0300 0.0000 0.0000 0.0000 0.0000; + 6036 6334 0.00352 0.02515 0.04586 443 0 0 0 0 1 0 0 -35.0500 -33.4300 35.1200 29.2100 0.0000 0.0000 0.0000 0.0000; + 6094 6037 0.00228 0.01555 0.00264 221 0 0 0 0 1 0 0 -125.3500 13.9300 125.7100 -11.7600 0.0000 0.0000 0.0000 0.0000; + 6094 6037 0.00228 0.01555 0.00264 221 0 0 0 0 1 0 0 -125.3500 13.9300 125.7100 -11.7600 0.0000 0.0000 0.0000 0.0000; + 6220 6037 0.00245 0.01672 0.00284 221 0 0 0 0 1 0 0 -128.7700 -3.2400 129.1700 5.6900 0.0000 0.0000 0.0000 0.0000; + 6220 6037 0.00245 0.01672 0.00284 221 0 0 0 0 1 0 0 -128.7700 -3.2400 129.1700 5.6900 0.0000 0.0000 0.0000 0.0000; + 6220 6037 0.00245 0.01672 0.00284 221 0 0 0 0 1 0 0 -128.7700 -3.2400 129.1700 5.6900 0.0000 0.0000 0.0000 0.0000; + 6039 6038 0.00027 0.0133 0 1269 0 0 1 0 1 0 0 -521.6100 -113.5100 522.3700 150.8800 0.0000 0.0000 0.0000 0.0000; + 6041 6038 0.0004 0.02009 0 296 0 0 1 0 1 0 0 0.0000 20.4800 0.0000 -20.4000 0.0000 0.0000 0.0000 0.0000; + 6042 6038 0.00042 0.03102 0 479 0 0 1 0 1 0 0 0.0000 47.5300 0.0100 -46.8800 0.0000 0.0000 0.0000 0.0000; + 6038 6066 0.00105 0.01278 0.84902 2020 0 0 0 0 1 0 0 -306.4000 -16.7200 307.3500 -61.1600 0.0000 0.0000 0.0000 0.0000; + 6254 6038 0.00024 0.00295 0.19592 2020 0 0 0 0 1 0 0 309.4500 -145.8800 -309.1900 128.5400 0.0000 0.0000 0.0000 0.0000; + 6349 6038 0.00017 0.002 0.13292 2020 0 0 0 0 1 0 0 -93.1400 182.2300 93.2100 -195.4200 0.0000 0.0000 0.0000 0.0000; + 6040 6039 0.00064 0.0344 0 285.39 0 0 1 0 1 0 0 -197.8500 -28.4300 198.1000 42.3500 0.0000 0.0000 0.0000 0.0000; + 6040 6039 0.00064 0.0344 0 285.39 0 0 1 0 1 0 0 -197.8500 -28.4300 198.1000 42.3500 0.0000 0.0000 0.0000 0.0000; + 6222 6039 0.00129 0.00919 0.01675 443 0 0 0 0 1 0 0 -125.1900 -29.0000 125.4000 28.8100 0.0000 0.0000 0.0000 0.0000; + 6040 6224 0.00927 0.03846 0.00653 149 0 0 0 0 1 0 0 62.7200 2.9900 -62.3500 -2.0900 0.0000 0.0000 0.0000 0.0000; + 6043 6236 0.0039 0.02665 0.00453 221 0 0 0 0 1 0 0 -52.9400 -17.2100 53.0600 17.5800 0.0000 0.0000 0.0000 0.0000; + 6043 6236 0.0039 0.02665 0.00453 221 0 0 0 0 1 0 0 -52.9400 -17.2100 53.0600 17.5800 0.0000 0.0000 0.0000 0.0000; + 6335 6043 0.00217 0.01509 0.00247 221 0 0 0 0 1 0 0 21.2200 3.6200 -21.2100 -3.8000 0.0000 0.0000 0.0000 0.0000; + 6335 6043 0.00217 0.01509 0.00247 221 0 0 0 0 1 0 0 21.2200 3.6200 -21.2100 -3.8000 0.0000 0.0000 0.0000 0.0000; + 6044 6203 0.00617 0.02696 0.00411 149 0 0 0 0 1 0 0 57.1800 -7.5700 -56.9700 8.0600 0.0000 0.0000 0.0000 0.0000; + 6204 6044 0.00268 0.01111 0.00189 149 0 0 0 0 1 0 0 -19.0400 23.2200 19.0600 -23.3100 0.0000 0.0000 0.0000 0.0000; + 6044 6284 0.00593 0.02596 0.00395 149 0 0 0 0 1 0 0 -68.9200 2.8500 69.2100 -2.0000 0.0000 0.0000 0.0000 0.0000; + 6044 6323 0.0021 0.01432 0.00244 221 0 0 0 0 1 0 0 -12.8000 11.4200 12.8100 -11.6200 0.0000 0.0000 0.0000 0.0000; + 6044 6323 0.0021 0.01432 0.00244 221 0 0 0 0 1 0 0 -12.8000 11.4200 12.8100 -11.6200 0.0000 0.0000 0.0000 0.0000; + 6046 6045 8e-05 0.0073 0 1198 0 0 1 0 1 0 0 -779.7000 -49.7600 780.1700 92.5500 0.0000 0.0000 0.0000 0.0000; + 6048 6045 0.0014 0.07775 0 233 0 0 1 0 1 0 0 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6049 6045 0.00046 0.04414 0 283 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6050 6045 0.00056 0.04367 0 256 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 6051 6045 0.00035 0.0254 0 351 0 0 1 0 1 0 0 57.2400 29.2200 -57.2300 -28.2400 0.0000 0.0000 0.0000 0.0000; + 6052 6045 0.00074 0.03404 0 342 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 6053 6045 0.00028 0.02922 0 352 0 0 1 0 1 0 0 57.2400 29.2200 -57.2300 -28.0900 0.0000 0.0000 0.0000 0.0000; + 6054 6045 0.00061 0.05567 0 338 0 0 1 0 1 0 0 57.2400 26.1400 -57.2200 -24.1000 0.0000 0.0000 0.0000 0.0000; + 6066 6045 0.00059 0.00714 0.47436 2020 0 0 0 0 1 0 0 458.4300 -54.6100 -457.2500 18.9700 0.0000 0.0000 0.0000 0.0000; + 6210 6045 0.00142 0.01727 1.14708 2020 0 0 0 0 1 0 0 289.2700 -26.5100 -288.1400 -81.6000 0.0000 0.0000 0.0000 0.0000; + 6045 6234 0.00031 0.0037 0.24613 2020 0 0 0 0 1 0 0 136.9000 50.5200 -136.8300 -75.5700 0.0000 0.0000 0.0000 0.0000; + 6047 6046 0.00056 0.0418 0 320 0 0 1 0 1 0 0 -192.5600 -5.0200 192.7700 20.1000 0.0000 0.0000 0.0000 0.0000; + 6047 6046 0.00056 0.0418 0 320 0 0 1 0 1 0 0 -192.5600 -5.0200 192.7700 20.1000 0.0000 0.0000 0.0000 0.0000; + 6198 6046 0.00141 0.01004 0.0183 523 0 0 0 0 1 0 0 -181.7400 -28.5300 182.2000 29.9300 0.0000 0.0000 0.0000 0.0000; + 6046 6285 0.00296 0.02891 0.05562 647 0 0 0 0 1 0 0 211.9700 -20.3700 -210.6800 27.1300 0.0000 0.0000 0.0000 0.0000; + 6047 6150 0.00335 0.02337 0.00382 221 0 0 0 0 1 0 0 83.0400 -30.1000 -82.7800 31.4800 0.0000 0.0000 0.0000 0.0000; + 6047 6150 0.00335 0.02337 0.00382 221 0 0 0 0 1 0 0 83.0400 -30.1000 -82.7800 31.4800 0.0000 0.0000 0.0000 0.0000; + 6291 6047 0.00187 0.01206 0.0023 221 0 0 0 0 1 0 0 -34.5700 -13.9600 34.6000 13.8900 0.0000 0.0000 0.0000 0.0000; + 6291 6047 0.00187 0.01206 0.0023 221 0 0 0 0 1 0 0 -34.5700 -13.9600 34.6000 13.8900 0.0000 0.0000 0.0000 0.0000; + 6226 6055 0.018 0.10807 0.01467 98 0 0 0 0 1 0 0 -25.5900 -3.0900 25.7000 2.2500 0.0000 0.0000 0.0000 0.0000; + 6055 6286 0.00882 0.0504 0.00757 98 0 0 0 0 1 0 0 -30.6300 -3.6400 30.7100 3.3000 0.0000 0.0000 0.0000 0.0000; + 6057 6056 0.00023 0.01095 0 1171 0 0 1 0 1 0 0 -474.9900 -28.1200 475.4900 51.9800 0.0000 0.0000 0.0000 0.0000; + 6056 6066 0.00014 0.00165 0.10973 2020 0 0 0 0 1 0 0 665.0100 -158.1600 -664.3900 153.9400 0.0000 0.0000 0.0000 0.0000; + 6161 6056 0.00011 0.00227 0.15827 3146 0 0 0 0 1 0 0 973.3100 -0.4700 -972.3200 4.2900 0.0000 0.0000 0.0000 0.0000; + 6298 6056 8e-05 0.001 0.06674 2020 0 0 0 0 1 0 0 168.2100 -108.5100 -168.1800 101.8900 0.0000 0.0000 0.0000 0.0000; + 6058 6057 0.00061 0.02173 0 328 0 0 1 0 1 0 0 -193.1600 -25.6400 193.3800 33.7000 0.0000 0.0000 0.0000 0.0000; + 6058 6057 0.00061 0.02173 0 328 0 0 1 0 1 0 0 -193.1600 -25.6400 193.3800 33.7000 0.0000 0.0000 0.0000 0.0000; + 6067 6057 0.001 0.00977 0.01879 548 0 0 0 0 1 0 0 -13.5900 7.4500 13.5900 -9.3800 0.0000 0.0000 0.0000 0.0000; + 6057 6177 0.00628 0.06139 0.11812 548 0 0 0 0 1 0 0 74.6300 -29.9100 -74.2600 21.1300 0.0000 0.0000 0.0000 0.0000; + 6058 6124 0.00613 0.04269 0.00698 221 0 0 0 0 1 0 0 90.9800 3.1100 -90.4900 -0.3600 0.0000 0.0000 0.0000 0.0000; + 6058 6124 0.00613 0.04269 0.00698 221 0 0 0 0 1 0 0 90.9800 3.1100 -90.4900 -0.3600 0.0000 0.0000 0.0000 0.0000; + 6058 6124 0.00613 0.04269 0.00698 221 0 0 0 0 1 0 0 90.9800 3.1100 -90.4900 -0.3600 0.0000 0.0000 0.0000 0.0000; + 6300 6058 0.00293 0.01895 0.00362 221 0 0 0 0 1 0 0 65.4000 9.0800 -65.2700 -8.6500 0.0000 0.0000 0.0000 0.0000; + 6357 6059 0.01709 0.07089 0.01203 149 0 0 0 0 1 0 0 30.8200 -14.9000 -30.6300 14.4200 0.0000 0.0000 0.0000 0.0000; + 6060 6157 0.00969 0.05535 0.00832 221 0 0 0 0 1 0 0 30.7700 -0.2900 -30.6800 -0.0400 0.0000 0.0000 0.0000 0.0000; + 6314 6060 0.00648 0.02889 0.00424 149 0 0 0 0 1 0 0 36.9900 -23.3800 -36.8700 23.4900 0.0000 0.0000 0.0000 0.0000; + 6061 6219 0.00959 0.02345 0.00307 221 0 0 0 0 1 0 0 30.1900 -36.5300 -29.9700 36.7600 0.0000 0.0000 0.0000 0.0000; + 6061 6224 0.01257 0.03074 0.00403 98 0 0 0 0 1 0 0 33.4200 -3.3000 -33.2700 3.2600 0.0000 0.0000 0.0000 0.0000; + 6063 6062 0.00012 0.00745 0 1206 0 0 1 0 1 0 0 -728.4900 -16.3100 729.1100 54.6800 0.0000 0.0000 0.0000 0.0000; + 6075 6062 0.0006 0.00726 0.48242 2020 0 0 0 0 1 0 0 379.0200 -35.0200 -378.1900 -5.0800 0.0000 0.0000 0.0000 0.0000; + 7199 6062 0.00097 0.01173 0.77933 2020 0 0 0 0 1 0 0 352.0700 -17.7900 -350.9200 -49.6000 0.0000 0.0000 0.0000 0.0000; + 6064 6063 0.00104 0.04096 0 200 0 0 1 0 1 0 0 -140.9400 -8.8800 141.1500 16.9100 0.0000 0.0000 0.0000 0.0000; + 6063 6192 0.00419 0.04091 0.07872 647 0 0 0 0 1 0 0 286.0200 -1.3100 -282.7000 25.7100 0.0000 0.0000 0.0000 0.0000; + 8094 6063 0.00384 0.03753 0.07222 800 0 0 0 0 1 0 0 -297.9400 24.9500 301.3200 0.7100 0.0000 0.0000 0.0000 0.0000; + 6064 6341 0.01342 0.05869 0.00894 149 0 0 0 0 1 0 0 58.4700 -14.4800 -57.9900 15.6600 0.0000 0.0000 0.0000 0.0000; + 6065 6262 0.00781 0.04461 0.0067 98 0 0 0 0 1 0 0 -13.0300 6.0700 13.0400 -6.6400 0.0000 0.0000 0.0000 0.0000; + 6067 6066 0.00017 0.00814 0 1115 0 0 1 0 1 0 0 -521.5700 -57.4000 522.0200 78.9500 0.0000 0.0000 0.0000 0.0000; + 6069 6066 0.00023 0.01215 0 667 0 0 1 0 1 0 0 123.8200 30.7500 -123.7900 -28.8800 0.0000 0.0000 0.0000 0.0000; + 6070 6066 0.00044 0.02944 0 677 0 0 1 0 1 0 0 131.3000 13.7300 -131.2300 -8.8900 0.0000 0.0000 0.0000 0.0000; + 6071 6066 0.00013 0.00964 0 670 0 0 1 0 1 0 0 105.9100 39.6900 -105.8900 -38.5200 0.0000 0.0000 0.0000 0.0000; + 6072 6066 0.00026 0.02419 0 679 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 6073 6066 0.00026 0.01616 0 664 0 0 1 0 1 0 0 131.3000 23.4200 -131.2600 -20.7100 0.0000 0.0000 0.0000 0.0000; + 6074 6066 0.00036 0.01602 0 666 0 0 1 0 1 0 0 131.3000 22.7800 -131.2400 -20.1000 0.0000 0.0000 0.0000 0.0000; + 6068 6067 0.00105 0.0432 0 300 0 0 1 0 1 0 0 -159.8400 -7.5300 160.1000 18.3100 0.0000 0.0000 0.0000 0.0000; + 6068 6067 0.00105 0.0432 0 300 0 0 1 0 1 0 0 -159.8400 -7.5300 160.1000 18.3100 0.0000 0.0000 0.0000 0.0000; + 6279 6067 0.00289 0.02062 0.0376 443 0 0 0 0 1 0 0 22.1600 -2.6300 -22.1400 -1.1800 0.0000 0.0000 0.0000 0.0000; + 6076 6075 0.00022 0.01507 0 1058 0 0 1 0 1 0 0 -263.2200 14.3200 263.3700 -4.2700 0.0000 0.0000 0.0000 0.0000; + 6078 6075 0.00016 0.01164 0 1159 0 0 1 0 1 0 0 477.3300 -68.7300 -476.9600 95.2000 0.0000 0.0000 0.0000 0.0000; + 6079 6075 9e-05 0.00542 0 1165 0 0 1 0 1 0 0 328.9400 -68.7300 -328.8500 74.6500 0.0000 0.0000 0.0000 0.0000; + 6080 6075 8e-05 0.0074 0 1152 0 0 1 0 1 0 0 328.9400 -68.7300 -328.8600 76.8400 0.0000 0.0000 0.0000 0.0000; + 6075 6101 0.00034 0.00413 0.27429 2020 0 0 0 0 1 0 0 432.0400 -112.7800 -431.4000 91.9600 0.0000 0.0000 0.0000 0.0000; + 7018 6075 0.00154 0.01865 1.23907 2020 0 0 0 0 1 0 0 -60.1700 -34.0700 60.2400 -94.6300 0.0000 0.0000 0.0000 0.0000; + 6077 6076 0.0007 0.0251 0 185.22 0 0 1 0 1 0 0 -150.9000 5.6200 151.0500 -0.1200 0.0000 0.0000 0.0000 0.0000; + 6102 6076 0.00351 0.02507 0.04571 850 0 0 0 0 1 0 0 -138.2400 20.7800 138.9000 -20.8200 0.0000 0.0000 0.0000 0.0000; + 6188 6076 0.00528 0.03774 0.0688 443 0 0 0 0 1 0 0 26.7700 -13.4800 -26.7300 6.6200 0.0000 0.0000 0.0000 0.0000; + 6077 6135 0.01114 0.04621 0.00784 149 0 0 0 0 1 0 0 59.5500 14.5000 -59.1500 -13.6400 0.0000 0.0000 0.0000 0.0000; + 6077 6311 0.01033 0.04605 0.00675 149 0 0 0 0 1 0 0 91.3500 -20.1200 -90.4800 23.2800 0.0000 0.0000 0.0000 0.0000; + 6082 6081 0.00602 0.1165 0 80 0 0 1 0 1 0 0 41.3700 13.8500 -41.2700 -11.8000 0.0000 0.0000 0.0000 0.0000; + 6083 6081 0.00631 0.2531 0 80 0 0 1 0 1 0 0 65.3000 10.3800 -65.0500 -0.1500 0.0000 0.0000 0.0000 0.0000; + 6081 6156 0.00412 0.01838 0.0027 156.45 0 0 0 0 1 0 0 90.0200 18.3500 -89.6900 -17.1400 0.0000 0.0000 0.0000 0.0000; + 6212 6081 0.00581 0.0241 0.00409 149 0 0 0 0 1 0 0 -16.2800 6.0300 16.2900 -6.3900 0.0000 0.0000 0.0000 0.0000; + 6085 6084 0.01088 0.45298 0 31 0 0 1 0 1 0 0 1.0500 0.0000 -1.0500 0.0000 0.0000 0.0000 0.0000 0.0000; + 6086 6084 0.00567 0.21309 0 41 0 0 1 0 1 0 0 22.5000 -0.0000 -22.4700 1.0700 0.0000 0.0000 0.0000 0.0000; + 6087 6084 0.01529 0.2834 0 43 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6088 6084 0.00292 0.0945 0 25 0 0 1 0 1 0 0 7.9500 -0.0000 -7.9500 0.0600 0.0000 0.0000 0.0000 0.0000; + 6089 6084 0.00558 0.2567 0 25 0 0 1 0 1 0 0 10.4200 -0.0000 -10.4100 0.2800 0.0000 0.0000 0.0000 0.0000; + 6090 6084 0.00213 0.09907 0 46 0 0 1 0 1 0 0 30.5200 -0.0000 -30.5000 0.9100 0.0000 0.0000 0.0000 0.0000; + 6084 6136 0.00536 0.03659 0.00622 221 0 0 0 0 1 0 0 101.7500 -27.7200 -101.1700 31.1100 0.0000 0.0000 0.0000 0.0000; + 6084 6355 0.00317 0.01386 0.00211 221 0 0 0 0 1 0 0 -29.3700 25.4000 29.4200 -25.4100 0.0000 0.0000 0.0000 0.0000; + 6091 6176 0.01965 0.04804 0.00629 221 0 0 0 0 1 0 0 -56.8800 38.8100 57.8000 -37.2000 0.0000 0.0000 0.0000 0.0000; + 6251 6091 0.00626 0.03578 0.00538 102.9 0 0 0 0 1 0 0 -18.9900 -31.9900 19.0800 31.9400 0.0000 0.0000 0.0000 0.0000; + 6265 6092 0.03066 0.13415 0.02043 221 0 0 0 0 1 0 0 108.8700 -26.6900 -105.1600 40.7500 0.0000 0.0000 0.0000 0.0000; + 6092 6340 0.02123 0.09289 0.01415 221 0 0 0 0 1 0 0 69.5000 -2.3300 -68.5300 5.0800 0.0000 0.0000 0.0000 0.0000; + 6094 6093 0.01077 0.02588 0.00351 98 0 0 0 0 1 0 0 37.4100 13.9700 -37.2500 -13.9200 0.0000 0.0000 0.0000 0.0000; + 6093 6191 0.00537 0.02229 0.00378 149 0 0 0 0 1 0 0 -3.2900 2.4400 3.3000 -2.8100 0.0000 0.0000 0.0000 0.0000; + 6094 6352 0.00312 0.02171 0.00355 221 0 0 0 0 1 0 0 72.6600 -30.5400 -72.4700 31.5000 0.0000 0.0000 0.0000 0.0000; + 6094 6352 0.00312 0.02171 0.00355 221 0 0 0 0 1 0 0 72.6600 -30.5400 -72.4700 31.5000 0.0000 0.0000 0.0000 0.0000; + 6116 6095 0.02712 0.06628 0.00868 98 0 0 0 0 1 0 0 -17.4900 -3.4500 17.5700 2.7900 0.0000 0.0000 0.0000 0.0000; + 6095 6353 0.00442 0.03018 0.00514 221 0 0 0 0 1 0 0 -54.7700 23.3600 54.9200 -22.8100 0.0000 0.0000 0.0000 0.0000; + 6095 6353 0.00442 0.03018 0.00514 221 0 0 0 0 1 0 0 -54.7700 23.3600 54.9200 -22.8100 0.0000 0.0000 0.0000 0.0000; + 6095 6358 0.00976 0.04048 0.00687 250 0 0 0 0 1 0 0 23.5900 -68.8800 -23.0800 70.2800 0.0000 0.0000 0.0000 0.0000; + 6196 6096 0.02156 0.08942 0.01517 149 0 0 0 0 1 0 0 -45.4000 -15.6700 45.8900 16.1100 0.0000 0.0000 0.0000 0.0000; + 6096 6202 0.01774 0.10129 0.01522 98 0 0 0 0 1 0 0 -13.9000 15.2100 13.9800 -16.3700 0.0000 0.0000 0.0000 0.0000; + 6096 6340 0.02271 0.13634 0.0185 98 0 0 0 0 1 0 0 -21.6700 11.2700 21.8000 -12.4100 0.0000 0.0000 0.0000 0.0000; + 6097 6220 0.00366 0.025 0.00425 221 0 0 0 0 1 0 0 -65.5600 -17.4700 65.7300 18.2000 0.0000 0.0000 0.0000 0.0000; + 6097 6220 0.00366 0.025 0.00425 221 0 0 0 0 1 0 0 -65.5600 -17.4700 65.7300 18.2000 0.0000 0.0000 0.0000 0.0000; + 6097 6225 0.01044 0.04569 0.00696 149 0 0 0 0 1 0 0 25.7600 5.0900 -25.6800 -5.4700 0.0000 0.0000 0.0000 0.0000; + 6098 6123 0.00317 0.02048 0.00391 221 0 0 0 0 1 0 0 -60.3800 -2.8400 60.5000 3.2300 0.0000 0.0000 0.0000 0.0000; + 6098 6123 0.00317 0.02048 0.00391 221 0 0 0 0 1 0 0 -60.3800 -2.8400 60.5000 3.2300 0.0000 0.0000 0.0000 0.0000; + 6098 6208 0.00691 0.01691 0.00221 98 0 0 0 0 1 0 0 8.1500 -30.2100 -8.0800 30.1700 0.0000 0.0000 0.0000 0.0000; + 6098 6289 0.00552 0.02415 0.00368 149 0 0 0 0 1 0 0 -19.6000 -1.5700 19.6300 1.3100 0.0000 0.0000 0.0000 0.0000; + 6099 6204 0.00266 0.01519 0.00228 98 0 0 0 0 1 0 0 19.9600 -8.8800 -19.9500 8.7200 0.0000 0.0000 0.0000 0.0000; + 6099 6225 0.0031 0.01769 0.00266 98 0 0 0 0 1 0 0 49.9500 21.1500 -49.8600 -20.8900 0.0000 0.0000 0.0000 0.0000; + 6099 6310 0.00667 0.02767 0.0047 149 0 0 0 0 1 0 0 -91.2900 -18.3300 91.8700 20.2600 0.0000 0.0000 0.0000 0.0000; + 6100 6128 0.01671 0.10034 0.01362 98 0 0 0 0 1 0 0 25.3900 2.3800 -25.2800 -3.0800 0.0000 0.0000 0.0000 0.0000; + 6180 6100 0.00956 0.0418 0.00637 149 0 0 0 0 1 0 0 55.2100 -23.0200 -54.8700 23.8900 0.0000 0.0000 0.0000 0.0000; + 6283 6100 0.00566 0.0323 0.00485 98 0 0 0 0 1 0 0 8.3200 36.9100 -8.2400 -36.9500 0.0000 0.0000 0.0000 0.0000; + 6102 6101 0.00013 0.0085 0 1307 0 0 1 0 1 0 0 -672.1100 10.0100 672.6800 26.8200 0.0000 0.0000 0.0000 0.0000; + 6104 6101 0.00031 0.02423 0 378 0 0 1 0 1 0 0 60.3300 30.7900 -60.3200 -29.7400 0.0000 0.0000 0.0000 0.0000; + 6105 6101 0.00037 0.03898 0 368 0 0 1 0 1 0 0 60.3300 30.7900 -60.3200 -29.1200 0.0000 0.0000 0.0000 0.0000; + 6106 6101 0.00018 0.00963 0 560 0 0 1 0 1 0 0 120.6700 61.5900 -120.6400 -59.9200 0.0000 0.0000 0.0000 0.0000; + 6103 6102 0.00102 0.04506 0 439 0 0 1 0 1 0 0 -233.8000 37.3400 234.3400 -13.5300 0.0000 0.0000 0.0000 0.0000; + 6103 6117 0.00862 0.06005 0.00982 221 0 0 0 0 1 0 0 72.3100 0.4800 -71.8900 1.4400 0.0000 0.0000 0.0000 0.0000; + 6103 6117 0.00862 0.06005 0.00982 221 0 0 0 0 1 0 0 72.3100 0.4800 -71.8900 1.4400 0.0000 0.0000 0.0000 0.0000; + 6103 6183 0.01177 0.05149 0.00784 149 0 0 0 0 1 0 0 54.9600 14.9500 -54.6000 -14.1900 0.0000 0.0000 0.0000 0.0000; + 6108 6107 0.00061 0.04374 0 380 0 0 1 0 1 0 0 -1.5200 -45.1300 1.5300 46.0000 0.0000 0.0000 0.0000 0.0000; + 6110 6107 0.00015 0.01079 0 1181 0 0 1 0 1 0 0 301.2100 88.0400 -301.0700 -78.2200 0.0000 0.0000 0.0000 0.0000; + 6111 6107 0.00014 0.01069 0 1208 0 0 1 0 1 0 0 293.6600 88.9400 -293.5400 -79.6300 0.0000 0.0000 0.0000 0.0000; + 6107 8082 0.00113 0.01368 0.90909 2020 0 0 0 0 1 0 0 -176.4300 -44.6400 176.7600 -48.1300 0.0000 0.0000 0.0000 0.0000; + 6109 6108 0.00252 0.10367 0 137 0 0 1 0 1 0 0 -48.9300 -2.6400 48.9900 5.1000 0.0000 0.0000 0.0000 0.0000; + 6108 6192 0.00493 0.03524 0.06426 523 0 0 0 0 1 0 0 -230.8600 45.4300 233.5500 -32.8100 0.0000 0.0000 0.0000 0.0000; + 6338 6109 0.03888 0.09504 0.01244 98 0 0 0 0 1 0 0 -34.0300 1.3200 34.4900 -1.4500 0.0000 0.0000 0.0000 0.0000; + 6113 6175 0.00078 0.00501 0.00096 221 0 0 0 0 1 0 0 33.5400 18.8600 -33.5300 -18.8800 0.0000 0.0000 0.0000 0.0000; + 6113 6175 0.00078 0.00501 0.00096 221 0 0 0 0 1 0 0 33.5400 18.8600 -33.5300 -18.8800 0.0000 0.0000 0.0000 0.0000; + 6113 6345 0.00258 0.01129 0.00172 149 0 0 0 0 1 0 0 54.8600 -8.6600 -54.7800 8.8500 0.0000 0.0000 0.0000 0.0000; + 6114 6204 0.01029 0.04585 0.00672 149 0 0 0 0 1 0 0 -53.6000 -7.2800 53.9100 7.9800 0.0000 0.0000 0.0000 0.0000; + 6114 6261 0.00516 0.03097 0.0042 98 0 0 0 0 1 0 0 -16.9400 -12.7100 16.9600 12.4300 0.0000 0.0000 0.0000 0.0000; + 6159 6115 0.00432 0.02954 0.00503 221 0 0 0 0 1 0 0 60.4600 19.8600 -60.2900 -19.1800 0.0000 0.0000 0.0000 0.0000; + 6159 6115 0.00432 0.02954 0.00503 221 0 0 0 0 1 0 0 60.4600 19.8600 -60.2900 -19.1800 0.0000 0.0000 0.0000 0.0000; + 6115 6191 0.0085 0.03718 0.00566 149 0 0 0 0 1 0 0 -48.4300 4.7800 48.6300 -4.4600 0.0000 0.0000 0.0000 0.0000; + 6115 6225 0.0095 0.05707 0.00774 98 0 0 0 0 1 0 0 6.3500 6.5700 -6.3400 -7.2900 0.0000 0.0000 0.0000 0.0000; + 6115 6250 0.00313 0.01394 0.00204 149 0 0 0 0 1 0 0 31.5300 -10.1300 -31.5000 10.0800 0.0000 0.0000 0.0000 0.0000; + 6181 6116 0.01119 0.06392 0.00961 98 0 0 0 0 1 0 0 39.5600 12.7800 -39.3700 -12.6600 0.0000 0.0000 0.0000 0.0000; + 6119 6118 0.00021 0.01219 0 1133 0 0 1 0 1 0 0 -519.8500 -116.8400 520.4300 150.7900 0.0000 0.0000 0.0000 0.0000; + 6118 6349 9e-05 0.00182 0.12727 2768 0 0 0 0 1 0 0 -18.5900 -151.8800 18.6000 138.8000 0.0000 0.0000 0.0000 0.0000; + 6120 6119 0.00056 0.0289 0 350 0 0 1 0 1 0 0 -196.5900 -29.5900 196.8100 41.0500 0.0000 0.0000 0.0000 0.0000; + 6120 6119 0.00056 0.0289 0 350 0 0 1 0 1 0 0 -196.5900 -29.5900 196.8100 41.0500 0.0000 0.0000 0.0000 0.0000; + 6119 6354 0.00095 0.00925 0.01779 548 0 0 0 0 1 0 0 126.5400 22.2700 -126.3800 -22.5700 0.0000 0.0000 0.0000 0.0000; + 6290 6120 0.00336 0.02297 0.00391 221 0 0 0 0 1 0 0 -115.6900 1.7000 116.1500 1.0200 0.0000 0.0000 0.0000 0.0000; + 6290 6120 0.00336 0.02297 0.00391 221 0 0 0 0 1 0 0 -115.6900 1.7000 116.1500 1.0200 0.0000 0.0000 0.0000 0.0000; + 6121 6174 0.00587 0.03351 0.00504 98 0 0 0 0 1 0 0 12.7000 9.3400 -12.6900 -9.7600 0.0000 0.0000 0.0000 0.0000; + 6121 6179 0.0239 0.05842 0.00765 98 0 0 0 0 1 0 0 1.9000 -3.4600 -1.8900 2.6800 0.0000 0.0000 0.0000 0.0000; + 6220 6121 0.0032 0.02187 0.00372 221 0 0 0 0 1 0 0 79.1800 -27.0100 -78.9600 28.1400 0.0000 0.0000 0.0000 0.0000; + 6220 6121 0.0032 0.02187 0.00372 221 0 0 0 0 1 0 0 79.1800 -27.0100 -78.9600 28.1400 0.0000 0.0000 0.0000 0.0000; + 6122 6327 0.03109 0.07602 0.00995 98 0 0 0 0 1 0 0 4.8800 -11.3300 -4.8400 10.4100 0.0000 0.0000 0.0000 0.0000; + 7337 6122 0.02322 0.13264 0.01993 98 0 0 0 0 1 0 0 27.7700 -5.8900 -27.5900 4.8900 0.0000 0.0000 0.0000 0.0000; + 6233 6123 0.00405 0.02315 0.00348 98 0 0 0 0 1 0 0 -23.2200 -5.7700 23.2400 5.5700 0.0000 0.0000 0.0000 0.0000; + 6124 6131 0.01842 0.07644 0.01297 149 0 0 0 0 1 0 0 77.5600 -1.7500 -76.4600 5.0000 0.0000 0.0000 0.0000 0.0000; + 6191 6124 0.00835 0.05393 0.01029 221 0 0 0 0 1 0 0 -68.7000 2.5200 69.1000 -1.0100 0.0000 0.0000 0.0000 0.0000; + 6124 6314 0.01906 0.08338 0.0127 149 0 0 0 0 1 0 0 67.3800 -12.4400 -66.5000 15.0100 0.0000 0.0000 0.0000 0.0000; + 6180 6125 0.00599 0.02482 0.00421 149 0 0 0 0 1 0 0 -89.3500 13.3500 89.8500 -11.7300 0.0000 0.0000 0.0000 0.0000; + 6125 6322 0.01845 0.08069 0.01229 149 0 0 0 0 1 0 0 -92.4400 11.0000 94.0400 -5.2300 0.0000 0.0000 0.0000 0.0000; + 6126 6130 0.00394 0.01755 0.00257 221 0 0 0 0 1 0 0 -31.5400 -3.5100 31.5800 3.4400 0.0000 0.0000 0.0000 0.0000; + 6126 6176 0.00718 0.05004 0.00818 221 0 0 0 0 1 0 0 -20.6500 -13.8400 20.6900 13.3300 0.0000 0.0000 0.0000 0.0000; + 6126 6176 0.00718 0.05004 0.00818 221 0 0 0 0 1 0 0 -20.6500 -13.8400 20.6900 13.3300 0.0000 0.0000 0.0000 0.0000; + 6126 6313 0.00918 0.0551 0.00748 98 0 0 0 0 1 0 0 21.7300 -10.1400 -21.6800 9.7200 0.0000 0.0000 0.0000 0.0000; + 6127 6237 0.01441 0.08233 0.01237 98 0 0 0 0 1 0 0 6.1200 -8.5300 -6.1100 7.3600 0.0000 0.0000 0.0000 0.0000; + 6338 6127 0.01299 0.07418 0.01115 98 0 0 0 0 1 0 0 0.4300 -10.8400 -0.4100 9.8100 0.0000 0.0000 0.0000 0.0000; + 6127 8102 0.03512 0.08585 0.01124 98 0 0 0 0 1 0 0 -30.9400 0.9800 31.2800 -1.3000 0.0000 0.0000 0.0000 0.0000; + 6128 6276 0.01619 0.03957 0.00518 200 0 0 0 0 1 0 0 -3.0200 -16.8900 3.0700 16.4900 0.0000 0.0000 0.0000 0.0000; + 6129 6309 0.02452 0.10724 0.01633 149 0 0 0 0 1 0 0 -39.0500 -0.9300 39.4200 0.9000 0.0000 0.0000 0.0000 0.0000; + 6129 6336 0.01251 0.07513 0.0102 98 0 0 0 0 1 0 0 29.1900 -1.8600 -29.0800 1.4700 0.0000 0.0000 0.0000 0.0000; + 6130 6230 0.0041 0.035 0.0058 230 0 0 0 0 1 0 0 -73.8700 -24.8100 74.1200 26.3700 0.0000 0.0000 0.0000 0.0000; + 6130 6231 0.00525 0.02339 0.00343 149 0 0 0 0 1 0 0 28.9000 17.5800 -28.8400 -17.6400 0.0000 0.0000 0.0000 0.0000; + 6131 6251 0.02579 0.06305 0.00826 109.76 0 0 0 0 1 0 0 32.6100 -17.4200 -32.2500 17.4700 0.0000 0.0000 0.0000 0.0000; + 6132 6137 0.00931 0.05592 0.00759 98 0 0 0 0 1 0 0 29.1100 -7.0900 -29.0300 6.8800 0.0000 0.0000 0.0000 0.0000; + 6175 6132 0.00341 0.01491 0.00227 250 0 0 0 0 1 0 0 94.1700 12.4000 -93.8500 -11.2500 0.0000 0.0000 0.0000 0.0000; + 6190 6133 0.01462 0.06065 0.01029 149 0 0 0 0 1 0 0 83.2500 -14.8400 -82.2500 17.9400 0.0000 0.0000 0.0000 0.0000; + 6134 6140 0.01102 0.04818 0.00734 149 0 0 0 0 1 0 0 -33.0400 19.8400 33.2000 -19.9000 0.0000 0.0000 0.0000 0.0000; + 6134 6358 0.01529 0.06688 0.01019 149 0 0 0 0 1 0 0 25.4200 -22.0000 -25.2600 21.6400 0.0000 0.0000 0.0000 0.0000; + 6195 6135 0.018 0.07467 0.01267 149 0 0 0 0 1 0 0 -37.1800 -7.6800 37.4400 7.4900 0.0000 0.0000 0.0000 0.0000; + 6358 6136 0.00974 0.04339 0.00636 221 0 0 0 0 1 0 0 -29.6500 52.1000 29.9800 -51.2800 0.0000 0.0000 0.0000 0.0000; + 6137 6184 0.01801 0.04326 0.00587 102.9 0 0 0 0 1 0 0 -34.7500 8.2900 34.9900 -8.2900 0.0000 0.0000 0.0000 0.0000; + 6137 6217 0.00779 0.01906 0.0025 98 0 0 0 0 1 0 0 21.6000 -27.1200 -21.5000 27.1100 0.0000 0.0000 0.0000 0.0000; + 6157 6138 0.03762 0.09196 0.01204 98 0 0 0 0 1 0 0 1.8700 -8.1300 -1.8500 6.9500 0.0000 0.0000 0.0000 0.0000; + 6138 6286 0.02051 0.0914 0.0134 149 0 0 0 0 1 0 0 -25.8300 -14.8000 26.0100 14.1700 0.0000 0.0000 0.0000 0.0000; + 6139 6339 0.01781 0.10172 0.01528 98 0 0 0 0 1 0 0 19.4000 5.9100 -19.3200 -7.0400 0.0000 0.0000 0.0000 0.0000; + 6142 6141 0.0002 0.00909 0 1326 0 0 1 0 1 0 0 -711.0200 -39.7700 712.0000 84.1400 0.0000 0.0000 0.0000 0.0000; + 6142 6141 0.0002 0.00909 0 1326 0 0 1 0 1 0 0 -711.0200 -39.7700 712.0000 84.1400 0.0000 0.0000 0.0000 0.0000; + 6144 6141 0.00106 0.04778 0 265 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6145 6141 0.00027 0.01788 0 1093 0 0 1 0 1 0 0 322.8700 26.1700 -322.6100 -8.4800 0.0000 0.0000 0.0000 0.0000; + 6146 6141 0.00024 0.01722 0 1090 0 0 1 0 1 0 0 322.8700 27.0700 -322.6400 -10.0300 0.0000 0.0000 0.0000 0.0000; + 6147 6141 0.0002 0.01493 0 1332 0 0 1 0 1 0 0 283.2600 28.4900 -283.1100 -17.0900 0.0000 0.0000 0.0000 0.0000; + 6148 6141 0.00013 0.00914 0 1248 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 6149 6141 4e-05 0.00474 0 1255 0 0 1 0 1 0 0 219.4400 83.1100 -219.4100 -80.6500 0.0000 0.0000 0.0000 0.0000; + 6141 6161 0.00052 0.00627 0.4163 2020 0 0 0 0 1 0 0 -255.4800 10.2900 255.8100 -50.1600 0.0000 0.0000 0.0000 0.0000; + 6141 6197 0.00014 0.00318 0.27573 4352 0 0 0 0 1 0 0 1311.7400 45.5800 -1309.4500 -22.4600 0.0000 0.0000 0.0000 0.0000; + 6239 6141 0.00025 0.00304 0.20218 2400 0 0 0 0 1 0 0 1336.7200 138.0000 -1332.4900 -107.9000 0.0000 0.0000 0.0000 0.0000; + 6143 6142 0.0003 0.02159 0 443 0 0 1 0 1 0 0 -292.9400 3.0200 293.1900 14.8900 0.0000 0.0000 0.0000 0.0000; + 6143 6142 0.0003 0.02159 0 443 0 0 1 0 1 0 0 -292.9400 3.0200 293.1900 14.8900 0.0000 0.0000 0.0000 0.0000; + 6143 6142 0.0003 0.02159 0 443 0 0 1 0 1 0 0 -292.9400 3.0200 293.1900 14.8900 0.0000 0.0000 0.0000 0.0000; + 6142 6162 0.00533 0.03805 0.06937 443 0 0 0 0 1 0 0 -40.9000 -4.0600 40.9900 -2.5500 0.0000 0.0000 0.0000 0.0000; + 6143 6284 0.00613 0.04273 0.00699 221 0 0 0 0 1 0 0 108.0200 24.3600 -107.2900 -20.0000 0.0000 0.0000 0.0000 0.0000; + 6143 6284 0.00613 0.04273 0.00699 221 0 0 0 0 1 0 0 108.0200 24.3600 -107.2900 -20.0000 0.0000 0.0000 0.0000 0.0000; + 6312 6143 0.00214 0.01491 0.00244 250 0 0 0 0 1 0 0 -165.1200 18.1800 165.7000 -14.4500 0.0000 0.0000 0.0000 0.0000; + 6312 6143 0.00214 0.01491 0.00244 250 0 0 0 0 1 0 0 -165.1200 18.1800 165.7000 -14.4500 0.0000 0.0000 0.0000 0.0000; + 6312 6143 0.00214 0.01491 0.00244 250 0 0 0 0 1 0 0 -165.1200 18.1800 165.7000 -14.4500 0.0000 0.0000 0.0000 0.0000; + 6312 6143 0.00214 0.01491 0.00244 250 0 0 0 0 1 0 0 -165.1200 18.1800 165.7000 -14.4500 0.0000 0.0000 0.0000 0.0000; + 6150 6356 0.00408 0.02634 0.00503 221 0 0 0 0 1 0 0 24.1500 -48.0900 -24.0400 48.2900 0.0000 0.0000 0.0000 0.0000; + 6150 6356 0.00408 0.02634 0.00503 221 0 0 0 0 1 0 0 24.1500 -48.0900 -24.0400 48.2900 0.0000 0.0000 0.0000 0.0000; + 6190 6151 0.01488 0.06632 0.00972 221 0 0 0 0 1 0 0 -101.7100 9.6100 103.2100 -3.9700 0.0000 0.0000 0.0000 0.0000; + 6151 6311 0.02053 0.09148 0.01341 149 0 0 0 0 1 0 0 -80.4500 30.7400 81.9000 -25.7100 0.0000 0.0000 0.0000 0.0000; + 6327 6151 0.05056 0.12359 0.01618 150 0 0 0 0 1 0 0 39.9900 -26.0400 -38.9000 27.0100 0.0000 0.0000 0.0000 0.0000; + 6153 6152 0.00286 0.10993 0 155 0 0 1 0 1 0 0 -34.6600 -18.1700 34.7000 19.8600 0.0000 0.0000 0.0000 0.0000; + 6152 6177 0.00504 0.036 0.06563 443 0 0 0 0 1 0 0 -49.0000 -29.4500 49.1500 23.6300 0.0000 0.0000 0.0000 0.0000; + 6152 6198 0.00248 0.02429 0.04673 548 0 0 0 0 1 0 0 14.2900 9.5800 -14.2900 -14.3300 0.0000 0.0000 0.0000 0.0000; + 6241 6153 0.0044 0.03067 0.00501 221 0 0 0 0 1 0 0 87.6800 -2.6300 -87.3400 4.5000 0.0000 0.0000 0.0000 0.0000; + 6241 6153 0.0044 0.03067 0.00501 221 0 0 0 0 1 0 0 87.6800 -2.6300 -87.3400 4.5000 0.0000 0.0000 0.0000 0.0000; + 6153 6324 0.00612 0.0418 0.00711 221 0 0 0 0 1 0 0 50.6800 -10.7100 -50.5200 11.1300 0.0000 0.0000 0.0000 0.0000; + 6153 6324 0.00612 0.0418 0.00711 221 0 0 0 0 1 0 0 50.6800 -10.7100 -50.5200 11.1300 0.0000 0.0000 0.0000 0.0000; + 6176 6154 0.01188 0.04928 0.00836 149 0 0 0 0 1 0 0 -11.0700 11.9200 11.1000 -12.6200 0.0000 0.0000 0.0000 0.0000; + 6252 6154 0.02199 0.0912 0.01548 149 0 0 0 0 1 0 0 54.8500 0.7300 -54.2000 0.4100 0.0000 0.0000 0.0000 0.0000; + 6155 6284 0.00973 0.05559 0.00835 98 0 0 0 0 1 0 0 -7.4300 -12.9600 7.4500 12.2500 0.0000 0.0000 0.0000 0.0000; + 6156 6282 0.00873 0.05961 0.01014 221 0 0 0 0 1 0 0 122.3800 -23.2300 -121.0700 31.1200 0.0000 0.0000 0.0000 0.0000; + 6158 6341 0.02816 0.06884 0.00901 98 0 0 0 0 1 0 0 -19.3800 37.5800 19.8700 -37.3300 0.0000 0.0000 0.0000 0.0000; + 8104 6158 0.00916 0.05232 0.00786 98 0 0 0 0 1 0 0 -13.6400 -31.9600 13.7400 31.7500 0.0000 0.0000 0.0000 0.0000; + 6281 6159 0.00206 0.00903 0.00138 250 0 0 0 0 1 0 0 -76.2500 97.5500 76.5500 -96.3400 0.0000 0.0000 0.0000 0.0000; + 6160 6175 0.00216 0.01479 0.00252 221 0 0 0 0 1 0 0 49.1700 2.8000 -49.1200 -2.6800 0.0000 0.0000 0.0000 0.0000; + 6160 6175 0.00216 0.01479 0.00252 221 0 0 0 0 1 0 0 49.1700 2.8000 -49.1200 -2.6800 0.0000 0.0000 0.0000 0.0000; + 6160 6233 0.00526 0.02342 0.00343 149 0 0 0 0 1 0 0 41.9700 12.8000 -41.8700 -12.6700 0.0000 0.0000 0.0000 0.0000; + 6160 6330 0.00719 0.03146 0.00479 149 0 0 0 0 1 0 0 80.4000 -12.2000 -79.9100 13.8600 0.0000 0.0000 0.0000 0.0000; + 6162 6161 0.00024 0.01685 0 1132 0 0 1 0 1 0 0 -386.7400 -6.2300 387.0900 30.3800 0.0000 0.0000 0.0000 0.0000; + 6164 6161 0.00022 0.01652 0 880 0 0 1 0 1 0 0 71.4400 26.9600 -71.4300 -26.0500 0.0000 0.0000 0.0000 0.0000; + 6165 6161 0.00034 0.01841 0 879 0 0 1 0 1 0 0 71.4400 23.8100 -71.4200 -22.8200 0.0000 0.0000 0.0000 0.0000; + 6166 6161 0.00011 0.00775 0 880 0 0 1 0 1 0 0 71.4400 57.8200 -71.4300 -57.2000 0.0000 0.0000 0.0000 0.0000; + 6167 6161 0.0002 0.01447 0 883 0 0 1 0 1 0 0 71.4400 30.7700 -71.4300 -29.9400 0.0000 0.0000 0.0000 0.0000; + 6161 7018 0.00084 0.01712 1.19421 3146 0 0 0 0 1 0 0 -1330.4900 156.2600 1345.0100 14.1700 0.0000 0.0000 0.0000 0.0000; + 6163 6162 0.00109 0.04275 0 184.2 0 0 1 0 1 0 0 -106.9300 -9.7800 107.0500 14.5600 0.0000 0.0000 0.0000 0.0000; + 6162 6277 0.00506 0.03614 0.0659 443 0 0 0 0 1 0 0 145.4700 -13.3600 -144.4400 13.8500 0.0000 0.0000 0.0000 0.0000; + 6279 6162 0.00087 0.00624 0.01138 443 0 0 0 0 1 0 0 -93.1600 -8.2400 93.2400 7.5700 0.0000 0.0000 0.0000 0.0000; + 6280 6163 0.00495 0.02053 0.00348 149 0 0 0 0 1 0 0 -27.7900 -9.6100 27.8300 9.4300 0.0000 0.0000 0.0000 0.0000; + 6168 6209 0.01804 0.07482 0.0127 149 0 0 0 0 1 0 0 -48.9600 -3.3900 49.4000 3.9100 0.0000 0.0000 0.0000 0.0000; + 6168 6261 0.00295 0.00722 0.00094 147 0 0 0 0 1 0 0 48.2200 21.3700 -48.1400 -21.2700 0.0000 0.0000 0.0000 0.0000; + 6170 6169 0.00027 0.01779 0 1108 0 0 1 0 1 0 0 -433.1800 -10.4300 433.6600 42.3500 0.0000 0.0000 0.0000 0.0000; + 6169 6239 0.00065 0.00782 0.51936 2020 0 0 0 0 1 0 0 -433.6600 -42.3500 434.8200 1.0800 0.0000 0.0000 0.0000 0.0000; + 6171 6170 0.00057 0.03437 0 297 0 0 1 0 1 0 0 -167.1700 -31.9000 167.3300 41.6700 0.0000 0.0000 0.0000 0.0000; + 6170 6235 0.0015 0.01464 0.02816 548 0 0 0 0 1 0 0 78.2400 0.8500 -78.1500 -2.9400 0.0000 0.0000 0.0000 0.0000; + 6308 6170 0.00343 0.02448 0.04463 443 0 0 0 0 1 0 0 -94.7700 16.4800 95.0800 -18.9700 0.0000 0.0000 0.0000 0.0000; + 6170 6334 0.00357 0.02552 0.04652 443 0 0 0 0 1 0 0 92.5300 -13.1200 -92.2300 10.3700 0.0000 0.0000 0.0000 0.0000; + 6236 6171 0.00723 0.05035 0.00823 221 0 0 0 0 1 0 0 -53.2100 0.9000 53.4100 -0.3300 0.0000 0.0000 0.0000 0.0000; + 6173 6172 0.0013 0.05717 0 137 0 0 1 0 1 0 0 -68.6300 3.8900 68.6900 -1.2700 0.0000 0.0000 0.0000 0.0000; + 6173 6265 0.00345 0.01429 0.00242 250 0 0 0 0 1 0 0 77.3400 -36.9700 -77.1000 37.7400 0.0000 0.0000 0.0000 0.0000; + 7020 6173 0.03858 0.09432 0.01235 98 0 0 0 0 1 0 0 39.1700 -16.8500 -38.4900 17.2300 0.0000 0.0000 0.0000 0.0000; + 6174 6203 0.00829 0.02025 0.00265 221 0 0 0 0 1 0 0 73.6100 14.5000 -73.1500 -13.6400 0.0000 0.0000 0.0000 0.0000; + 6174 6250 0.00258 0.01476 0.00222 98 0 0 0 0 1 0 0 54.8200 34.9100 -54.7100 -34.5100 0.0000 0.0000 0.0000 0.0000; + 6174 6320 0.00372 0.02404 0.00459 221 0 0 0 0 1 0 0 -105.7500 -33.3900 106.2000 35.8400 0.0000 0.0000 0.0000 0.0000; + 6174 6320 0.00372 0.02404 0.00459 221 0 0 0 0 1 0 0 -105.7500 -33.3900 106.2000 35.8400 0.0000 0.0000 0.0000 0.0000; + 6175 6194 0.01297 0.05381 0.00913 149 0 0 0 0 1 0 0 -41.8100 1.2400 42.0400 -1.1700 0.0000 0.0000 0.0000 0.0000; + 6175 6289 0.01181 0.02887 0.00378 98 0 0 0 0 1 0 0 16.3300 2.1100 -16.3000 -2.3900 0.0000 0.0000 0.0000 0.0000; + 6230 6176 0.0023 0.016 0.0026 221 0 0 0 0 1 0 0 133.8500 16.8400 -133.4400 -14.2300 0.0000 0.0000 0.0000 0.0000; + 6178 6177 0.00082 0.04251 0 259.2 0 0 1 0 1 0 0 -133.9200 -28.3100 134.0700 36.0300 0.0000 0.0000 0.0000 0.0000; + 6178 6177 0.00082 0.04251 0 259.2 0 0 1 0 1 0 0 -133.9200 -28.3100 134.0700 36.0300 0.0000 0.0000 0.0000 0.0000; + 6235 6177 0.00202 0.01441 0.02628 523 0 0 0 0 1 0 0 152.6000 -81.3200 -152.0200 82.6500 0.0000 0.0000 0.0000 0.0000; + 6177 6287 0.00317 0.02266 0.04132 443 0 0 0 0 1 0 0 54.6800 71.1100 -54.4300 -73.6300 0.0000 0.0000 0.0000 0.0000; + 6177 6299 0.00682 0.06665 0.12825 548 0 0 0 0 1 0 0 -89.8600 15.3200 90.4100 -23.4600 0.0000 0.0000 0.0000 0.0000; + 6177 6308 0.00546 0.03901 0.07112 443 0 0 0 0 1 0 0 -25.8900 15.9500 25.9400 -23.0700 0.0000 0.0000 0.0000 0.0000; + 6334 6177 0.00073 0.00718 0.01381 647 0 0 0 0 1 0 0 140.8300 -119.5400 -140.6000 120.4200 0.0000 0.0000 0.0000 0.0000; + 6178 6209 0.00915 0.04079 0.00598 149 0 0 0 0 1 0 0 35.3400 5.7000 -35.2200 -5.8000 0.0000 0.0000 0.0000 0.0000; + 6332 6178 0.00369 0.02383 0.00455 221 0 0 0 0 1 0 0 -97.6900 -11.0300 98.0400 12.8200 0.0000 0.0000 0.0000 0.0000; + 6291 6179 0.00323 0.0194 0.00263 98 0 0 0 0 1 0 0 9.9600 5.8000 -9.9600 -6.0400 0.0000 0.0000 0.0000 0.0000; + 6182 6201 0.00497 0.02172 0.00331 149 0 0 0 0 1 0 0 -1.3300 -35.9400 1.3900 35.8900 0.0000 0.0000 0.0000 0.0000; + 6183 6206 0.01289 0.07363 0.01106 98 0 0 0 0 1 0 0 27.6300 6.5500 -27.5300 -7.1100 0.0000 0.0000 0.0000 0.0000; + 6184 6185 0.01258 0.03077 0.00403 98 0 0 0 0 1 0 0 -12.4600 -2.7400 12.4800 2.3900 0.0000 0.0000 0.0000 0.0000; + 6184 6205 0.00904 0.04029 0.00591 149 0 0 0 0 1 0 0 -61.0400 8.4500 61.3900 -7.4500 0.0000 0.0000 0.0000 0.0000; + 6184 6219 0.02323 0.05678 0.00744 98 0 0 0 0 1 0 0 -9.8800 -11.1300 9.9300 10.5200 0.0000 0.0000 0.0000 0.0000; + 6185 6313 0.01416 0.03461 0.00453 98 0 0 0 0 1 0 0 -33.3200 -8.3000 33.4900 8.2700 0.0000 0.0000 0.0000 0.0000; + 6186 6187 0.00175 0.01131 0.00216 221 0 0 0 0 1 0 0 88.2000 9.5400 -88.0600 -8.8600 0.0000 0.0000 0.0000 0.0000; + 6186 6187 0.00175 0.01131 0.00216 221 0 0 0 0 1 0 0 88.2000 9.5400 -88.0600 -8.8600 0.0000 0.0000 0.0000 0.0000; + 6186 6351 0.00169 0.0118 0.00193 221 0 0 0 0 1 0 0 -107.8900 -15.1200 108.0900 16.3400 0.0000 0.0000 0.0000 0.0000; + 6186 6351 0.00169 0.0118 0.00193 221 0 0 0 0 1 0 0 -107.8900 -15.1200 108.0900 16.3400 0.0000 0.0000 0.0000 0.0000; + 6187 6219 0.00752 0.03293 0.00502 149 0 0 0 0 1 0 0 49.7400 -20.3000 -49.5200 20.7600 0.0000 0.0000 0.0000 0.0000; + 6187 6289 0.00637 0.02643 0.00449 149 0 0 0 0 1 0 0 45.9500 15.2300 -45.7900 -15.0400 0.0000 0.0000 0.0000 0.0000; + 6189 6188 0.00227 0.06067 0 178 0 0 1 0 1 0 0 -80.6500 1.3300 80.7900 2.4900 0.0000 0.0000 0.0000 0.0000; + 6188 7305 0.00756 0.05401 0.09846 460 0 0 0 0 1 0 0 -157.3900 21.4400 159.2400 -18.4000 0.0000 0.0000 0.0000 0.0000; + 6327 6189 0.01842 0.11058 0.01501 98 0 0 0 0 1 0 0 -52.7600 10.6400 53.2800 -9.0800 0.0000 0.0000 0.0000 0.0000; + 6193 6192 0.00113 0.06451 0 125 0 0 1 0 1 0 0 -49.1200 -5.5400 49.1500 7.1000 0.0000 0.0000 0.0000 0.0000; + 6193 6206 0.01507 0.09046 0.01228 98 0 0 0 0 1 0 0 -8.6800 -2.9400 8.7000 1.7700 0.0000 0.0000 0.0000 0.0000; + 6193 6326 0.03488 0.08525 0.01116 98 0 0 0 0 1 0 0 22.1200 -1.6300 -21.9500 0.9300 0.0000 0.0000 0.0000 0.0000; + 6196 6194 0.01994 0.08268 0.01403 149 0 0 0 0 1 0 0 24.1300 9.6400 -23.9900 -10.4800 0.0000 0.0000 0.0000 0.0000; + 6194 6231 0.00815 0.03567 0.00543 149 0 0 0 0 1 0 0 30.5300 1.8200 -30.4600 -2.0200 0.0000 0.0000 0.0000 0.0000; + 6232 6194 0.00593 0.04134 0.00676 221 0 0 0 0 1 0 0 93.5300 5.7100 -93.0100 -2.7600 0.0000 0.0000 0.0000 0.0000; + 6195 7314 0.01465 0.06078 0.01031 149 0 0 0 0 1 0 0 34.5200 6.9300 -34.3400 -7.1700 0.0000 0.0000 0.0000 0.0000; + 6198 6197 0.00015 0.01413 0 1372 0 0 1 0 1 0 0 -583.8400 -29.9100 584.3300 76.7900 0.0000 0.0000 0.0000 0.0000; + 6197 6234 0.00025 0.003 0.19905 2020 0 0 0 0 1 0 0 433.5900 -48.7100 -433.1400 33.2900 0.0000 0.0000 0.0000 0.0000; + 6197 6333 0.00012 0.00144 0.09542 2020 0 0 0 0 1 0 0 291.5200 -5.6200 -291.4200 -3.2000 0.0000 0.0000 0.0000 0.0000; + 6199 6198 0.00048 0.01693 0 420 0 0 1 0 1 0 0 -292.2800 3.5400 292.6800 10.5600 0.0000 0.0000 0.0000 0.0000; + 6199 6198 0.00048 0.01693 0 420 0 0 1 0 1 0 0 -292.2800 3.5400 292.6800 10.5600 0.0000 0.0000 0.0000 0.0000; + 6199 6198 0.00048 0.01693 0 420 0 0 1 0 1 0 0 -292.2800 3.5400 292.6800 10.5600 0.0000 0.0000 0.0000 0.0000; + 6287 6198 0.00092 0.00901 0.01734 548 0 0 0 0 1 0 0 98.2700 -41.8800 -98.1700 41.1000 0.0000 0.0000 0.0000 0.0000; + 6337 6199 0.00218 0.01487 0.00253 221 0 0 0 0 1 0 0 -101.2600 25.9900 101.4900 -24.6700 0.0000 0.0000 0.0000 0.0000; + 6337 6199 0.00218 0.01487 0.00253 221 0 0 0 0 1 0 0 -101.2600 25.9900 101.4900 -24.6700 0.0000 0.0000 0.0000 0.0000; + 6200 6225 0.00252 0.01513 0.00205 98 0 0 0 0 1 0 0 15.9400 -9.8000 -15.9300 9.6500 0.0000 0.0000 0.0000 0.0000; + 6200 6275 0.00286 0.01632 0.00245 98 0 0 0 0 1 0 0 4.2400 5.2000 -4.2400 -5.4400 0.0000 0.0000 0.0000 0.0000; + 6200 6284 0.00797 0.03555 0.00521 149 0 0 0 0 1 0 0 -66.4600 -8.5100 66.8300 9.6200 0.0000 0.0000 0.0000 0.0000; + 6201 6203 0.01894 0.04631 0.00606 98 0 0 0 0 1 0 0 -12.3500 27.5500 12.5300 -27.7400 0.0000 0.0000 0.0000 0.0000; + 6201 6356 0.00518 0.02956 0.00444 245 0 0 0 0 1 0 0 -28.1200 -74.5100 28.4400 75.8900 0.0000 0.0000 0.0000 0.0000; + 6280 6202 0.02835 0.06931 0.00908 115 0 0 0 0 1 0 0 13.1900 -12.5400 -13.1000 11.8200 0.0000 0.0000 0.0000 0.0000; + 6340 6202 0.01509 0.08621 0.01295 115 0 0 0 0 1 0 0 17.5500 -0.9300 -17.5100 -0.1600 0.0000 0.0000 0.0000 0.0000; + 6204 6337 0.00539 0.03236 0.00439 98 0 0 0 0 1 0 0 -22.7300 -42.1400 22.8600 42.4300 0.0000 0.0000 0.0000 0.0000; + 6205 6223 0.00232 0.01501 0.00286 221 0 0 0 0 1 0 0 -91.6700 -13.5500 91.8800 14.5800 0.0000 0.0000 0.0000 0.0000; + 6205 6223 0.00232 0.01501 0.00286 221 0 0 0 0 1 0 0 -91.6700 -13.5500 91.8800 14.5800 0.0000 0.0000 0.0000 0.0000; + 6207 6282 0.01027 0.04493 0.00684 149 0 0 0 0 1 0 0 -93.8500 42.3200 94.8800 -38.5400 0.0000 0.0000 0.0000 0.0000; + 6207 6313 0.0096 0.05765 0.00782 221 0 0 0 0 1 0 0 -4.2500 58.7000 4.5700 -57.5900 0.0000 0.0000 0.0000 0.0000; + 6331 6208 0.00218 0.0152 0.00249 221 0 0 0 0 1 0 0 30.5400 32.2400 -30.5000 -32.1800 0.0000 0.0000 0.0000 0.0000; + 6331 6208 0.00218 0.0152 0.00249 221 0 0 0 0 1 0 0 30.5400 32.2400 -30.5000 -32.1800 0.0000 0.0000 0.0000 0.0000; + 6208 6353 0.0108 0.04812 0.00706 149 0 0 0 0 1 0 0 -71.8800 -5.7500 72.4600 7.6100 0.0000 0.0000 0.0000 0.0000; + 6309 6209 0.018 0.078 0.012 150 0 0 0 0 1 0 0 21.7800 -0.6300 -21.7000 -0.2400 0.0000 0.0000 0.0000 0.0000; + 6211 6210 0.0003 0.01639 0 978 0 0 1 0 1 0 0 -224.8100 -28.1100 224.9600 36.0500 0.0000 0.0000 0.0000 0.0000; + 6213 6210 0.00066 0.04478 0 363 0 0 1 0 1 0 0 177.9000 16.0100 -177.7100 -2.8100 0.0000 0.0000 0.0000 0.0000; + 6214 6210 0.00044 0.02757 0 718 0 0 1 0 1 0 0 552.3000 49.9300 -551.0500 28.4600 0.0000 0.0000 0.0000 0.0000; + 6215 6210 0.0001 0.0071 0 721 0 0 1 0 1 0 0 552.3000 78.3200 -552.0200 -57.8900 0.0000 0.0000 0.0000 0.0000; + 6216 6210 0.00021 0.01596 0 710 0 0 1 0 1 0 0 552.3000 49.1800 -551.7100 -3.8100 0.0000 0.0000 0.0000 0.0000; + 6210 6292 0.00114 0.01377 0.91489 2020 0 0 0 0 1 0 0 251.9500 11.9900 -251.2300 -100.3500 0.0000 0.0000 0.0000 0.0000; + 6212 6211 0.00083 0.03328 0 381 0 0 1 0 1 0 0 -147.5500 -9.5600 147.7200 16.5000 0.0000 0.0000 0.0000 0.0000; + 6211 6359 0.00367 0.02624 0.04784 443 0 0 0 0 1 0 0 77.0900 11.6000 -76.8800 -15.1200 0.0000 0.0000 0.0000 0.0000; + 6218 6231 0.02084 0.09119 0.01389 149 0 0 0 0 1 0 0 11.2400 -0.9300 -11.2100 -0.3200 0.0000 0.0000 0.0000 0.0000; + 6278 6218 0.00985 0.04084 0.00693 149 0 0 0 0 1 0 0 62.8900 14.5900 -62.4800 -13.5900 0.0000 0.0000 0.0000 0.0000; + 6219 6345 0.00408 0.02332 0.0035 98 0 0 0 0 1 0 0 -20.8600 31.9300 20.9200 -31.9300 0.0000 0.0000 0.0000 0.0000; + 6221 6322 0.01605 0.09634 0.01307 98 0 0 0 0 1 0 0 4.4500 19.7200 -4.3800 -20.6800 0.0000 0.0000 0.0000 0.0000; + 6223 6222 0.00029 0.0171 0 457 0 0 1 0 1 0 0 -259.7300 -41.8300 259.9300 53.8100 0.0000 0.0000 0.0000 0.0000; + 6223 6222 0.00029 0.0171 0 457 0 0 1 0 1 0 0 -259.7300 -41.8300 259.9300 53.8100 0.0000 0.0000 0.0000 0.0000; + 6223 6222 0.00029 0.0171 0 457 0 0 1 0 1 0 0 -259.7300 -41.8300 259.9300 53.8100 0.0000 0.0000 0.0000 0.0000; + 6222 6229 0.00375 0.03669 0.07059 548 0 0 0 0 1 0 0 -121.9800 -62.8000 122.6700 62.2100 0.0000 0.0000 0.0000 0.0000; + 6255 6222 0.00167 0.01635 0.03146 647 0 0 0 0 1 0 0 314.4400 48.5300 -312.8000 -35.6400 0.0000 0.0000 0.0000 0.0000; + 6222 6293 0.00233 0.0228 0.04388 647 0 0 0 0 1 0 0 -208.7500 -22.2700 209.7700 27.7800 0.0000 0.0000 0.0000 0.0000; + 6222 6354 0.00491 0.03508 0.06396 443 0 0 0 0 1 0 0 -11.0800 -11.7300 11.0900 5.3400 0.0000 0.0000 0.0000 0.0000; + 6227 6223 0.00231 0.01613 0.00264 262.5 0 0 0 0 1 0 0 -146.6100 -17.4900 147.1200 20.8400 0.0000 0.0000 0.0000 0.0000; + 6227 6223 0.00231 0.01613 0.00264 262.5 0 0 0 0 1 0 0 -146.6100 -17.4900 147.1200 20.8400 0.0000 0.0000 0.0000 0.0000; + 6224 6331 0.00467 0.01938 0.00329 149 0 0 0 0 1 0 0 -21.0400 -34.2300 21.1200 34.2200 0.0000 0.0000 0.0000 0.0000; + 6225 6307 0.00669 0.0298 0.00437 149 0 0 0 0 1 0 0 -9.3500 5.7200 9.3600 -6.1100 0.0000 0.0000 0.0000 0.0000; + 6227 6238 0.00232 0.01616 0.00264 221 0 0 0 0 1 0 0 59.4200 10.3300 -59.3400 -9.9800 0.0000 0.0000 0.0000 0.0000; + 6227 6238 0.00232 0.01616 0.00264 221 0 0 0 0 1 0 0 59.4200 10.3300 -59.3400 -9.9800 0.0000 0.0000 0.0000 0.0000; + 6227 6330 0.01472 0.036 0.00471 102.9 0 0 0 0 1 0 0 48.0100 -21.4700 -47.6000 22.0300 0.0000 0.0000 0.0000 0.0000; + 6229 6228 0.00011 0.01313 0 1208 0 0 1 0 1 0 0 -577.1000 76.8200 577.4500 -34.8700 0.0000 0.0000 0.0000 0.0000; + 6298 6228 0.00022 0.00262 0.17409 2020 0 0 0 0 1 0 0 578.1600 -44.7200 -577.4500 34.8700 0.0000 0.0000 0.0000 0.0000; + 6230 6229 0.00061 0.03602 0 350 0 0 1 0 1 0 0 -196.5500 -52.4600 196.7900 67.1400 0.0000 0.0000 0.0000 0.0000; + 6230 6229 0.00061 0.03602 0 350 0 0 1 0 1 0 0 -196.5500 -52.4600 196.7900 67.1400 0.0000 0.0000 0.0000 0.0000; + 6277 6229 0.00147 0.01434 0.0276 548 0 0 0 0 1 0 0 -60.7200 -71.1100 60.8400 69.4000 0.0000 0.0000 0.0000 0.0000; + 6230 6278 0.009 0.05404 0.00733 210 0 0 0 0 1 0 0 -6.3900 7.4500 6.4000 -8.1400 0.0000 0.0000 0.0000 0.0000; + 6232 6294 0.00252 0.01629 0.00311 221 0 0 0 0 1 0 0 -80.0800 -12.2900 80.2400 13.0500 0.0000 0.0000 0.0000 0.0000; + 6232 6294 0.00252 0.01629 0.00311 221 0 0 0 0 1 0 0 -80.0800 -12.2900 80.2400 13.0500 0.0000 0.0000 0.0000 0.0000; + 6235 6234 6e-05 0.00475 0 1190 0 0 1 0 1 0 0 -569.7900 -27.4600 569.9700 42.2800 0.0000 0.0000 0.0000 0.0000; + 6236 6235 0.00075 0.02962 0 406 0 0 1 0 1 0 0 -247.2100 -37.5600 247.6700 55.8600 0.0000 0.0000 0.0000 0.0000; + 6236 6235 0.00075 0.02962 0 406 0 0 1 0 1 0 0 -247.2100 -37.5600 247.6700 55.8600 0.0000 0.0000 0.0000 0.0000; + 6325 6237 0.01418 0.05883 0.00998 149 0 0 0 0 1 0 0 -27.3200 7.6200 27.4300 -8.1600 0.0000 0.0000 0.0000 0.0000; + 6237 8102 0.02383 0.14308 0.01942 98 0 0 0 0 1 0 0 -23.2000 0.2700 23.3300 -1.4900 0.0000 0.0000 0.0000 0.0000; + 6238 6345 0.00383 0.02298 0.00312 98 0 0 0 0 1 0 0 -16.1300 -18.2300 16.1600 18.0700 0.0000 0.0000 0.0000 0.0000; + 6240 6239 0.00028 0.01264 0 1194 0 0 1 0 1 0 0 -634.2800 -94.8800 635.3900 145.2000 0.0000 0.0000 0.0000 0.0000; + 6242 6239 0.0004 0.04713 0 380 0 0 1 0 1 0 0 60.8300 15.7100 -60.8200 -13.9900 0.0000 0.0000 0.0000 0.0000; + 6243 6239 0.00024 0.01934 0 690 0 0 1 0 1 0 0 182.5000 38.2900 -182.4200 -32.0800 0.0000 0.0000 0.0000 0.0000; + 6244 6239 0.00024 0.01637 0 957 0 0 1 0 1 0 0 297.1800 46.7400 -296.9800 -33.0400 0.0000 0.0000 0.0000 0.0000; + 6245 6239 0.00021 0.01383 0 965 0 0 1 0 1 0 0 297.1800 53.6900 -297.0100 -42.0300 0.0000 0.0000 0.0000 0.0000; + 6246 6239 0.00011 0.00711 0 967 0 0 1 0 1 0 0 297.1800 100.5000 -297.0800 -94.0400 0.0000 0.0000 0.0000 0.0000; + 6247 6239 0.00014 0.00867 0 694 0 0 1 0 1 0 0 182.8300 82.2000 -182.7800 -78.9800 0.0000 0.0000 0.0000 0.0000; + 6248 6239 0.00018 0.01749 0 689 0 0 1 0 1 0 0 182.8300 42.3800 -182.7700 -36.6800 0.0000 0.0000 0.0000 0.0000; + 6249 6239 0.00046 0.02531 0 685 0 0 1 0 1 0 0 182.8300 29.3100 -182.6800 -21.2800 0.0000 0.0000 0.0000 0.0000; + 6239 7414 0.0015 0.019 1.24 2000 0 0 0 0 1 0 0 -1140.3600 196.8500 1159.6100 -84.1300 0.0000 0.0000 0.0000 0.0000; + 6241 6240 0.00111 0.05088 0 300 0 0 1 0 1 0 0 -175.5400 -22.2600 175.8900 38.2200 0.0000 0.0000 0.0000 0.0000; + 6241 6240 0.00111 0.05088 0 300 0 0 1 0 1 0 0 -175.5400 -22.2600 175.8900 38.2200 0.0000 0.0000 0.0000 0.0000; + 6240 6287 0.00218 0.02128 0.04095 647 0 0 0 0 1 0 0 347.3200 -4.9700 -344.7800 25.6000 0.0000 0.0000 0.0000 0.0000; + 6240 6321 0.00473 0.03381 0.06164 443 0 0 0 0 1 0 0 -64.8300 23.4100 65.0600 -28.1400 0.0000 0.0000 0.0000 0.0000; + 6253 6329 0.01564 0.06488 0.01101 149 0 0 0 0 1 0 0 56.7300 -14.5400 -56.2100 15.5400 0.0000 0.0000 0.0000 0.0000; + 6255 6254 4e-05 0.00481 0 1350 0 0 1 0 1 0 0 -804.4400 -140.6500 804.7000 171.8000 0.0000 0.0000 0.0000 0.0000; + 6257 6254 0.00011 0.01147 0 726 0 0 1 0 1 0 0 58.9600 -21.5300 -58.9600 21.9600 0.0000 0.0000 0.0000 0.0000; + 6258 6254 0.00037 0.02186 0 731 0 0 1 0 1 0 0 106.9700 -12.7200 -106.9300 15.1600 0.0000 0.0000 0.0000 0.0000; + 6259 6254 0.00044 0.02142 0 333 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6260 6254 0.00018 0.01038 0 914 0 0 1 0 1 0 0 78.1100 -26.5600 -78.1000 27.2400 0.0000 0.0000 0.0000 0.0000; + 6292 6254 7e-05 0.00142 0.09917 2768 0 0 0 0 1 0 0 870.6800 90.2700 -870.1700 -90.2800 0.0000 0.0000 0.0000 0.0000; + 6256 6255 0.00085 0.04835 0 300 0 0 1 0 1 0 0 -170.6200 -24.2700 170.8700 38.6800 0.0000 0.0000 0.0000 0.0000; + 6256 6255 0.00085 0.04835 0 300 0 0 1 0 1 0 0 -170.6200 -24.2700 170.8700 38.6800 0.0000 0.0000 0.0000 0.0000; + 6262 6319 0.01214 0.07287 0.00989 98 0 0 0 0 1 0 0 32.3200 7.9400 -32.1800 -8.1000 0.0000 0.0000 0.0000 0.0000; + 6264 6263 0.00081 0.03319 0 120 0 0 1 0 1 0 0 -83.9600 -5.3900 84.0200 7.7000 0.0000 0.0000 0.0000 0.0000; + 6321 6263 0.00395 0.03863 0.07433 647 0 0 0 0 1 0 0 -221.0500 28.0600 222.9800 -16.8000 0.0000 0.0000 0.0000 0.0000; + 6263 7274 0.00452 0.04698 0.16009 750 0 0 0 0 1 0 0 -304.5700 32.9700 308.7500 -6.0000 0.0000 0.0000 0.0000 0.0000; + 6266 6265 0.00703 0.24052 0 29 0 0 1 0 1 0 0 4.5000 1.7200 -4.5000 -1.6700 0.0000 0.0000 0.0000 0.0000; + 6267 6265 0.01927 0.55179 0 35 0 0 1 0 1 0 0 7.2000 2.7300 -7.1900 -2.4200 0.0000 0.0000 0.0000 0.0000; + 6268 6265 0.00822 0.17407 0 30 0 0 1 0 1 0 0 4.5000 1.7200 -4.5000 -1.6800 0.0000 0.0000 0.0000 0.0000; + 6269 6265 0.0207 0.59011 0 32 0 0 1 0 1 0 0 7.2000 2.7300 -7.1900 -2.4000 0.0000 0.0000 0.0000 0.0000; + 6270 6265 0.01825 0.32424 0 47 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6271 6265 0.00336 0.1392 0 42 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6272 6265 0.00455 0.19054 0 35 0 0 1 0 1 0 0 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6273 6265 0.00863 0.26216 0 32 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6274 6265 0.00902 0.4175 0 39 0 0 1 0 1 0 0 8.4000 3.2000 -8.3900 -2.8800 0.0000 0.0000 0.0000 0.0000; + 6275 6324 0.00458 0.02955 0.00564 221 0 0 0 0 1 0 0 -53.1800 -12.9500 53.3200 13.2900 0.0000 0.0000 0.0000 0.0000; + 6275 6324 0.00458 0.02955 0.00564 221 0 0 0 0 1 0 0 -53.1800 -12.9500 53.3200 13.2900 0.0000 0.0000 0.0000 0.0000; + 6278 6277 0.00046 0.02831 0 331 0 0 1 0 1 0 0 -204.9700 -44.9000 205.1700 57.2600 0.0000 0.0000 0.0000 0.0000; + 6280 6279 0.00106 0.03718 0 182.78 0 0 1 0 1 0 0 -121.4200 -16.3900 121.5800 21.8400 0.0000 0.0000 0.0000 0.0000; + 6279 6299 0.00218 0.02135 0.04107 548 0 0 0 0 1 0 0 -50.5700 -10.9700 50.6300 7.2200 0.0000 0.0000 0.0000 0.0000; + 6286 6285 0.00032 0.0236 0 311 0 0 1 0 1 0 0 -195.5200 46.0700 195.6400 -37.1000 0.0000 0.0000 0.0000 0.0000; + 6328 6286 0.0331 0.08092 0.0106 98 0 0 0 0 1 0 0 -24.9500 -15.2100 25.2200 14.7700 0.0000 0.0000 0.0000 0.0000; + 6288 6287 0.00058 0.03855 0 300 0 0 1 0 1 0 0 -182.9300 -32.5700 183.1300 45.9900 0.0000 0.0000 0.0000 0.0000; + 6288 6287 0.00058 0.03855 0 300 0 0 1 0 1 0 0 -182.9300 -32.5700 183.1300 45.9900 0.0000 0.0000 0.0000 0.0000; + 6288 6307 0.00199 0.01356 0.00231 221 0 0 0 0 1 0 0 70.1500 15.9400 -70.0500 -15.4600 0.0000 0.0000 0.0000 0.0000; + 6288 6307 0.00199 0.01356 0.00231 221 0 0 0 0 1 0 0 70.1500 15.9400 -70.0500 -15.4600 0.0000 0.0000 0.0000 0.0000; + 6288 6323 0.0013 0.00886 0.00151 221 0 0 0 0 1 0 0 29.5100 -6.9600 -29.5000 6.8900 0.0000 0.0000 0.0000 0.0000; + 6288 6323 0.0013 0.00886 0.00151 221 0 0 0 0 1 0 0 29.5100 -6.9600 -29.5000 6.8900 0.0000 0.0000 0.0000 0.0000; + 6290 6331 0.00175 0.01218 0.00199 221 0 0 0 0 1 0 0 81.8900 -11.2800 -81.7700 11.9200 0.0000 0.0000 0.0000 0.0000; + 6290 6331 0.00175 0.01218 0.00199 221 0 0 0 0 1 0 0 81.8900 -11.2800 -81.7700 11.9200 0.0000 0.0000 0.0000 0.0000; + 6293 6292 0.0002 0.01411 0 1210 0 0 1 0 1 0 0 -385.5100 -63.8700 385.8100 84.8500 0.0000 0.0000 0.0000 0.0000; + 6295 6292 0.00017 0.00896 0 756 0 0 1 0 1 0 0 62.6800 -22.8900 -62.6700 23.2700 0.0000 0.0000 0.0000 0.0000; + 6296 6292 0.00013 0.00766 0 762 0 0 1 0 1 0 0 62.6800 -22.8900 -62.6700 23.2200 0.0000 0.0000 0.0000 0.0000; + 6297 6292 0.00029 0.02084 0 765 0 0 1 0 1 0 0 62.7100 -22.2300 -62.7000 23.1100 0.0000 0.0000 0.0000 0.0000; + 6294 6293 0.00058 0.02427 0 217.8 0 0 1 0 1 0 0 -175.5600 -28.4900 175.7500 36.1000 0.0000 0.0000 0.0000 0.0000; + 6294 6339 0.01129 0.02712 0.00368 98 0 0 0 0 1 0 0 15.0700 2.3900 -15.0500 -2.7000 0.0000 0.0000 0.0000 0.0000; + 6299 6298 0.0002 0.01939 0 994 0 0 1 0 1 0 0 -206.5200 4.3400 206.6000 3.5600 0.0000 0.0000 0.0000 0.0000; + 6301 6298 0.00035 0.02541 0 225 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 6302 6298 0.00029 0.02162 0 897 0 0 1 0 1 0 0 246.5700 -27.4400 -246.4000 40.3000 0.0000 0.0000 0.0000 0.0000; + 6303 6298 0.0001 0.00733 0 887 0 0 1 0 1 0 0 213.8400 -27.4400 -213.7900 30.7000 0.0000 0.0000 0.0000 0.0000; + 6304 6298 0.00026 0.01816 0 896 0 0 1 0 1 0 0 246.5700 -27.4400 -246.4200 38.2200 0.0000 0.0000 0.0000 0.0000; + 6305 6298 0.00037 0.02188 0 904 0 0 1 0 1 0 0 246.5700 -27.4400 -246.3500 40.4500 0.0000 0.0000 0.0000 0.0000; + 6300 6299 0.00189 0.06692 0 181 0 0 1 0 1 0 0 -65.4000 -9.0800 65.4800 11.9100 0.0000 0.0000 0.0000 0.0000; + 6309 6308 0.00086 0.06271 0 183.6 0 0 1 0 1 0 0 -102.3000 -11.9100 102.3900 18.3900 0.0000 0.0000 0.0000 0.0000; + 6310 6312 0.00222 0.01548 0.00253 221 0 0 0 0 1 0 0 -92.0700 -23.2000 92.2700 24.3100 0.0000 0.0000 0.0000 0.0000; + 6310 6312 0.00222 0.01548 0.00253 221 0 0 0 0 1 0 0 -92.0700 -23.2000 92.2700 24.3100 0.0000 0.0000 0.0000 0.0000; + 6320 6312 0.00148 0.01008 0.00171 375 0 0 0 0 1 0 0 -162.2900 38.4400 162.6900 -35.9100 0.0000 0.0000 0.0000 0.0000; + 6320 6312 0.00148 0.01008 0.00171 375 0 0 0 0 1 0 0 -162.2900 38.4400 162.6900 -35.9100 0.0000 0.0000 0.0000 0.0000; + 6316 6315 0.00143 0.0765 0 251 0 0 1 0 1 0 0 -17.1600 3.7400 17.1600 -3.5100 0.0000 0.0000 0.0000 0.0000; + 6343 6315 0.00542 0.0387 0.07055 443 0 0 0 0 1 0 0 -34.2900 -14.2700 34.3600 7.5600 0.0000 0.0000 0.0000 0.0000; + 6317 6316 0.00181 0.06783 0 189 0 0 1 0 1 0 0 -38.1100 -14.0600 38.1400 15.1600 0.0000 0.0000 0.0000 0.0000; + 6318 6317 0.00192 0.08014 0 198 0 0 1 0 1 0 0 -38.0800 -12.7500 38.1100 14.0600 0.0000 0.0000 0.0000 0.0000; + 6319 6318 0.00221 0.05812 0 163 0 0 1 0 1 0 0 -38.0400 -11.8000 38.0800 12.7500 0.0000 0.0000 0.0000 0.0000; + 6324 6320 0.00553 0.02416 0.00368 250 0 0 0 0 1 0 0 -63.8200 -65.3300 64.2800 66.9700 0.0000 0.0000 0.0000 0.0000; + 6322 6321 0.00114 0.03057 0 249 0 0 1 0 1 0 0 -155.7300 7.1900 156.0000 0.0900 0.0000 0.0000 0.0000 0.0000; + 8140 6326 0.02706 0.06615 0.00866 98 0 0 0 0 1 0 0 -6.4900 4.4800 6.5100 -5.3000 0.0000 0.0000 0.0000 0.0000; + 6336 6328 0.02009 0.12065 0.01637 98 0 0 0 0 1 0 0 3.0200 -8.8600 -3.0000 7.2900 0.0000 0.0000 0.0000 0.0000; + 6334 6333 0.00033 0.01665 0 1094 0 0 1 0 1 0 0 -291.1500 10.3200 291.4200 3.2000 0.0000 0.0000 0.0000 0.0000; + 6335 6334 0.00063 0.03435 0 271.8 0 0 1 0 1 0 0 -207.1500 -53.9100 207.4400 69.6400 0.0000 0.0000 0.0000 0.0000; + 6341 7202 0.01405 0.06262 0.00918 149 0 0 0 0 1 0 0 31.8200 19.8800 -31.6300 -19.9300 0.0000 0.0000 0.0000 0.0000; + 6343 6342 0.00025 0.01679 0 1137 0 0 1 0 1 0 0 -252.0400 -41.9600 252.2000 52.7600 0.0000 0.0000 0.0000 0.0000; + 6344 6343 0.00028 0.01611 0 400 0 0 1 0 1 0 0 -224.9700 -21.5700 225.1100 29.7500 0.0000 0.0000 0.0000 0.0000; + 6344 6343 0.00028 0.01611 0 400 0 0 1 0 1 0 0 -224.9700 -21.5700 225.1100 29.7500 0.0000 0.0000 0.0000 0.0000; + 6343 6350 0.00292 0.02086 0.03803 443 0 0 0 0 1 0 0 -146.9500 -27.3100 147.5900 27.9800 0.0000 0.0000 0.0000 0.0000; + 6343 6354 0.00111 0.0079 0.01439 443 0 0 0 0 1 0 0 66.1200 3.7900 -66.0700 -4.9100 0.0000 0.0000 0.0000 0.0000; + 6344 6353 0.00211 0.0144 0.00245 262.5 0 0 0 0 1 0 0 145.5700 -0.9300 -145.1300 3.7200 0.0000 0.0000 0.0000 0.0000; + 6344 6353 0.00211 0.0144 0.00245 262.5 0 0 0 0 1 0 0 145.5700 -0.9300 -145.1300 3.7200 0.0000 0.0000 0.0000 0.0000; + 6350 6349 0.00019 0.01229 0 1150 0 0 1 0 1 0 0 -326.2800 -87.4000 326.4900 100.9500 0.0000 0.0000 0.0000 0.0000; + 6351 6350 0.00179 0.06637 0 233.1 0 0 1 0 1 0 0 -120.0200 -19.7200 120.2900 29.5600 0.0000 0.0000 0.0000 0.0000; + 6351 6350 0.00179 0.06637 0 233.1 0 0 1 0 1 0 0 -120.0200 -19.7200 120.2900 29.5600 0.0000 0.0000 0.0000 0.0000; + 6350 6359 0.00816 0.05827 0.10623 443 0 0 0 0 1 0 0 -70.7800 -3.7000 71.1700 -4.5400 0.0000 0.0000 0.0000 0.0000; + 6355 6354 0.00076 0.02753 0 193.8 0 0 1 0 1 0 0 -90.6200 -8.8000 90.6800 11.0700 0.0000 0.0000 0.0000 0.0000; + 6355 6354 0.00076 0.02753 0 193.8 0 0 1 0 1 0 0 -90.6200 -8.8000 90.6800 11.0700 0.0000 0.0000 0.0000 0.0000; + 6360 6359 0.00288 0.10862 0 136 0 0 1 0 1 0 0 -5.7000 -19.2200 5.7100 19.6500 0.0000 0.0000 0.0000 0.0000; + 7044 7001 0.00753 0.043 0.00646 98 0 0 0 0 1 0 0 4.6500 -2.5600 -4.6500 1.9200 0.0000 0.0000 0.0000 0.0000; + 7149 7001 0.02671 0.0653 0.00855 98 0 0 0 0 1 0 0 23.2700 -11.0000 -23.1000 10.5700 0.0000 0.0000 0.0000 0.0000; + 7001 7337 0.04314 0.10362 0.01406 98 0 0 0 0 1 0 0 18.4500 -15.1200 -18.2100 14.2600 0.0000 0.0000 0.0000 0.0000; + 7003 7002 0.00022 0.0149 0 1299 0 0 1 0 1 0 0 -526.8900 -69.7400 527.4900 110.4000 0.0000 0.0000 0.0000 0.0000; + 7005 7002 0.00041 0.02493 0 630 0 0 1 0 1 0 0 162.5500 35.3200 -162.4500 -28.9400 0.0000 0.0000 0.0000 0.0000; + 7006 7002 0.00012 0.01417 0 626 0 0 1 0 1 0 0 162.5500 61.8400 -162.5200 -57.8800 0.0000 0.0000 0.0000 0.0000; + 7007 7002 0.00034 0.02135 0 639 0 0 1 0 1 0 0 162.5500 40.8300 -162.4600 -35.2800 0.0000 0.0000 0.0000 0.0000; + 7008 7002 0.00045 0.02245 0 629 0 0 1 0 1 0 0 162.5500 38.2900 -162.4400 -32.5000 0.0000 0.0000 0.0000 0.0000; + 7009 7002 0.00049 0.02499 0 625 0 0 1 0 1 0 0 162.5500 34.7300 -162.4300 -28.3400 0.0000 0.0000 0.0000 0.0000; + 7104 7002 3e-05 0.0007 0.04887 3146 0 0 0 0 1 0 0 1222.8800 -20.2700 -1222.4600 24.9000 0.0000 0.0000 0.0000 0.0000; + 7002 7227 0.00036 0.00731 0.51017 3146 0 0 0 0 1 0 0 1189.3300 23.9400 -1184.5300 19.3300 0.0000 0.0000 0.0000 0.0000; + 7366 7002 0.00016 0.00189 0.12566 2020 0 0 0 0 1 0 0 -317.7900 -35.2400 317.9400 23.7000 0.0000 0.0000 0.0000 0.0000; + 7004 7003 0.0009 0.03512 0 386 0 0 1 0 1 0 0 -238.1500 -1.4700 238.6500 20.9500 0.0000 0.0000 0.0000 0.0000; + 7004 7003 0.0009 0.03512 0 386 0 0 1 0 1 0 0 -238.1500 -1.4700 238.6500 20.9500 0.0000 0.0000 0.0000 0.0000; + 7004 7003 0.0009 0.03512 0 386 0 0 1 0 1 0 0 -238.1500 -1.4700 238.6500 20.9500 0.0000 0.0000 0.0000 0.0000; + 7003 7264 0.00225 0.01608 0.02932 523 0 0 0 0 1 0 0 -189.0700 6.9000 189.8500 -4.3800 0.0000 0.0000 0.0000 0.0000; + 7075 7004 0.00199 0.01386 0.00227 250 0 0 0 0 1 0 0 -144.2300 56.8500 144.6900 -53.8500 0.0000 0.0000 0.0000 0.0000; + 7075 7004 0.00199 0.01386 0.00227 250 0 0 0 0 1 0 0 -144.2300 56.8500 144.6900 -53.8500 0.0000 0.0000 0.0000 0.0000; + 7075 7004 0.00199 0.01386 0.00227 250 0 0 0 0 1 0 0 -144.2300 56.8500 144.6900 -53.8500 0.0000 0.0000 0.0000 0.0000; + 7004 7106 0.0021 0.01353 0.00258 221 0 0 0 0 1 0 0 -90.4100 4.3400 90.5800 -3.5200 0.0000 0.0000 0.0000 0.0000; + 7004 7106 0.0021 0.01353 0.00258 221 0 0 0 0 1 0 0 -90.4100 4.3400 90.5800 -3.5200 0.0000 0.0000 0.0000 0.0000; + 7004 7106 0.0021 0.01353 0.00258 221 0 0 0 0 1 0 0 -90.4100 4.3400 90.5800 -3.5200 0.0000 0.0000 0.0000 0.0000; + 7004 7106 0.0021 0.01353 0.00258 221 0 0 0 0 1 0 0 -90.4100 4.3400 90.5800 -3.5200 0.0000 0.0000 0.0000 0.0000; + 7004 7345 0.00591 0.04035 0.00687 221 0 0 0 0 1 0 0 140.0400 28.5800 -138.8600 -21.2000 0.0000 0.0000 0.0000 0.0000; + 7004 7345 0.00591 0.04035 0.00687 221 0 0 0 0 1 0 0 140.0400 28.5800 -138.8600 -21.2000 0.0000 0.0000 0.0000 0.0000; + 7004 7345 0.00591 0.04035 0.00687 221 0 0 0 0 1 0 0 140.0400 28.5800 -138.8600 -21.2000 0.0000 0.0000 0.0000 0.0000; + 7010 7182 0.01896 0.11385 0.01545 98 0 0 0 0 1 0 0 -33.9200 7.9000 34.1500 -7.9900 0.0000 0.0000 0.0000 0.0000; + 7010 7202 0.00553 0.02294 0.00389 149 0 0 0 0 1 0 0 4.3100 -10.1000 -4.3000 9.7500 0.0000 0.0000 0.0000 0.0000; + 7233 7010 0.00425 0.01763 0.00299 149 0 0 0 0 1 0 0 -13.9500 1.9800 13.9600 -2.2300 0.0000 0.0000 0.0000 0.0000; + 7254 7011 0.00899 0.04008 0.00588 149 0 0 0 0 1 0 0 11.3600 -13.3600 -11.3400 12.8600 0.0000 0.0000 0.0000 0.0000; + 7011 7300 0.00567 0.0248 0.00378 149 0 0 0 0 1 0 0 -24.4600 -23.0000 24.5200 22.8700 0.0000 0.0000 0.0000 0.0000; + 7012 7116 0.00531 0.03627 0.00617 221 0 0 0 0 1 0 0 33.3200 -4.6000 -33.2500 4.4300 0.0000 0.0000 0.0000 0.0000; + 7343 7012 0.00603 0.04198 0.00686 221 0 0 0 0 1 0 0 34.3300 -4.4800 -34.2600 4.3300 0.0000 0.0000 0.0000 0.0000; + 7013 7201 0.00433 0.0302 0.00494 221 0 0 0 0 1 0 0 -88.5100 -39.2000 88.9100 41.5400 0.0000 0.0000 0.0000 0.0000; + 7013 7201 0.00433 0.0302 0.00494 221 0 0 0 0 1 0 0 -88.5100 -39.2000 88.9100 41.5400 0.0000 0.0000 0.0000 0.0000; + 7013 7425 0.003 0.02091 0.00342 221 0 0 0 0 1 0 0 38.9600 39.2900 -38.8700 -38.9800 0.0000 0.0000 0.0000 0.0000; + 7015 7014 0.00981 0.21665 0 43 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7014 7100 0.00476 0.03249 0.00553 221 0 0 0 0 1 0 0 -59.0400 2.7100 59.2100 -2.1000 0.0000 0.0000 0.0000 0.0000; + 7014 7100 0.00476 0.03249 0.00553 221 0 0 0 0 1 0 0 -59.0400 2.7100 59.2100 -2.1000 0.0000 0.0000 0.0000 0.0000; + 7014 7124 0.01606 0.03857 0.00523 98 0 0 0 0 1 0 0 8.3800 -4.5100 -8.3700 4.0300 0.0000 0.0000 0.0000 0.0000; + 7014 7217 0.00415 0.02371 0.00356 221 0 0 0 0 1 0 0 56.8900 -15.8800 -56.7400 16.3700 0.0000 0.0000 0.0000 0.0000; + 7016 7365 0.0068 0.04642 0.0079 221 0 0 0 0 1 0 0 123.2600 0.7900 -122.2300 5.4400 0.0000 0.0000 0.0000 0.0000; + 7016 7365 0.0068 0.04642 0.0079 221 0 0 0 0 1 0 0 123.2600 0.7900 -122.2300 5.4400 0.0000 0.0000 0.0000 0.0000; + 7016 7365 0.0068 0.04642 0.0079 221 0 0 0 0 1 0 0 123.2600 0.7900 -122.2300 5.4400 0.0000 0.0000 0.0000 0.0000; + 7016 7365 0.0068 0.04642 0.0079 221 0 0 0 0 1 0 0 123.2600 0.7900 -122.2300 5.4400 0.0000 0.0000 0.0000 0.0000; + 7368 7016 0.002 0.01369 0.00233 221 0 0 0 0 1 0 0 106.9600 7.1500 -106.7400 -5.8300 0.0000 0.0000 0.0000 0.0000; + 7368 7016 0.002 0.01369 0.00233 221 0 0 0 0 1 0 0 106.9600 7.1500 -106.7400 -5.8300 0.0000 0.0000 0.0000 0.0000; + 7368 7016 0.002 0.01369 0.00233 221 0 0 0 0 1 0 0 106.9600 7.1500 -106.7400 -5.8300 0.0000 0.0000 0.0000 0.0000; + 7016 7402 0.00314 0.02144 0.00365 221 0 0 0 0 1 0 0 -129.2000 -4.9500 129.7200 8.1400 0.0000 0.0000 0.0000 0.0000; + 7016 7402 0.00314 0.02144 0.00365 221 0 0 0 0 1 0 0 -129.2000 -4.9500 129.7200 8.1400 0.0000 0.0000 0.0000 0.0000; + 7089 7017 0.0044 0.01826 0.0031 221 0 0 0 0 1 0 0 -51.9000 105.2500 52.4900 -103.1200 0.0000 0.0000 0.0000 0.0000; + 7017 7183 0.00737 0.04422 0.006 221 0 0 0 0 1 0 0 12.4100 -72.8700 -12.0100 74.6500 0.0000 0.0000 0.0000 0.0000; + 7017 7229 0.00604 0.04129 0.00702 221 0 0 0 0 1 0 0 -138.5000 9.6600 139.6700 -2.3800 0.0000 0.0000 0.0000 0.0000; + 7017 7229 0.00604 0.04129 0.00702 221 0 0 0 0 1 0 0 -138.5000 9.6600 139.6700 -2.3800 0.0000 0.0000 0.0000 0.0000; + 7017 7229 0.00604 0.04129 0.00702 221 0 0 0 0 1 0 0 -138.5000 9.6600 139.6700 -2.3800 0.0000 0.0000 0.0000 0.0000; + 7017 7241 0.00382 0.01669 0.00254 149 0 0 0 0 1 0 0 47.3200 50.2100 -47.1400 -49.6700 0.0000 0.0000 0.0000 0.0000; + 7017 7385 0.00298 0.01922 0.00367 221 0 0 0 0 1 0 0 83.7200 29.1600 -83.4900 -28.0100 0.0000 0.0000 0.0000 0.0000; + 7017 7385 0.00298 0.01922 0.00367 221 0 0 0 0 1 0 0 83.7200 29.1600 -83.4900 -28.0100 0.0000 0.0000 0.0000 0.0000; + 7019 7018 0.00095 0.04341 0 383 0 0 1 0 1 0 0 -43.8800 -14.0900 43.9000 14.9800 0.0000 0.0000 0.0000 0.0000; + 7021 7018 0.00069 0.05321 0 311 0 0 1 0 1 0 0 22.3400 11.4000 -22.3300 -11.0800 0.0000 0.0000 0.0000 0.0000; + 7022 7018 0.0007 0.05667 0 328 0 0 1 0 1 0 0 47.2700 24.1300 -47.2500 -22.6500 0.0000 0.0000 0.0000 0.0000; + 7023 7018 0.00056 0.03486 0 326 0 0 1 0 1 0 0 47.2700 24.1300 -47.2600 -23.2100 0.0000 0.0000 0.0000 0.0000; + 7024 7018 0.00019 0.01166 0 456 0 0 1 0 1 0 0 94.5400 48.2500 -94.5200 -47.0100 0.0000 0.0000 0.0000 0.0000; + 7025 7018 0.00094 0.07002 0 223 0 0 1 0 1 0 0 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7042 7018 0.00022 0.00265 0.17583 2020 0 0 0 0 1 0 0 842.6300 -79.9100 -841.1300 79.5100 0.0000 0.0000 0.0000 0.0000; + 7018 7414 0.00039 0.00468 0.3108 2295 0 0 0 0 1 0 0 -276.2500 29.3500 276.5400 -58.4600 0.0000 0.0000 0.0000 0.0000; + 7020 7019 0.00076 0.04319 0 244 0 0 1 0 1 0 0 -114.5500 -4.5100 114.6500 10.0300 0.0000 0.0000 0.0000 0.0000; + 7043 7019 0.00225 0.01607 0.0293 443 0 0 0 0 1 0 0 100.8100 -1.4500 -100.5900 -0.0200 0.0000 0.0000 0.0000 0.0000; + 7019 7274 0.00332 0.02368 0.04318 443 0 0 0 0 1 0 0 29.8300 4.0900 -29.8000 -8.3400 0.0000 0.0000 0.0000 0.0000; + 7026 7072 0.0032 0.02067 0.00394 221 0 0 0 0 1 0 0 -35.7500 31.7300 35.8200 -31.6700 0.0000 0.0000 0.0000 0.0000; + 7026 7072 0.0032 0.02067 0.00394 221 0 0 0 0 1 0 0 -35.7500 31.7300 35.8200 -31.6700 0.0000 0.0000 0.0000 0.0000; + 7026 7259 0.01125 0.07265 0.01386 221 0 0 0 0 1 0 0 56.4500 7.2000 -56.0900 -6.3100 0.0000 0.0000 0.0000 0.0000; + 7273 7026 0.00548 0.0382 0.00624 221 0 0 0 0 1 0 0 14.2700 41.5300 -14.1700 -41.4800 0.0000 0.0000 0.0000 0.0000; + 7273 7026 0.00548 0.0382 0.00624 221 0 0 0 0 1 0 0 14.2700 41.5300 -14.1700 -41.4800 0.0000 0.0000 0.0000 0.0000; + 7027 7157 0.00228 0.01559 0.00265 221 0 0 0 0 1 0 0 -126.5000 8.2500 126.8700 -6.0000 0.0000 0.0000 0.0000 0.0000; + 7027 7157 0.00228 0.01559 0.00265 221 0 0 0 0 1 0 0 -126.5000 8.2500 126.8700 -6.0000 0.0000 0.0000 0.0000 0.0000; + 7027 7234 0.00431 0.01886 0.00287 149 0 0 0 0 1 0 0 84.9900 -29.2800 -84.6400 30.5300 0.0000 0.0000 0.0000 0.0000; + 7027 7245 0.00974 0.04259 0.00649 149 0 0 0 0 1 0 0 47.5600 -15.3800 -47.3100 15.8000 0.0000 0.0000 0.0000 0.0000; + 7027 7431 0.015 0.06687 0.00981 149 0 0 0 0 1 0 0 11.2300 -2.7900 -11.2100 1.9000 0.0000 0.0000 0.0000 0.0000; + 7147 7028 0.0011 0.00768 0.00126 315 0 0 0 0 1 0 0 109.4200 -137.1300 -109.0900 139.3500 0.0000 0.0000 0.0000 0.0000; + 7147 7028 0.0011 0.00768 0.00126 315 0 0 0 0 1 0 0 109.4200 -137.1300 -109.0900 139.3500 0.0000 0.0000 0.0000 0.0000; + 7028 7220 0.00381 0.02289 0.00311 221 0 0 0 0 1 0 0 36.3900 84.6900 -36.0700 -83.1100 0.0000 0.0000 0.0000 0.0000; + 7028 7240 0.00642 0.01568 0.00205 221 0 0 0 0 1 0 0 71.5300 49.3700 -71.0500 -48.4200 0.0000 0.0000 0.0000 0.0000; + 7028 7330 0.01183 0.02841 0.00385 221 0 0 0 0 1 0 0 33.2500 60.2900 -32.7000 -59.3600 0.0000 0.0000 0.0000 0.0000; + 7030 7029 0.00115 0.08558 0 126.6 0 0 1 0 1 0 0 -77.4400 0.9400 77.5000 4.0400 0.0000 0.0000 0.0000 0.0000; + 7031 7029 0.00416 0.1856 0 107 0 0 1 0 1 0 0 29.1000 -0.0000 -29.0700 1.5200 0.0000 0.0000 0.0000 0.0000; + 7032 7029 0.00698 0.23196 0 73 0 0 1 0 1 0 0 7.5000 -0.0000 -7.5000 0.1300 0.0000 0.0000 0.0000 0.0000; + 7033 7029 0.00566 0.21439 0 84 0 0 1 0 1 0 0 7.5000 -0.0000 -7.5000 0.1200 0.0000 0.0000 0.0000 0.0000; + 7034 7029 0.00462 0.30603 0 63 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7274 7029 0.00498 0.03556 0.06482 443 0 0 0 0 1 0 0 -94.5000 6.0100 94.9300 -9.6000 0.0000 0.0000 0.0000 0.0000; + 7029 7407 0.00374 0.02669 0.04866 443 0 0 0 0 1 0 0 -150.1000 12.7200 150.9200 -11.9100 0.0000 0.0000 0.0000 0.0000; + 7415 7029 0.00221 0.01579 0.02879 443 0 0 0 0 1 0 0 -21.7100 6.0200 21.7200 -8.9200 0.0000 0.0000 0.0000 0.0000; + 7036 7035 0.00036 0.02039 0 368 0 0 1 0 1 0 0 -217.3000 -48.0000 217.4800 58.0400 0.0000 0.0000 0.0000 0.0000; + 7040 7035 0.00756 0.05402 0.09848 523 0 0 0 0 1 0 0 195.1000 -19.3800 -192.3000 29.2600 0.0000 0.0000 0.0000 0.0000; + 7056 7035 0.00217 0.01547 0.02821 443 0 0 0 0 1 0 0 72.8600 -46.3100 -72.7000 44.5300 0.0000 0.0000 0.0000 0.0000; + 7035 7390 0.00154 0.01505 0.02896 548 0 0 0 0 1 0 0 25.8400 -96.8600 -25.7000 95.2600 0.0000 0.0000 0.0000 0.0000; + 7035 8031 0.00526 0.05146 0.09901 548 0 0 0 0 1 0 0 21.6800 -34.9700 -21.6100 25.3200 0.0000 0.0000 0.0000 0.0000; + 7036 7128 0.005 0.02228 0.00327 149 0 0 0 0 1 0 0 28.8600 -2.9500 -28.8200 2.8000 0.0000 0.0000 0.0000 0.0000; + 7431 7036 0.00448 0.03123 0.00511 221 0 0 0 0 1 0 0 -47.9500 -12.1400 48.0600 12.4000 0.0000 0.0000 0.0000 0.0000; + 7431 7036 0.00448 0.03123 0.00511 221 0 0 0 0 1 0 0 -47.9500 -12.1400 48.0600 12.4000 0.0000 0.0000 0.0000 0.0000; + 7038 7037 0.00016 0.00995 0 1055 0 0 1 0 1 0 0 -276.9500 -118.1700 277.0900 127.0100 0.0000 0.0000 0.0000 0.0000; + 7047 7037 0.00024 0.00293 0.19466 2020 0 0 0 0 1 0 0 -276.6800 -34.4200 276.8600 16.2500 0.0000 0.0000 0.0000 0.0000; + 7037 7428 0.0006 0.01232 0.85919 2768 0 0 0 0 1 0 0 -553.9500 -143.2500 555.7700 89.1200 0.0000 0.0000 0.0000 0.0000; + 7039 7038 0.00084 0.02618 0 630 0 0 1 0 1 0 0 -300.0500 -6.1600 300.8000 29.5900 0.0000 0.0000 0.0000 0.0000; + 7039 7038 0.00084 0.02618 0 630 0 0 1 0 1 0 0 -300.0500 -6.1600 300.8000 29.5900 0.0000 0.0000 0.0000 0.0000; + 7126 7038 0.00089 0.00924 0.03147 750 0 0 0 0 1 0 0 181.6800 -1.2300 -181.4000 1.0000 0.0000 0.0000 0.0000 0.0000; + 7126 7038 0.00089 0.00924 0.03147 750 0 0 0 0 1 0 0 181.6800 -1.2300 -181.4000 1.0000 0.0000 0.0000 0.0000 0.0000; + 7038 7184 0.00247 0.02419 0.04653 647 0 0 0 0 1 0 0 -309.2900 6.8300 311.6000 11.0600 0.0000 0.0000 0.0000 0.0000; + 7409 7038 0.0006 0.00622 0.02121 750 0 0 0 0 1 0 0 -173.5400 -25.3600 173.7200 25.0800 0.0000 0.0000 0.0000 0.0000; + 7409 7038 0.0006 0.00622 0.02121 750 0 0 0 0 1 0 0 -173.5400 -25.3600 173.7200 25.0800 0.0000 0.0000 0.0000 0.0000; + 7039 7101 0.00285 0.01988 0.00325 221 0 0 0 0 1 0 0 103.9000 -4.9400 -103.5900 6.7500 0.0000 0.0000 0.0000 0.0000; + 7039 7101 0.00285 0.01988 0.00325 221 0 0 0 0 1 0 0 103.9000 -4.9400 -103.5900 6.7500 0.0000 0.0000 0.0000 0.0000; + 7039 7101 0.00285 0.01988 0.00325 221 0 0 0 0 1 0 0 103.9000 -4.9400 -103.5900 6.7500 0.0000 0.0000 0.0000 0.0000; + 7039 7397 0.02904 0.06977 0.00947 240 0 0 0 0 1 0 0 52.9000 -39.5800 -51.6500 41.6200 0.0000 0.0000 0.0000 0.0000; + 7041 7040 0.00089 0.03362 0 337 0 0 1 0 1 0 0 -194.3100 -17.5900 194.6400 30.2200 0.0000 0.0000 0.0000 0.0000; + 7041 7040 0.00089 0.03362 0 337 0 0 1 0 1 0 0 -194.3100 -17.5900 194.6400 30.2200 0.0000 0.0000 0.0000 0.0000; + 7040 7077 0.00208 0.02159 0.07357 750 0 0 0 0 1 0 0 -292.1900 -20.5400 293.9200 30.7700 0.0000 0.0000 0.0000 0.0000; + 7040 7077 0.00208 0.02159 0.07357 750 0 0 0 0 1 0 0 -292.1900 -20.5400 293.9200 30.7700 0.0000 0.0000 0.0000 0.0000; + 7041 7238 0.01373 0.06121 0.00898 149 0 0 0 0 1 0 0 42.9800 -33.5100 -42.5800 34.3700 0.0000 0.0000 0.0000 0.0000; + 7394 7041 0.00776 0.05303 0.00902 221 0 0 0 0 1 0 0 -124.6200 -13.4000 125.8700 21.0400 0.0000 0.0000 0.0000 0.0000; + 7394 7041 0.00776 0.05303 0.00902 221 0 0 0 0 1 0 0 -124.6200 -13.4000 125.8700 21.0400 0.0000 0.0000 0.0000 0.0000; + 7043 7042 8e-05 0.00908 0 1048 0 0 1 0 1 0 0 -276.1200 -41.7000 276.1800 48.5000 0.0000 0.0000 0.0000 0.0000; + 7045 7042 0.00029 0.01951 0 729 0 0 1 0 1 0 0 187.9300 29.9100 -187.8300 -23.2500 0.0000 0.0000 0.0000 0.0000; + 7046 7042 0.00013 0.009 0 716 0 0 1 0 1 0 0 187.9300 62.6300 -187.8900 -59.3000 0.0000 0.0000 0.0000 0.0000; + 7058 7042 0.0006 0.00731 0.48578 2295 0 0 0 0 1 0 0 746.3600 -124.9200 -743.0900 113.9600 0.0000 0.0000 0.0000 0.0000; + 7044 7043 0.00124 0.05616 0 137.4 0 0 1 0 1 0 0 -89.3200 -28.0200 89.4300 32.9200 0.0000 0.0000 0.0000 0.0000; + 7044 7416 0.01974 0.04824 0.00632 98 0 0 0 0 1 0 0 -39.9700 -4.7400 40.2900 4.8800 0.0000 0.0000 0.0000 0.0000; + 7048 7047 0.00011 0.00819 0 1125 0 0 1 0 1 0 0 -475.0000 -99.4100 475.2500 118.2400 0.0000 0.0000 0.0000 0.0000; + 7199 7047 0.00024 0.00294 0.19535 2020 0 0 0 0 1 0 0 198.6700 64.6500 -198.5700 -83.8200 0.0000 0.0000 0.0000 0.0000; + 7049 7048 0.00068 0.02653 0 521.92 0 0 1 0 1 0 0 -314.4400 5.3400 315.1000 20.4800 0.0000 0.0000 0.0000 0.0000; + 7049 7048 0.00068 0.02653 0 521.92 0 0 1 0 1 0 0 -314.4400 5.3400 315.1000 20.4800 0.0000 0.0000 0.0000 0.0000; + 7228 7048 0.00068 0.00665 0.01279 548 0 0 0 0 1 0 0 8.9000 -20.2400 -8.9000 18.9600 0.0000 0.0000 0.0000 0.0000; + 7342 7048 0.00134 0.01309 0.02519 548 0 0 0 0 1 0 0 146.6000 -39.1200 -146.3000 39.4900 0.0000 0.0000 0.0000 0.0000; + 7049 7089 0.00671 0.04677 0.00764 221 0 0 0 0 1 0 0 63.3200 -24.1900 -63.0200 25.5100 0.0000 0.0000 0.0000 0.0000; + 7315 7049 0.00436 0.03039 0.00497 221 0 0 0 0 1 0 0 -93.7300 24.5300 94.1300 -22.2400 0.0000 0.0000 0.0000 0.0000; + 7315 7049 0.00436 0.03039 0.00497 221 0 0 0 0 1 0 0 -93.7300 24.5300 94.1300 -22.2400 0.0000 0.0000 0.0000 0.0000; + 7315 7049 0.00436 0.03039 0.00497 221 0 0 0 0 1 0 0 -93.7300 24.5300 94.1300 -22.2400 0.0000 0.0000 0.0000 0.0000; + 7050 7090 0.00351 0.02269 0.00433 221 0 0 0 0 1 0 0 -37.3600 -2.3300 37.4100 2.2200 0.0000 0.0000 0.0000 0.0000; + 7050 7090 0.00351 0.02269 0.00433 221 0 0 0 0 1 0 0 -37.3600 -2.3300 37.4100 2.2200 0.0000 0.0000 0.0000 0.0000; + 7050 7251 0.01093 0.04781 0.00728 149 0 0 0 0 1 0 0 2.6900 -15.7600 -2.6600 15.1600 0.0000 0.0000 0.0000 0.0000; + 7051 7086 0.01063 0.0465 0.00708 149 0 0 0 0 1 0 0 -65.1500 24.5100 65.6700 -22.9300 0.0000 0.0000 0.0000 0.0000; + 7051 7181 0.00631 0.03605 0.00542 102.9 0 0 0 0 1 0 0 60.4800 15.7700 -60.2300 -14.8800 0.0000 0.0000 0.0000 0.0000; + 7276 7051 0.00383 0.01676 0.00255 221 0 0 0 0 1 0 0 -11.5500 111.6500 12.0200 -109.8500 0.0000 0.0000 0.0000 0.0000; + 7051 7365 0.00182 0.01243 0.00211 221 0 0 0 0 1 0 0 -74.0700 14.8400 74.1800 -14.3300 0.0000 0.0000 0.0000 0.0000; + 7051 7365 0.00182 0.01243 0.00211 221 0 0 0 0 1 0 0 -74.0700 14.8400 74.1800 -14.3300 0.0000 0.0000 0.0000 0.0000; + 7052 7053 0.00939 0.06413 0.01091 221 0 0 0 0 1 0 0 -125.8700 9.4300 127.3700 -0.2700 0.0000 0.0000 0.0000 0.0000; + 7052 7053 0.00939 0.06413 0.01091 221 0 0 0 0 1 0 0 -125.8700 9.4300 127.3700 -0.2700 0.0000 0.0000 0.0000 0.0000; + 7052 7053 0.00939 0.06413 0.01091 221 0 0 0 0 1 0 0 -125.8700 9.4300 127.3700 -0.2700 0.0000 0.0000 0.0000 0.0000; + 7052 7183 0.00858 0.03822 0.0056 221 0 0 0 0 1 0 0 96.3000 -101.7500 -94.6200 108.6800 0.0000 0.0000 0.0000 0.0000; + 7052 7221 0.00969 0.0402 0.00682 149 0 0 0 0 1 0 0 53.3000 3.0700 -53.0300 -2.5900 0.0000 0.0000 0.0000 0.0000; + 7256 7052 0.00256 0.01655 0.00316 221 0 0 0 0 1 0 0 -60.5600 -19.7200 60.6700 20.0900 0.0000 0.0000 0.0000 0.0000; + 7256 7052 0.00256 0.01655 0.00316 221 0 0 0 0 1 0 0 -60.5600 -19.7200 60.6700 20.0900 0.0000 0.0000 0.0000 0.0000; + 7053 7348 0.00216 0.01507 0.00246 250 0 0 0 0 1 0 0 -162.6900 -9.7400 163.2600 13.4300 0.0000 0.0000 0.0000 0.0000; + 7053 7348 0.00216 0.01507 0.00246 250 0 0 0 0 1 0 0 -162.6900 -9.7400 163.2600 13.4300 0.0000 0.0000 0.0000 0.0000; + 7053 7348 0.00216 0.01507 0.00246 250 0 0 0 0 1 0 0 -162.6900 -9.7400 163.2600 13.4300 0.0000 0.0000 0.0000 0.0000; + 7054 7086 0.01035 0.06217 0.00844 98 0 0 0 0 1 0 0 -51.0400 -0.7400 51.3100 1.5800 0.0000 0.0000 0.0000 0.0000; + 7243 7054 0.00558 0.03601 0.00687 221 0 0 0 0 1 0 0 63.3400 27.1700 -63.0700 -26.1200 0.0000 0.0000 0.0000 0.0000; + 7054 7387 0.00566 0.0323 0.00485 98 0 0 0 0 1 0 0 21.2600 0.5500 -21.2300 -0.8700 0.0000 0.0000 0.0000 0.0000; + 7055 7124 0.00357 0.02439 0.00415 221 0 0 0 0 1 0 0 98.4900 17.0800 -98.1300 -15.0500 0.0000 0.0000 0.0000 0.0000; + 7055 7124 0.00357 0.02439 0.00415 221 0 0 0 0 1 0 0 98.4900 17.0800 -98.1300 -15.0500 0.0000 0.0000 0.0000 0.0000; + 7188 7055 0.0014 0.00978 0.0016 221 0 0 0 0 1 0 0 150.0900 -2.1200 -149.7800 4.1600 0.0000 0.0000 0.0000 0.0000; + 7188 7055 0.0014 0.00978 0.0016 221 0 0 0 0 1 0 0 150.0900 -2.1200 -149.7800 4.1600 0.0000 0.0000 0.0000 0.0000; + 7188 7055 0.0014 0.00978 0.0016 221 0 0 0 0 1 0 0 150.0900 -2.1200 -149.7800 4.1600 0.0000 0.0000 0.0000 0.0000; + 7188 7055 0.0014 0.00978 0.0016 221 0 0 0 0 1 0 0 150.0900 -2.1200 -149.7800 4.1600 0.0000 0.0000 0.0000 0.0000; + 7250 7055 0.00146 0.01001 0.0017 250 0 0 0 0 1 0 0 -151.6700 41.6000 152.0300 -39.3000 0.0000 0.0000 0.0000 0.0000; + 7250 7055 0.00146 0.01001 0.0017 250 0 0 0 0 1 0 0 -151.6700 41.6000 152.0300 -39.3000 0.0000 0.0000 0.0000 0.0000; + 7057 7056 0.00161 0.04976 0 377 0 0 1 0 1 0 0 -161.0500 -23.8100 161.4800 37.2300 0.0000 0.0000 0.0000 0.0000; + 7056 7156 0.00287 0.02047 0.03732 443 0 0 0 0 1 0 0 -74.0400 30.2900 74.2200 -32.7600 0.0000 0.0000 0.0000 0.0000; + 7056 7160 0.00187 0.01944 0.06623 750 0 0 0 0 1 0 0 -249.2300 -5.4400 250.3700 10.5100 0.0000 0.0000 0.0000 0.0000; + 7056 7420 0.0013 0.0093 0.01695 443 0 0 0 0 1 0 0 88.9200 -15.7800 -88.8200 14.8000 0.0000 0.0000 0.0000 0.0000; + 7215 7057 0.00223 0.01557 0.00254 221 0 0 0 0 1 0 0 -27.4500 3.0000 27.4700 -3.1300 0.0000 0.0000 0.0000 0.0000; + 7215 7057 0.00223 0.01557 0.00254 221 0 0 0 0 1 0 0 -27.4500 3.0000 27.4700 -3.1300 0.0000 0.0000 0.0000 0.0000; + 7059 7058 0.0002 0.01603 0 605 0 0 1 0 1 0 0 -151.0900 5.1900 151.1300 -1.6800 0.0000 0.0000 0.0000 0.0000; + 7061 7058 0.0003 0.02449 0 535 0 0 1 0 1 0 0 67.0900 -12.7500 -67.0800 13.8500 0.0000 0.0000 0.0000 0.0000; + 7062 7058 0.0003 0.02239 0 531 0 0 1 0 1 0 0 67.0900 -12.7500 -67.0800 13.7600 0.0000 0.0000 0.0000 0.0000; + 7063 7058 0.00039 0.02417 0 527 0 0 1 0 1 0 0 67.0900 -12.7500 -67.0800 13.8400 0.0000 0.0000 0.0000 0.0000; + 7064 7058 0.00017 0.01851 0 530 0 0 1 0 1 0 0 83.1800 -12.7500 -83.1700 14.0200 0.0000 0.0000 0.0000 0.0000; + 7065 7058 0.00031 0.02035 0 520 0 0 1 0 1 0 0 83.1800 -12.7500 -83.1600 14.1400 0.0000 0.0000 0.0000 0.0000; + 7066 7058 0.0003 0.02188 0 542 0 0 1 0 1 0 0 68.1100 -12.7500 -68.1000 13.7600 0.0000 0.0000 0.0000 0.0000; + 7058 7095 0.00064 0.00771 0.5124 2295 0 0 0 0 1 0 0 -1585.4100 353.2800 1601.7600 -209.1600 0.0000 0.0000 0.0000 0.0000; + 7406 7058 6e-05 0.00073 0.04856 2020 0 0 0 0 1 0 0 -1122.8000 314.5200 1123.5800 -310.0600 0.0000 0.0000 0.0000 0.0000; + 7060 7059 0.00168 0.05948 0 188 0 0 1 0 1 0 0 -66.8600 9.7000 66.9300 -7.1200 0.0000 0.0000 0.0000 0.0000; + 7059 7407 0.00062 0.00444 0.00809 443 0 0 0 0 1 0 0 84.1600 1.9200 -84.1100 -2.4600 0.0000 0.0000 0.0000 0.0000; + 7129 7060 0.01191 0.05306 0.00778 149 0 0 0 0 1 0 0 -66.3400 11.1900 66.8600 -9.7000 0.0000 0.0000 0.0000 0.0000; + 7067 7245 0.00829 0.04734 0.00711 98 0 0 0 0 1 0 0 -12.3600 -37.6800 12.4900 37.7500 0.0000 0.0000 0.0000 0.0000; + 7067 7291 0.00748 0.04274 0.00642 98 0 0 0 0 1 0 0 -9.6700 7.6100 9.6900 -8.1600 0.0000 0.0000 0.0000 0.0000; + 7067 7344 0.01002 0.02449 0.00321 98 0 0 0 0 1 0 0 -60.6500 6.6400 61.0400 -6.0000 0.0000 0.0000 0.0000 0.0000; + 7069 7068 0.0023 0.07154 0 218.7 0 0 1 0 1 0 0 -96.6200 -8.7200 96.8400 15.4000 0.0000 0.0000 0.0000 0.0000; + 7305 7068 0.0021 0.0205 0.03945 548 0 0 0 0 1 0 0 97.0300 13.2200 -96.8400 -15.4000 0.0000 0.0000 0.0000 0.0000; + 7069 7413 0.01312 0.05846 0.00857 149 0 0 0 0 1 0 0 45.4600 -5.7800 -45.1900 6.1300 0.0000 0.0000 0.0000 0.0000; + 7070 7100 0.00621 0.04324 0.00707 221 0 0 0 0 1 0 0 25.5500 -4.1700 -25.5100 3.7600 0.0000 0.0000 0.0000 0.0000; + 7070 7257 0.00619 0.03538 0.00532 98 0 0 0 0 1 0 0 15.2000 6.9700 -15.1900 -7.3900 0.0000 0.0000 0.0000 0.0000; + 7070 7317 0.00528 0.03607 0.00614 221 0 0 0 0 1 0 0 -41.8100 -0.0900 41.9100 0.1200 0.0000 0.0000 0.0000 0.0000; + 7070 7398 0.00238 0.01063 0.00156 149 0 0 0 0 1 0 0 -99.9800 -31.3500 100.2400 32.3700 0.0000 0.0000 0.0000 0.0000; + 7123 7071 0.0119 0.02858 0.00388 221 0 0 0 0 1 0 0 24.1400 -12.8800 -24.0500 12.7100 0.0000 0.0000 0.0000 0.0000; + 7408 7071 0.03482 0.08511 0.01114 221 0 0 0 0 1 0 0 -20.0900 13.1700 20.2900 -13.7800 0.0000 0.0000 0.0000 0.0000; + 7072 7084 0.00344 0.02395 0.00391 221 0 0 0 0 1 0 0 -94.0300 15.1800 94.3400 -13.4400 0.0000 0.0000 0.0000 0.0000; + 7072 7084 0.00344 0.02395 0.00391 221 0 0 0 0 1 0 0 -94.0300 15.1800 94.3400 -13.4400 0.0000 0.0000 0.0000 0.0000; + 7074 7073 0.00062 0.03776 0 185 0 0 1 0 1 0 0 -121.7600 -2.9600 121.8500 8.4000 0.0000 0.0000 0.0000 0.0000; + 7171 7073 0.0022 0.01575 0.02871 443 0 0 0 0 1 0 0 -44.2900 1.7500 44.3400 -4.4200 0.0000 0.0000 0.0000 0.0000; + 7205 7073 0.00402 0.03929 0.07559 548 0 0 0 0 1 0 0 167.2600 6.5800 -166.1900 -3.9800 0.0000 0.0000 0.0000 0.0000; + 7405 7074 0.00499 0.02067 0.00351 149 0 0 0 0 1 0 0 -52.4900 16.8800 52.6300 -16.6300 0.0000 0.0000 0.0000 0.0000; + 7075 7387 0.01167 0.07976 0.01357 221 0 0 0 0 1 0 0 98.9000 29.1800 -97.7000 -22.3000 0.0000 0.0000 0.0000 0.0000; + 7075 7387 0.01167 0.07976 0.01357 221 0 0 0 0 1 0 0 98.9000 29.1800 -97.7000 -22.3000 0.0000 0.0000 0.0000 0.0000; + 7075 7398 0.00592 0.03823 0.00729 221 0 0 0 0 1 0 0 37.0100 39.5700 -36.8400 -39.2200 0.0000 0.0000 0.0000 0.0000; + 7075 7398 0.00592 0.03823 0.00729 221 0 0 0 0 1 0 0 37.0100 39.5700 -36.8400 -39.2200 0.0000 0.0000 0.0000 0.0000; + 7077 7076 7e-05 0.00459 0 1233 0 0 1 0 1 0 0 -936.5100 -125.2600 937.1000 164.0800 0.0000 0.0000 0.0000 0.0000; + 7079 7076 0.00024 0.01675 0 855 0 0 1 0 1 0 0 159.9000 34.4500 -159.8400 -30.3000 0.0000 0.0000 0.0000 0.0000; + 7080 7076 0.00037 0.02147 0 857 0 0 1 0 1 0 0 165.5200 26.9800 -165.4300 -21.4000 0.0000 0.0000 0.0000 0.0000; + 7081 7076 0.0003 0.02166 0 863 0 0 1 0 1 0 0 165.5200 27.3300 -165.4500 -21.7000 0.0000 0.0000 0.0000 0.0000; + 7082 7076 0.00028 0.01719 0 847 0 0 1 0 1 0 0 165.5200 33.3500 -165.4500 -28.8200 0.0000 0.0000 0.0000 0.0000; + 7204 7076 0.00014 0.00172 0.1143 2020 0 0 0 0 1 0 0 841.2900 -78.2900 -840.3600 77.5200 0.0000 0.0000 0.0000 0.0000; + 7076 7422 0.00061 0.00741 0.49226 2020 0 0 0 0 1 0 0 559.4200 -139.3900 -557.5600 108.9900 0.0000 0.0000 0.0000 0.0000; + 7078 7077 0.0011 0.04562 0 220 0 0 1 0 1 0 0 -180.4100 -11.7600 180.7600 26.1800 0.0000 0.0000 0.0000 0.0000; + 7077 7282 0.00125 0.00896 0.01633 523 0 0 0 0 1 0 0 167.9100 37.5300 -167.5600 -36.7300 0.0000 0.0000 0.0000 0.0000; + 7206 7078 0.00828 0.03692 0.00541 149 0 0 0 0 1 0 0 22.7700 14.9500 -22.7100 -15.2500 0.0000 0.0000 0.0000 0.0000; + 7078 7279 0.00273 0.01863 0.00317 221 0 0 0 0 1 0 0 101.5600 13.5000 -101.2800 -11.9400 0.0000 0.0000 0.0000 0.0000; + 7078 7279 0.00273 0.01863 0.00317 221 0 0 0 0 1 0 0 101.5600 13.5000 -101.2800 -11.9400 0.0000 0.0000 0.0000 0.0000; + 7084 7083 0.00053 0.03003 0 355 0 0 1 0 1 0 0 -201.7100 -16.9800 201.9200 29.0900 0.0000 0.0000 0.0000 0.0000; + 7084 7083 0.00053 0.03003 0 355 0 0 1 0 1 0 0 -201.7100 -16.9800 201.9200 29.0900 0.0000 0.0000 0.0000 0.0000; + 7083 7105 0.00233 0.0228 0.04386 548 0 0 0 0 1 0 0 -88.0100 -3.8400 88.1800 1.0100 0.0000 0.0000 0.0000 0.0000; + 7083 7171 0.00193 0.01885 0.03628 548 0 0 0 0 1 0 0 123.4300 -16.6500 -123.1400 15.7200 0.0000 0.0000 0.0000 0.0000; + 7083 7184 0.00606 0.04326 0.07887 443 0 0 0 0 1 0 0 -71.0200 1.4200 71.3200 -7.4500 0.0000 0.0000 0.0000 0.0000; + 7083 7264 0.0013 0.01272 0.02448 647 0 0 0 0 1 0 0 -361.3500 6.9000 362.9900 6.6500 0.0000 0.0000 0.0000 0.0000; + 7423 7083 0.00173 0.01235 0.02252 443 0 0 0 0 1 0 0 6.9400 43.9200 -6.9000 -46.0100 0.0000 0.0000 0.0000 0.0000; + 7085 7244 0.01057 0.07367 0.01204 221 0 0 0 0 1 0 0 43.9900 1.4800 -43.7900 -1.2400 0.0000 0.0000 0.0000 0.0000; + 7085 7244 0.01057 0.07367 0.01204 221 0 0 0 0 1 0 0 43.9900 1.4800 -43.7900 -1.2400 0.0000 0.0000 0.0000 0.0000; + 7412 7085 0.00305 0.02125 0.00347 221 0 0 0 0 1 0 0 46.1100 2.1700 -46.0400 -2.0600 0.0000 0.0000 0.0000 0.0000; + 7412 7085 0.00305 0.02125 0.00347 221 0 0 0 0 1 0 0 46.1100 2.1700 -46.0400 -2.0600 0.0000 0.0000 0.0000 0.0000; + 7086 7222 0.00549 0.02279 0.00387 149 0 0 0 0 1 0 0 25.5500 -3.7500 -25.5200 3.5300 0.0000 0.0000 0.0000 0.0000; + 7086 7419 0.01003 0.0648 0.01236 221 0 0 0 0 1 0 0 -97.9900 4.9800 98.9700 0.1400 0.0000 0.0000 0.0000 0.0000; + 7086 7419 0.01003 0.0648 0.01236 221 0 0 0 0 1 0 0 -97.9900 4.9800 98.9700 0.1400 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7127 0.00301 0.01945 0.00371 250 0 0 0 0 1 0 0 -153.4900 2.3200 154.1900 1.8600 0.0000 0.0000 0.0000 0.0000; + 7087 7221 0.00412 0.02872 0.00469 250 0 0 0 0 1 0 0 158.8700 18.9300 -157.8200 -12.0900 0.0000 0.0000 0.0000 0.0000; + 7087 7221 0.00412 0.02872 0.00469 250 0 0 0 0 1 0 0 158.8700 18.9300 -157.8200 -12.0900 0.0000 0.0000 0.0000 0.0000; + 7087 7221 0.00412 0.02872 0.00469 250 0 0 0 0 1 0 0 158.8700 18.9300 -157.8200 -12.0900 0.0000 0.0000 0.0000 0.0000; + 7087 7336 0.00167 0.01143 0.00194 250 0 0 0 0 1 0 0 166.1100 -19.7400 -165.6500 22.7200 0.0000 0.0000 0.0000 0.0000; + 7087 7336 0.00167 0.01143 0.00194 250 0 0 0 0 1 0 0 166.1100 -19.7400 -165.6500 22.7200 0.0000 0.0000 0.0000 0.0000; + 7087 7336 0.00167 0.01143 0.00194 250 0 0 0 0 1 0 0 166.1100 -19.7400 -165.6500 22.7200 0.0000 0.0000 0.0000 0.0000; + 7087 7336 0.00167 0.01143 0.00194 250 0 0 0 0 1 0 0 166.1100 -19.7400 -165.6500 22.7200 0.0000 0.0000 0.0000 0.0000; + 7087 7336 0.00167 0.01143 0.00194 250 0 0 0 0 1 0 0 166.1100 -19.7400 -165.6500 22.7200 0.0000 0.0000 0.0000 0.0000; + 7088 7116 0.01894 0.08439 0.01238 149 0 0 0 0 1 0 0 -10.5700 -1.8400 10.5900 0.7500 0.0000 0.0000 0.0000 0.0000; + 7088 7147 0.01802 0.07475 0.01268 149 0 0 0 0 1 0 0 -47.8500 -21.5600 48.3600 22.4400 0.0000 0.0000 0.0000 0.0000; + 7237 7088 0.01249 0.05466 0.00832 149 0 0 0 0 1 0 0 42.8700 5.4800 -42.6300 -5.2300 0.0000 0.0000 0.0000 0.0000; + 7089 7388 0.00679 0.02818 0.00478 149 0 0 0 0 1 0 0 -7.3000 68.8100 7.6100 -67.9800 0.0000 0.0000 0.0000 0.0000; + 7089 7427 0.0057 0.02492 0.0038 221 0 0 0 0 1 0 0 52.1400 106.8800 -51.3600 -103.8400 0.0000 0.0000 0.0000 0.0000; + 7090 7421 0.00301 0.02055 0.0035 221 0 0 0 0 1 0 0 -44.3100 -4.1800 44.3700 4.2500 0.0000 0.0000 0.0000 0.0000; + 7090 7421 0.00301 0.02055 0.0035 221 0 0 0 0 1 0 0 -44.3100 -4.1800 44.3700 4.2500 0.0000 0.0000 0.0000 0.0000; + 7091 7226 0.0073 0.04386 0.00595 221 0 0 0 0 1 0 0 -35.3600 71.0900 35.8000 -69.0600 0.0000 0.0000 0.0000 0.0000; + 7091 7259 0.00587 0.04091 0.00669 221 0 0 0 0 1 0 0 -76.2500 71.6500 76.8700 -68.0700 0.0000 0.0000 0.0000 0.0000; + 7091 7259 0.00587 0.04091 0.00669 221 0 0 0 0 1 0 0 -76.2500 71.6500 76.8700 -68.0700 0.0000 0.0000 0.0000 0.0000; + 7091 7418 0.02256 0.0542 0.00736 98 0 0 0 0 1 0 0 -22.8200 49.7300 23.4700 -48.9300 0.0000 0.0000 0.0000 0.0000; + 7092 7216 0.00595 0.01454 0.0019 98 0 0 0 0 1 0 0 48.3900 3.3200 -48.2500 -3.1600 0.0000 0.0000 0.0000 0.0000; + 7092 7250 0.00437 0.01813 0.00308 149 0 0 0 0 1 0 0 -59.6700 -30.2900 59.8600 30.8100 0.0000 0.0000 0.0000 0.0000; + 7092 7258 0.00224 0.0098 0.00149 149 0 0 0 0 1 0 0 -94.8000 10.0300 95.0100 -9.2800 0.0000 0.0000 0.0000 0.0000; + 7092 7330 0.00414 0.01846 0.00271 149 0 0 0 0 1 0 0 26.7000 -6.2200 -26.6600 6.0900 0.0000 0.0000 0.0000 0.0000; + 7092 7384 0.00356 0.02036 0.00306 98 0 0 0 0 1 0 0 40.1600 12.0400 -40.0900 -11.9700 0.0000 0.0000 0.0000 0.0000; + 7221 7093 0.00237 0.0153 0.00292 221 0 0 0 0 1 0 0 72.6300 10.0300 -72.5000 -9.4800 0.0000 0.0000 0.0000 0.0000; + 7221 7093 0.00237 0.0153 0.00292 221 0 0 0 0 1 0 0 72.6300 10.0300 -72.5000 -9.4800 0.0000 0.0000 0.0000 0.0000; + 7093 7225 0.0099 0.04331 0.0066 149 0 0 0 0 1 0 0 59.9900 -11.2200 -59.6200 12.2200 0.0000 0.0000 0.0000 0.0000; + 7241 7093 0.00831 0.0203 0.00266 98 0 0 0 0 1 0 0 -31.0700 11.0800 31.1600 -11.1200 0.0000 0.0000 0.0000 0.0000; + 7093 7258 0.01589 0.03818 0.00518 98 0 0 0 0 1 0 0 -55.3000 10.3700 55.8200 -9.6500 0.0000 0.0000 0.0000 0.0000; + 7094 7276 0.00341 0.01414 0.0024 221 0 0 0 0 1 0 0 -74.5800 -51.8800 74.8600 52.7900 0.0000 0.0000 0.0000 0.0000; + 7094 7388 0.01029 0.02471 0.00335 98 0 0 0 0 1 0 0 -2.1100 30.1500 2.2000 -30.2600 0.0000 0.0000 0.0000 0.0000; + 7096 7095 0.00022 0.01326 0 846 0 0 1 0 1 0 0 -299.3000 58.6300 299.5000 -46.6600 0.0000 0.0000 0.0000 0.0000; + 7098 7095 0.00028 0.02986 0 1600 0 0 1 0 1 0 0 1236.1000 192.1100 -1231.7200 275.1600 0.0000 0.0000 0.0000 0.0000; + 7099 7095 0.00022 0.01103 0 1600 0 0 1 0 1 0 0 1350.5900 -7.3800 -1346.5700 208.5800 0.0000 0.0000 0.0000 0.0000; + 7304 7095 0.00071 0.00855 0.56788 2020 0 0 0 0 1 0 0 -673.5600 211.1600 677.0400 -227.9300 0.0000 0.0000 0.0000 0.0000; + 7097 7096 0.00097 0.05173 0 200 0 0 1 0 1 0 0 -58.8100 2.2000 58.8400 -0.4600 0.0000 0.0000 0.0000 0.0000; + 7261 7096 0.0027 0.01928 0.03515 523 0 0 0 0 1 0 0 -238.8600 65.9400 240.4600 -58.1700 0.0000 0.0000 0.0000 0.0000; + 7097 7153 0.03408 0.08331 0.01091 221 0 0 0 0 1 0 0 58.8100 -2.2000 -57.6600 3.8900 0.0000 0.0000 0.0000 0.0000; + 7100 7103 0.00199 0.01384 0.00226 221 0 0 0 0 1 0 0 41.3800 -11.1600 -41.3400 11.1900 0.0000 0.0000 0.0000 0.0000; + 7100 7103 0.00199 0.01384 0.00226 221 0 0 0 0 1 0 0 41.3800 -11.1600 -41.3400 11.1900 0.0000 0.0000 0.0000 0.0000; + 7100 7144 0.00174 0.01212 0.00198 221 0 0 0 0 1 0 0 -93.7000 -2.2600 93.8500 3.1500 0.0000 0.0000 0.0000 0.0000; + 7100 7144 0.00174 0.01212 0.00198 221 0 0 0 0 1 0 0 -93.7000 -2.2600 93.8500 3.1500 0.0000 0.0000 0.0000 0.0000; + 7100 7144 0.00174 0.01212 0.00198 221 0 0 0 0 1 0 0 -93.7000 -2.2600 93.8500 3.1500 0.0000 0.0000 0.0000 0.0000; + 7100 7144 0.00174 0.01212 0.00198 221 0 0 0 0 1 0 0 -93.7000 -2.2600 93.8500 3.1500 0.0000 0.0000 0.0000 0.0000; + 7100 7222 0.00195 0.01331 0.00226 221 0 0 0 0 1 0 0 68.4800 7.1000 -68.3900 -6.6900 0.0000 0.0000 0.0000 0.0000; + 7100 7222 0.00195 0.01331 0.00226 221 0 0 0 0 1 0 0 68.4800 7.1000 -68.3900 -6.6900 0.0000 0.0000 0.0000 0.0000; + 7101 7183 0.00837 0.03729 0.00547 221 0 0 0 0 1 0 0 61.6200 -89.6500 -60.6400 93.4600 0.0000 0.0000 0.0000 0.0000; + 7101 7386 0.00972 0.04254 0.00648 149 0 0 0 0 1 0 0 36.6300 9.1900 -36.4900 -9.2300 0.0000 0.0000 0.0000 0.0000; + 7102 7177 0.0037 0.0239 0.00456 221 0 0 0 0 1 0 0 -83.3000 -6.2400 83.5700 7.5200 0.0000 0.0000 0.0000 0.0000; + 7102 7177 0.0037 0.0239 0.00456 221 0 0 0 0 1 0 0 -83.3000 -6.2400 83.5700 7.5200 0.0000 0.0000 0.0000 0.0000; + 7290 7102 0.00551 0.02285 0.00388 149 0 0 0 0 1 0 0 -48.4000 21.2400 48.5500 -20.9600 0.0000 0.0000 0.0000 0.0000; + 7103 7255 0.00598 0.02614 0.00398 149 0 0 0 0 1 0 0 -37.8200 -8.4300 37.9200 8.4300 0.0000 0.0000 0.0000 0.0000; + 7103 7381 0.0191 0.04669 0.00611 250 0 0 0 0 1 0 0 61.8600 -30.5700 -60.9500 32.2100 0.0000 0.0000 0.0000 0.0000; + 7105 7104 0.00012 0.01194 0 1312 0 0 1 0 1 0 0 -690.1400 -78.5300 690.6900 134.0400 0.0000 0.0000 0.0000 0.0000; + 7107 7104 0.00016 0.01012 0 592 0 0 1 0 1 0 0 149.5900 76.3500 -149.5500 -73.7100 0.0000 0.0000 0.0000 0.0000; + 7108 7104 0.00066 0.0454 0 335 0 0 1 0 1 0 0 50.8600 18.5300 -50.8400 -17.3000 0.0000 0.0000 0.0000 0.0000; + 7109 7104 0.00038 0.03767 0 339 0 0 1 0 1 0 0 50.8600 22.5100 -50.8500 -21.4300 0.0000 0.0000 0.0000 0.0000; + 7110 7104 0.00018 0.01895 0 731 0 0 1 0 1 0 0 195.4600 46.3700 -195.4000 -39.2900 0.0000 0.0000 0.0000 0.0000; + 7111 7104 0.0002 0.01942 0 743 0 0 1 0 1 0 0 195.4600 45.2100 -195.3900 -37.9800 0.0000 0.0000 0.0000 0.0000; + 7112 7104 0.00016 0.01175 0 740 0 0 1 0 1 0 0 195.4600 71.7600 -195.4000 -67.0500 0.0000 0.0000 0.0000 0.0000; + 7113 7104 0.00031 0.0227 0 748 0 0 1 0 1 0 0 195.4600 38.8000 -195.3500 -30.4700 0.0000 0.0000 0.0000 0.0000; + 7114 7104 0.00018 0.01098 0 752 0 0 1 0 1 0 0 195.4600 76.1500 -195.3900 -71.6900 0.0000 0.0000 0.0000 0.0000; + 7115 7104 0.00016 0.01098 0 744 0 0 1 0 1 0 0 195.4600 76.5100 -195.4000 -72.0400 0.0000 0.0000 0.0000 0.0000; + 7130 7104 5e-05 0.00102 0.07092 2768 0 0 0 0 1 0 0 490.1800 -321.4200 -490.0200 317.1800 0.0000 0.0000 0.0000 0.0000; + 7106 7105 0.00051 0.03345 0 354 0 0 1 0 1 0 0 -227.2000 -6.0000 227.4500 22.8500 0.0000 0.0000 0.0000 0.0000; + 7106 7105 0.00051 0.03345 0 354 0 0 1 0 1 0 0 -227.2000 -6.0000 227.4500 22.8500 0.0000 0.0000 0.0000 0.0000; + 7105 7187 0.00243 0.02373 0.04566 548 0 0 0 0 1 0 0 157.3300 19.2100 -156.7400 -18.1400 0.0000 0.0000 0.0000 0.0000; + 7105 7205 0.00202 0.01979 0.03807 548 0 0 0 0 1 0 0 -146.0500 -22.0900 146.4800 22.2500 0.0000 0.0000 0.0000 0.0000; + 7105 7332 0.00074 0.00725 0.01395 548 0 0 0 0 1 0 0 135.7700 34.7000 -135.6300 -34.7700 0.0000 0.0000 0.0000 0.0000; + 7116 7340 0.01409 0.0616 0.00938 149 0 0 0 0 1 0 0 29.8300 -11.5200 -29.6800 11.2600 0.0000 0.0000 0.0000 0.0000; + 7116 7364 0.02897 0.06959 0.00944 98 0 0 0 0 1 0 0 -19.3300 2.9000 19.4400 -3.5400 0.0000 0.0000 0.0000 0.0000; + 7242 7117 0.00214 0.01492 0.00244 221 0 0 0 0 1 0 0 -75.4000 -21.5100 75.5400 22.2000 0.0000 0.0000 0.0000 0.0000; + 7242 7117 0.00214 0.01492 0.00244 221 0 0 0 0 1 0 0 -75.4000 -21.5100 75.5400 22.2000 0.0000 0.0000 0.0000 0.0000; + 7117 7292 0.00208 0.01424 0.00242 250 0 0 0 0 1 0 0 -154.4600 -25.9200 154.9800 29.2100 0.0000 0.0000 0.0000 0.0000; + 7117 7292 0.00208 0.01424 0.00242 250 0 0 0 0 1 0 0 -154.4600 -25.9200 154.9800 29.2100 0.0000 0.0000 0.0000 0.0000; + 7117 7395 0.00404 0.02761 0.0047 221 0 0 0 0 1 0 0 36.9100 -8.1900 -36.8500 8.1200 0.0000 0.0000 0.0000 0.0000; + 7117 7395 0.00404 0.02761 0.0047 221 0 0 0 0 1 0 0 36.9100 -8.1900 -36.8500 8.1200 0.0000 0.0000 0.0000 0.0000; + 7177 7118 0.00272 0.01856 0.00316 221 0 0 0 0 1 0 0 70.4300 14.4600 -70.2900 -13.7900 0.0000 0.0000 0.0000 0.0000; + 7177 7118 0.00272 0.01856 0.00316 221 0 0 0 0 1 0 0 70.4300 14.4600 -70.2900 -13.7900 0.0000 0.0000 0.0000 0.0000; + 7118 7404 0.0055 0.03759 0.0064 221 0 0 0 0 1 0 0 19.4300 -6.7400 -19.4000 6.2800 0.0000 0.0000 0.0000 0.0000; + 7144 7119 0.00176 0.01229 0.00201 221 0 0 0 0 1 0 0 77.1100 0.9400 -77.0100 -0.4100 0.0000 0.0000 0.0000 0.0000; + 7144 7119 0.00176 0.01229 0.00201 221 0 0 0 0 1 0 0 77.1100 0.9400 -77.0100 -0.4100 0.0000 0.0000 0.0000 0.0000; + 7119 7259 0.01192 0.02865 0.00389 98 0 0 0 0 1 0 0 23.1800 -39.8000 -22.9200 40.0200 0.0000 0.0000 0.0000 0.0000; + 7119 7318 0.00442 0.01971 0.00289 166.88 0 0 0 0 1 0 0 81.1300 26.5200 -80.8000 -25.3500 0.0000 0.0000 0.0000 0.0000; + 7121 7120 0.0094 0.18529 0 41 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7122 7120 0.00662 0.19298 0 46 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7120 7248 0.00645 0.03687 0.00554 98 0 0 0 0 1 0 0 -18.2300 -1.4800 18.2500 1.0700 0.0000 0.0000 0.0000 0.0000; + 7120 7396 0.00289 0.02016 0.0033 221 0 0 0 0 1 0 0 -112.3300 -2.8800 112.7100 5.1800 0.0000 0.0000 0.0000 0.0000; + 7120 7396 0.00289 0.02016 0.0033 221 0 0 0 0 1 0 0 -112.3300 -2.8800 112.7100 5.1800 0.0000 0.0000 0.0000 0.0000; + 7427 7120 0.00159 0.01024 0.00195 221 0 0 0 0 1 0 0 -46.5600 17.6600 46.6000 -17.5900 0.0000 0.0000 0.0000 0.0000; + 7427 7120 0.00159 0.01024 0.00195 221 0 0 0 0 1 0 0 -46.5600 17.6600 46.6000 -17.5900 0.0000 0.0000 0.0000 0.0000; + 7123 7153 0.0626 0.15302 0.02004 221 0 0 0 0 1 0 0 -30.7700 11.0100 31.4600 -11.3100 0.0000 0.0000 0.0000 0.0000; + 7124 7180 0.0069 0.01687 0.00221 98 0 0 0 0 1 0 0 39.9700 -20.5900 -39.8300 20.7100 0.0000 0.0000 0.0000 0.0000; + 7126 7125 0.00011 0.01326 0 1358 0 0 1 0 1 0 0 -858.4100 -67.6900 859.2100 163.7100 0.0000 0.0000 0.0000 0.0000; + 7126 7125 0.00011 0.01326 0 1358 0 0 1 0 1 0 0 -858.4100 -67.6900 859.2100 163.7100 0.0000 0.0000 0.0000 0.0000; + 7125 7331 0.00057 0.00696 0.46259 2020 0 0 0 0 1 0 0 346.8800 -40.9800 -346.2300 0.0800 0.0000 0.0000 0.0000 0.0000; + 7346 7125 6e-05 0.00128 0.11073 4352 0 0 0 0 1 0 0 2067.7600 327.3200 -2065.2900 -286.4400 0.0000 0.0000 0.0000 0.0000; + 7127 7126 0.00019 0.01178 0 512.3 0 0 1 0 1 0 0 -402.8200 -20.0200 403.1300 38.8900 0.0000 0.0000 0.0000 0.0000; + 7127 7126 0.00019 0.01178 0 512.3 0 0 1 0 1 0 0 -402.8200 -20.0200 403.1300 38.8900 0.0000 0.0000 0.0000 0.0000; + 7127 7126 0.00019 0.01178 0 512.3 0 0 1 0 1 0 0 -402.8200 -20.0200 403.1300 38.8900 0.0000 0.0000 0.0000 0.0000; + 7127 7126 0.00019 0.01178 0 512.3 0 0 1 0 1 0 0 -402.8200 -20.0200 403.1300 38.8900 0.0000 0.0000 0.0000 0.0000; + 7126 7305 0.00691 0.04934 0.08995 443 0 0 0 0 1 0 0 -106.1800 -3.0200 106.9400 -0.8300 0.0000 0.0000 0.0000 0.0000; + 7126 7332 0.00592 0.04228 0.07708 443 0 0 0 0 1 0 0 -88.1700 2.1100 88.6200 -6.8000 0.0000 0.0000 0.0000 0.0000; + 7126 7423 0.00612 0.04375 0.07976 443 0 0 0 0 1 0 0 -64.7000 -16.8200 64.9600 10.4300 0.0000 0.0000 0.0000 0.0000; + 7391 7128 0.00567 0.03872 0.00659 221 0 0 0 0 1 0 0 35.2100 20.8900 -35.1200 -20.9200 0.0000 0.0000 0.0000 0.0000; + 7277 7129 0.0122 0.07328 0.00994 98 0 0 0 0 1 0 0 -50.5000 20.2100 50.8400 -19.2000 0.0000 0.0000 0.0000 0.0000; + 7303 7129 0.02396 0.05755 0.00781 98 0 0 0 0 1 0 0 -10.3100 -7.2700 10.3500 6.5500 0.0000 0.0000 0.0000 0.0000; + 7131 7130 0.0003 0.01434 0 1373 0 0 1 0 1 0 0 -615.8200 -51.1900 616.9300 104.2100 0.0000 0.0000 0.0000 0.0000; + 7133 7130 0.00046 0.05358 0 295 0 0 1 0 1 0 0 16.2600 -1.8100 -16.2500 1.9500 0.0000 0.0000 0.0000 0.0000; + 7134 7130 0.0002 0.01347 0 776 0 0 1 0 1 0 0 205.9800 -22.9300 -205.9000 28.4300 0.0000 0.0000 0.0000 0.0000; + 7135 7130 0.00024 0.01692 0 767 0 0 1 0 1 0 0 205.9800 -22.9300 -205.8900 29.8500 0.0000 0.0000 0.0000 0.0000; + 7136 7130 0.00025 0.0186 0 768 0 0 1 0 1 0 0 205.9800 -22.9300 -205.8800 30.5400 0.0000 0.0000 0.0000 0.0000; + 7137 7130 0.00043 0.01928 0 781 0 0 1 0 1 0 0 205.9800 -22.9300 -205.8100 30.8200 0.0000 0.0000 0.0000 0.0000; + 7138 7130 0.0001 0.00697 0 1053 0 0 1 0 1 0 0 379.6600 -42.2600 -379.5200 51.9200 0.0000 0.0000 0.0000 0.0000; + 7139 7130 0.001 0.0466 0 357 0 0 1 0 1 0 0 58.8400 -6.5500 -58.8000 8.1000 0.0000 0.0000 0.0000 0.0000; + 7140 7130 0.00043 0.03937 0 360 0 0 1 0 1 0 0 58.8400 -6.5500 -58.8200 7.8600 0.0000 0.0000 0.0000 0.0000; + 7141 7130 0.00037 0.02584 0 368 0 0 1 0 1 0 0 58.8400 -6.5500 -58.8300 7.4100 0.0000 0.0000 0.0000 0.0000; + 7142 7130 0.00045 0.03413 0 363 0 0 1 0 1 0 0 58.8400 -6.5500 -58.8200 7.6800 0.0000 0.0000 0.0000 0.0000; + 7263 7130 0.00015 0.00182 0.1209 2020 0 0 0 0 1 0 0 -347.2400 -23.3600 347.4100 12.6600 0.0000 0.0000 0.0000 0.0000; + 7132 7131 0.00109 0.03352 0 446 0 0 1 0 1 0 0 -193.7200 -27.4200 194.1300 40.1800 0.0000 0.0000 0.0000 0.0000; + 7132 7131 0.00109 0.03352 0 446 0 0 1 0 1 0 0 -193.7200 -27.4200 194.1300 40.1800 0.0000 0.0000 0.0000 0.0000; + 7131 7160 0.00484 0.04731 0.09103 548 0 0 0 0 1 0 0 163.6700 -13.0900 -162.4100 16.0100 0.0000 0.0000 0.0000 0.0000; + 7131 7278 0.0023 0.01644 0.02997 443 0 0 0 0 1 0 0 71.7500 -6.0100 -71.6300 3.7400 0.0000 0.0000 0.0000 0.0000; + 7131 7401 0.00248 0.01771 0.03228 443 0 0 0 0 1 0 0 -7.8600 -10.0700 7.8700 6.7500 0.0000 0.0000 0.0000 0.0000; + 7132 7283 0.00306 0.0198 0.00378 221 0 0 0 0 1 0 0 -3.4500 9.3900 3.4500 -9.7500 0.0000 0.0000 0.0000 0.0000; + 7419 7132 0.00182 0.01246 0.00212 221 0 0 0 0 1 0 0 -105.8400 -7.0900 106.0500 8.2800 0.0000 0.0000 0.0000 0.0000; + 7419 7132 0.00182 0.01246 0.00212 221 0 0 0 0 1 0 0 -105.8400 -7.0900 106.0500 8.2800 0.0000 0.0000 0.0000 0.0000; + 7419 7132 0.00182 0.01246 0.00212 221 0 0 0 0 1 0 0 -105.8400 -7.0900 106.0500 8.2800 0.0000 0.0000 0.0000 0.0000; + 7143 7173 0.00756 0.0432 0.00649 98 0 0 0 0 1 0 0 -18.0300 43.8500 18.2000 -43.5000 0.0000 0.0000 0.0000 0.0000; + 7234 7143 0.00693 0.04159 0.00564 98 0 0 0 0 1 0 0 8.2000 -2.6600 -8.1900 2.1300 0.0000 0.0000 0.0000 0.0000; + 7143 7238 0.03371 0.14747 0.02246 149 0 0 0 0 1 0 0 -55.5900 -0.7300 56.6300 3.0000 0.0000 0.0000 0.0000 0.0000; + 7300 7143 0.00916 0.05231 0.00786 245 0 0 0 0 1 0 0 -21.4500 63.6800 21.8500 -62.2400 0.0000 0.0000 0.0000 0.0000; + 7144 7272 0.00479 0.03337 0.00546 221 0 0 0 0 1 0 0 53.3500 -0.5400 -53.2200 0.9600 0.0000 0.0000 0.0000 0.0000; + 7144 7272 0.00479 0.03337 0.00546 221 0 0 0 0 1 0 0 53.3500 -0.5400 -53.2200 0.9600 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7333 7144 0.00251 0.01716 0.00292 221 0 0 0 0 1 0 0 122.7200 9.1600 -122.3400 -6.8500 0.0000 0.0000 0.0000 0.0000; + 7146 7145 0.00456 0.21285 0 25 0 0 1 0 1 0 0 10.1700 -1.1300 -10.1700 1.3400 0.0000 0.0000 0.0000 0.0000; + 7145 7234 0.0104 0.06243 0.00847 98 0 0 0 0 1 0 0 1.1200 50.4200 -0.8700 -49.7700 0.0000 0.0000 0.0000 0.0000; + 7145 7243 0.01348 0.05591 0.00949 221 0 0 0 0 1 0 0 -81.1100 79.2800 82.7500 -73.4400 0.0000 0.0000 0.0000 0.0000; + 7381 7145 0.00645 0.03876 0.00526 221 0 0 0 0 1 0 0 56.9800 -93.6000 -56.2000 97.7200 0.0000 0.0000 0.0000 0.0000; + 7145 7404 0.01139 0.06841 0.00928 221 0 0 0 0 1 0 0 2.5700 63.8600 -2.1300 -62.1300 0.0000 0.0000 0.0000 0.0000; + 7336 7147 0.00171 0.01165 0.00198 221 0 0 0 0 1 0 0 139.0900 -32.1300 -138.7400 34.2900 0.0000 0.0000 0.0000 0.0000; + 7336 7147 0.00171 0.01165 0.00198 221 0 0 0 0 1 0 0 139.0900 -32.1300 -138.7400 34.2900 0.0000 0.0000 0.0000 0.0000; + 7336 7147 0.00171 0.01165 0.00198 221 0 0 0 0 1 0 0 139.0900 -32.1300 -138.7400 34.2900 0.0000 0.0000 0.0000 0.0000; + 7336 7147 0.00171 0.01165 0.00198 221 0 0 0 0 1 0 0 139.0900 -32.1300 -138.7400 34.2900 0.0000 0.0000 0.0000 0.0000; + 7386 7147 0.00225 0.01539 0.00262 221 0 0 0 0 1 0 0 -119.8500 -48.3000 120.2300 50.6400 0.0000 0.0000 0.0000 0.0000; + 7386 7147 0.00225 0.01539 0.00262 221 0 0 0 0 1 0 0 -119.8500 -48.3000 120.2300 50.6400 0.0000 0.0000 0.0000 0.0000; + 7178 7148 0.00225 0.01565 0.00256 221 0 0 0 0 1 0 0 -47.9100 -11.3400 47.9700 11.4800 0.0000 0.0000 0.0000 0.0000; + 7178 7148 0.00225 0.01565 0.00256 221 0 0 0 0 1 0 0 -47.9100 -11.3400 47.9700 11.4800 0.0000 0.0000 0.0000 0.0000; + 7148 7245 0.00801 0.04577 0.00688 98 0 0 0 0 1 0 0 31.7300 -26.7300 -31.5900 26.8500 0.0000 0.0000 0.0000 0.0000; + 7148 7298 0.00778 0.03402 0.00518 149 0 0 0 0 1 0 0 -19.2500 1.0400 19.2800 -1.4200 0.0000 0.0000 0.0000 0.0000; + 7148 7365 0.0043 0.02938 0.005 221 0 0 0 0 1 0 0 -83.9400 -7.0600 84.2500 8.7000 0.0000 0.0000 0.0000 0.0000; + 7148 7365 0.0043 0.02938 0.005 221 0 0 0 0 1 0 0 -83.9400 -7.0600 84.2500 8.7000 0.0000 0.0000 0.0000 0.0000; + 7149 7408 0.0135 0.0771 0.01159 98 0 0 0 0 1 0 0 -35.5200 7.5300 35.7000 -7.6800 0.0000 0.0000 0.0000 0.0000; + 7151 7150 0.00105 0.04281 0 151.8 0 0 1 0 1 0 0 -105.7200 -13.8400 105.8400 18.5000 0.0000 0.0000 0.0000 0.0000; + 7150 7390 0.00103 0.01076 0.03665 750 0 0 0 0 1 0 0 -196.7300 36.0800 197.1200 -35.8900 0.0000 0.0000 0.0000 0.0000; + 7150 7390 0.00103 0.01076 0.03665 750 0 0 0 0 1 0 0 -196.7300 36.0800 197.1200 -35.8900 0.0000 0.0000 0.0000 0.0000; + 7150 7420 0.0052 0.03715 0.06773 443 0 0 0 0 1 0 0 -71.9500 65.0100 72.4400 -68.5900 0.0000 0.0000 0.0000 0.0000; + 8004 7150 0.01032 0.1009 0.19415 647 0 0 0 0 1 0 0 -346.9200 83.3900 359.5800 19.9400 0.0000 0.0000 0.0000 0.0000; + 7151 7254 0.00477 0.03078 0.00587 221 0 0 0 0 1 0 0 61.6700 1.3600 -61.4900 -0.8500 0.0000 0.0000 0.0000 0.0000; + 7330 7152 0.00193 0.01249 0.00238 221 0 0 0 0 1 0 0 -99.9500 -2.3400 100.1500 3.3700 0.0000 0.0000 0.0000 0.0000; + 7330 7152 0.00193 0.01249 0.00238 221 0 0 0 0 1 0 0 -99.9500 -2.3400 100.1500 3.3700 0.0000 0.0000 0.0000 0.0000; + 7152 7399 0.00147 0.0095 0.00181 221 0 0 0 0 1 0 0 -101.9400 -3.8800 102.1000 4.7000 0.0000 0.0000 0.0000 0.0000; + 7152 7399 0.00147 0.0095 0.00181 221 0 0 0 0 1 0 0 -101.9400 -3.8800 102.1000 4.7000 0.0000 0.0000 0.0000 0.0000; + 7154 7157 0.00654 0.04553 0.00744 221 0 0 0 0 1 0 0 -78.6500 26.0400 79.1000 -23.6900 0.0000 0.0000 0.0000 0.0000; + 7154 7157 0.00654 0.04553 0.00744 221 0 0 0 0 1 0 0 -78.6500 26.0400 79.1000 -23.6900 0.0000 0.0000 0.0000 0.0000; + 7300 7154 0.00482 0.02753 0.00414 221 0 0 0 0 1 0 0 -57.4200 104.1000 58.0600 -100.8500 0.0000 0.0000 0.0000 0.0000; + 7154 7411 0.00439 0.02634 0.00357 98 0 0 0 0 1 0 0 40.6400 32.1600 -40.5200 -31.8200 0.0000 0.0000 0.0000 0.0000; + 7155 7258 0.00356 0.02032 0.00305 98 0 0 0 0 1 0 0 -38.4400 -26.5200 38.5200 26.6800 0.0000 0.0000 0.0000 0.0000; + 7155 7316 0.00716 0.03193 0.00468 149 0 0 0 0 1 0 0 -39.9700 4.3000 40.0900 -4.2300 0.0000 0.0000 0.0000 0.0000; + 7157 7156 0.00036 0.02246 0 424 0 0 1 0 1 0 0 -258.2100 -14.6400 258.4500 29.7000 0.0000 0.0000 0.0000 0.0000; + 7157 7156 0.00036 0.02246 0 424 0 0 1 0 1 0 0 -258.2100 -14.6400 258.4500 29.7000 0.0000 0.0000 0.0000 0.0000; + 7157 7156 0.00036 0.02246 0 424 0 0 1 0 1 0 0 -258.2100 -14.6400 258.4500 29.7000 0.0000 0.0000 0.0000 0.0000; + 7176 7156 0.00094 0.00975 0.03322 750 0 0 0 0 1 0 0 111.4900 60.9500 -111.3400 -62.7700 0.0000 0.0000 0.0000 0.0000; + 7156 7367 0.00253 0.0263 0.0896 750 0 0 0 0 1 0 0 -369.1200 3.2200 372.5400 23.1300 0.0000 0.0000 0.0000 0.0000; + 7156 7367 0.00253 0.0263 0.0896 750 0 0 0 0 1 0 0 -369.1200 3.2200 372.5400 23.1300 0.0000 0.0000 0.0000 0.0000; + 7157 7295 0.00326 0.02272 0.00371 221 0 0 0 0 1 0 0 99.4400 28.4300 -99.0900 -26.3600 0.0000 0.0000 0.0000 0.0000; + 7157 7295 0.00326 0.02272 0.00371 221 0 0 0 0 1 0 0 99.4400 28.4300 -99.0900 -26.3600 0.0000 0.0000 0.0000 0.0000; + 7173 7158 0.00459 0.01903 0.00323 149 0 0 0 0 1 0 0 -74.9800 11.1200 75.2500 -10.3000 0.0000 0.0000 0.0000 0.0000; + 7158 7291 0.00974 0.0426 0.00649 149 0 0 0 0 1 0 0 57.6100 0.9800 -57.2700 -0.1400 0.0000 0.0000 0.0000 0.0000; + 7158 7394 0.00264 0.01704 0.00325 221 0 0 0 0 1 0 0 -105.6100 -6.4400 105.9200 8.1000 0.0000 0.0000 0.0000 0.0000; + 7158 7394 0.00264 0.01704 0.00325 221 0 0 0 0 1 0 0 -105.6100 -6.4400 105.9200 8.1000 0.0000 0.0000 0.0000 0.0000; + 7160 7159 0.0001 0.00504 0 1310 0 0 1 0 1 0 0 -828.0600 -211.9800 828.7700 247.7100 0.0000 0.0000 0.0000 0.0000; + 7162 7159 0.00022 0.01603 0 491 0 0 1 0 1 0 0 110.3000 56.3000 -110.2700 -54.0100 0.0000 0.0000 0.0000 0.0000; + 7163 7159 0.00034 0.02489 0 498 0 0 1 0 1 0 0 110.3000 52.7200 -110.2500 -49.2800 0.0000 0.0000 0.0000 0.0000; + 7164 7159 0.00017 0.01804 0 498 0 0 1 0 1 0 0 110.3000 56.3000 -110.2700 -53.7300 0.0000 0.0000 0.0000 0.0000; + 7165 7159 0.00017 0.01624 0 512 0 0 1 0 1 0 0 110.3000 56.3000 -110.2700 -53.9800 0.0000 0.0000 0.0000 0.0000; + 7166 7159 0.00043 0.0291 0 507 0 0 1 0 1 0 0 110.3000 45.1900 -110.2400 -41.3700 0.0000 0.0000 0.0000 0.0000; + 7167 7159 0.0005 0.03535 0 500 0 0 1 0 1 0 0 110.3000 37.6300 -110.2300 -33.1900 0.0000 0.0000 0.0000 0.0000; + 7168 7159 0.00025 0.02347 0 418 0 0 1 0 1 0 0 87.4800 44.6500 -87.4600 -42.5500 0.0000 0.0000 0.0000 0.0000; + 7169 7159 0.00016 0.01916 0 416 0 0 1 0 1 0 0 87.4800 44.6500 -87.4700 -42.9300 0.0000 0.0000 0.0000 0.0000; + 7170 7159 0.00016 0.01242 0 1042 0 0 1 0 1 0 0 333.7700 107.9800 -333.5900 -93.8500 0.0000 0.0000 0.0000 0.0000; + 7159 7175 8e-05 0.00168 0.11713 3146 0 0 0 0 1 0 0 1251.9200 30.5200 -1250.7300 -17.9000 0.0000 0.0000 0.0000 0.0000; + 7199 7159 0.00019 0.0023 0.15283 2020 0 0 0 0 1 0 0 -69.8300 -150.5200 69.8800 134.9900 0.0000 0.0000 0.0000 0.0000; + 7159 7227 0.00013 0.00271 0.18901 3146 0 0 0 0 1 0 0 -980.5200 51.6600 981.7100 -46.8200 0.0000 0.0000 0.0000 0.0000; + 7161 7160 0.00037 0.02002 0 418 0 0 1 0 1 0 0 -299.6600 -31.9300 300.0000 49.8900 0.0000 0.0000 0.0000 0.0000; + 7161 7160 0.00037 0.02002 0 418 0 0 1 0 1 0 0 -299.6600 -31.9300 300.0000 49.8900 0.0000 0.0000 0.0000 0.0000; + 7161 7160 0.00037 0.02002 0 418 0 0 1 0 1 0 0 -299.6600 -31.9300 300.0000 49.8900 0.0000 0.0000 0.0000 0.0000; + 7187 7160 0.00262 0.02562 0.04929 548 0 0 0 0 1 0 0 160.5700 -34.1200 -159.8800 35.7800 0.0000 0.0000 0.0000 0.0000; + 7161 7292 0.00143 0.00999 0.00163 331.65 0 0 1 0 1 0 0 190.3600 14.2000 -189.8500 -10.7700 0.0000 0.0000 0.0000 0.0000; + 7161 7292 0.00143 0.00999 0.00163 300 0 0 0 0 1 0 0 190.3600 14.2000 -189.8500 -10.7700 0.0000 0.0000 0.0000 0.0000; + 7161 7292 0.00143 0.00999 0.00163 300 0 0 0 0 1 0 0 190.3600 14.2000 -189.8500 -10.7700 0.0000 0.0000 0.0000 0.0000; + 7161 7292 0.00143 0.00999 0.00163 300 0 0 0 0 1 0 0 190.3600 14.2000 -189.8500 -10.7700 0.0000 0.0000 0.0000 0.0000; + 7172 7171 0.00027 0.01742 0 352 0 0 1 0 1 0 0 -222.6600 24.8800 222.7900 -16.4700 0.0000 0.0000 0.0000 0.0000; + 7171 7252 0.00752 0.05372 0.09795 443 0 0 0 0 1 0 0 -55.3500 -1.0100 55.5700 -7.5400 0.0000 0.0000 0.0000 0.0000; + 7232 7172 0.00301 0.02095 0.00342 221 0 0 0 0 1 0 0 -65.6200 25.9900 65.7700 -25.3500 0.0000 0.0000 0.0000 0.0000; + 7232 7172 0.00301 0.02095 0.00342 221 0 0 0 0 1 0 0 -65.6200 25.9900 65.7700 -25.3500 0.0000 0.0000 0.0000 0.0000; + 7173 7387 0.00415 0.02368 0.00356 102.9 0 0 0 0 1 0 0 -55.7600 0.5000 55.8900 -0.0800 0.0000 0.0000 0.0000 0.0000; + 7174 7231 0.00209 0.01426 0.00243 331.5 0 0 0 0 1 0 0 -134.9100 -24.4800 135.3100 26.9600 0.0000 0.0000 0.0000 0.0000; + 7174 7231 0.00209 0.01426 0.00243 331.5 0 0 0 0 1 0 0 -134.9100 -24.4800 135.3100 26.9600 0.0000 0.0000 0.0000 0.0000; + 7174 7257 0.00838 0.05031 0.00683 98 0 0 0 0 1 0 0 32.5100 -2.2300 -32.4200 2.1100 0.0000 0.0000 0.0000 0.0000; + 7301 7174 0.00178 0.01152 0.0022 221 0 0 0 0 1 0 0 -112.4100 -14.5600 112.6400 15.8600 0.0000 0.0000 0.0000 0.0000; + 7176 7175 0.00019 0.01242 0 1292 0 0 1 0 1 0 0 -345.8200 -103.3800 346.0600 119.1800 0.0000 0.0000 0.0000 0.0000; + 7176 7175 0.00019 0.01242 0 1292 0 0 1 0 1 0 0 -345.8200 -103.3800 346.0600 119.1800 0.0000 0.0000 0.0000 0.0000; + 7175 7389 0.00056 0.00684 0.45463 2020 0 0 0 0 1 0 0 558.6100 -220.4600 -556.7500 194.8900 0.0000 0.0000 0.0000 0.0000; + 7177 7176 0.00105 0.0449 0 439 0 0 1 0 1 0 0 -186.5900 -35.5100 186.9800 52.0400 0.0000 0.0000 0.0000 0.0000; + 7177 7176 0.00105 0.0449 0 439 0 0 1 0 1 0 0 -186.5900 -35.5100 186.9800 52.0400 0.0000 0.0000 0.0000 0.0000; + 7177 7176 0.00105 0.0449 0 439 0 0 1 0 1 0 0 -186.5900 -35.5100 186.9800 52.0400 0.0000 0.0000 0.0000 0.0000; + 7176 7200 0.0019 0.01359 0.02477 443 0 0 0 0 1 0 0 86.3300 -28.1900 -86.1700 26.7300 0.0000 0.0000 0.0000 0.0000; + 7176 7409 0.00513 0.03666 0.06684 443 0 0 0 0 1 0 0 -67.1100 17.8800 67.3600 -22.9200 0.0000 0.0000 0.0000 0.0000; + 7319 7177 0.00247 0.01686 0.00287 221 0 0 0 0 1 0 0 -20.0600 -1.5200 20.0700 1.3100 0.0000 0.0000 0.0000 0.0000; + 7319 7177 0.00247 0.01686 0.00287 221 0 0 0 0 1 0 0 -20.0600 -1.5200 20.0700 1.3100 0.0000 0.0000 0.0000 0.0000; + 7295 7178 0.00541 0.02409 0.00353 149 0 0 0 0 1 0 0 43.0200 2.4100 -42.9100 -2.2900 0.0000 0.0000 0.0000 0.0000; + 7178 7404 0.00777 0.01898 0.00249 98 0 0 0 0 1 0 0 16.2500 -9.7300 -16.2200 9.5600 0.0000 0.0000 0.0000 0.0000; + 7179 7244 0.00945 0.04213 0.00618 149 0 0 0 0 1 0 0 -26.5300 2.0900 26.6000 -2.3900 0.0000 0.0000 0.0000 0.0000; + 7179 7257 0.01429 0.0593 0.01006 149 0 0 0 0 1 0 0 -17.7500 6.3000 17.8000 -7.0700 0.0000 0.0000 0.0000 0.0000; + 7179 7336 0.00994 0.04121 0.00699 149 0 0 0 0 1 0 0 -14.0100 -24.9100 14.0900 24.5500 0.0000 0.0000 0.0000 0.0000; + 7216 7180 0.00437 0.01069 0.0014 98 0 0 0 0 1 0 0 -12.8200 -22.5500 12.8500 22.4800 0.0000 0.0000 0.0000 0.0000; + 7180 7298 0.00299 0.02086 0.00341 221 0 0 0 0 1 0 0 60.6900 0.7300 -60.5800 -0.2900 0.0000 0.0000 0.0000 0.0000; + 7180 7298 0.00299 0.02086 0.00341 221 0 0 0 0 1 0 0 60.6900 0.7300 -60.5800 -0.2900 0.0000 0.0000 0.0000 0.0000; + 7388 7180 0.00328 0.02121 0.00405 221 0 0 0 0 1 0 0 -67.8900 31.2700 68.0800 -30.4800 0.0000 0.0000 0.0000 0.0000; + 7388 7180 0.00328 0.02121 0.00405 221 0 0 0 0 1 0 0 -67.8900 31.2700 68.0800 -30.4800 0.0000 0.0000 0.0000 0.0000; + 7180 7399 0.00226 0.01457 0.00278 250 0 0 0 0 1 0 0 -161.0000 -4.8100 161.6000 8.3700 0.0000 0.0000 0.0000 0.0000; + 7180 7399 0.00226 0.01457 0.00278 250 0 0 0 0 1 0 0 -161.0000 -4.8100 161.6000 8.3700 0.0000 0.0000 0.0000 0.0000; + 7242 7181 0.00194 0.01355 0.00221 221 0 0 0 0 1 0 0 76.7400 15.9300 -76.6200 -15.2900 0.0000 0.0000 0.0000 0.0000; + 7385 7181 0.01045 0.02553 0.00334 98 0 0 0 0 1 0 0 12.1600 11.7900 -12.1300 -12.0400 0.0000 0.0000 0.0000 0.0000; + 7182 7237 0.01327 0.07579 0.01139 98 0 0 0 0 1 0 0 -36.2200 7.4100 36.4100 -7.4500 0.0000 0.0000 0.0000 0.0000; + 7183 7417 0.00881 0.02153 0.00282 250 0 0 0 0 1 0 0 -48.6400 141.8700 50.5100 -137.5900 0.0000 0.0000 0.0000 0.0000; + 7185 7184 0.00074 0.0321 0 210 0 0 1 0 1 0 0 -139.1200 -26.4100 139.2600 32.7400 0.0000 0.0000 0.0000 0.0000; + 7185 7184 0.00074 0.0321 0 210 0 0 1 0 1 0 0 -139.1200 -26.4100 139.2600 32.7400 0.0000 0.0000 0.0000 0.0000; + 7185 7184 0.00074 0.0321 0 210 0 0 1 0 1 0 0 -139.1200 -26.4100 139.2600 32.7400 0.0000 0.0000 0.0000 0.0000; + 7347 7184 0.00047 0.00492 0.01676 750 0 0 0 0 1 0 0 267.2300 35.6300 -266.9000 -33.9500 0.0000 0.0000 0.0000 0.0000; + 7347 7184 0.00047 0.00492 0.01676 750 0 0 0 0 1 0 0 267.2300 35.6300 -266.9000 -33.9500 0.0000 0.0000 0.0000 0.0000; + 7347 7184 0.00047 0.00492 0.01676 750 0 0 0 0 1 0 0 267.2300 35.6300 -266.9000 -33.9500 0.0000 0.0000 0.0000 0.0000; + 7383 7185 0.00607 0.04227 0.00691 221 0 0 0 0 1 0 0 -123.2700 -9.8500 124.2100 15.6800 0.0000 0.0000 0.0000 0.0000; + 7383 7185 0.00607 0.04227 0.00691 221 0 0 0 0 1 0 0 -123.2700 -9.8500 124.2100 15.6800 0.0000 0.0000 0.0000 0.0000; + 7187 7186 0.00014 0.00907 0 1600 0 0 1 0 1 0 0 -880.6500 -100.5600 881.7200 170.3400 0.0000 0.0000 0.0000 0.0000; + 7187 7186 0.00014 0.00907 0 1600 0 0 1 0 1 0 0 -880.6500 -100.5600 881.7200 170.3400 0.0000 0.0000 0.0000 0.0000; + 7189 7186 0.00062 0.04222 0 264 0 0 1 0 1 0 0 6.8800 3.5100 -6.8800 -3.4900 0.0000 0.0000 0.0000 0.0000; + 7190 7186 0.00046 0.05343 0 337 0 0 1 0 1 0 0 47.8700 12.1200 -47.8600 -10.9000 0.0000 0.0000 0.0000 0.0000; + 7191 7186 0.00053 0.03094 0 258 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7192 7186 0.0005 0.03659 0 312 0 0 1 0 1 0 0 34.9000 17.1900 -34.9000 -16.6700 0.0000 0.0000 0.0000 0.0000; + 7193 7186 0.00046 0.02713 0 256 0 0 1 0 1 0 0 7.4800 3.8200 -7.4800 -3.8000 0.0000 0.0000 0.0000 0.0000; + 7194 7186 0.0002 0.01508 0 861 0 0 1 0 1 0 0 230.3200 43.0900 -230.2100 -35.2900 0.0000 0.0000 0.0000 0.0000; + 7195 7186 0.00029 0.01748 0 863 0 0 1 0 1 0 0 230.3200 37.1100 -230.1700 -28.1400 0.0000 0.0000 0.0000 0.0000; + 7196 7186 0.00013 0.0094 0 866 0 0 1 0 1 0 0 230.3200 67.1300 -230.2500 -62.0300 0.0000 0.0000 0.0000 0.0000; + 7197 7186 8e-05 0.00604 0 867 0 0 1 0 1 0 0 230.3200 104.2300 -230.2700 -100.6000 0.0000 0.0000 0.0000 0.0000; + 7186 7341 0.00031 0.00639 0.44587 2768 0 0 0 0 1 0 0 194.5700 45.9600 -194.4400 -89.8700 0.0000 0.0000 0.0000 0.0000; + 7346 7186 0.00026 0.00532 0.37115 2768 0 0 0 0 1 0 0 942.2300 131.9100 -940.0100 -125.7400 0.0000 0.0000 0.0000 0.0000; + 7188 7187 0.00025 0.01839 0 600 0 0 1 0 1 0 0 -488.0800 -24.2000 488.6800 68.0400 0.0000 0.0000 0.0000 0.0000; + 7188 7187 0.00025 0.01839 0 600 0 0 1 0 1 0 0 -488.0800 -24.2000 488.6800 68.0400 0.0000 0.0000 0.0000 0.0000; + 7188 7187 0.00027 0.01839 0 600 0 0 1 0 1 0 0 -488.1000 -23.6700 488.7400 67.5100 0.0000 0.0000 0.0000 0.0000; + 7188 7187 0.00027 0.01839 0 600 0 0 1 0 1 0 0 -488.1000 -23.6700 488.7400 67.5100 0.0000 0.0000 0.0000 0.0000; + 7187 7401 0.00192 0.01878 0.03613 647 0 0 0 0 1 0 0 -197.3700 -17.7100 198.1100 21.2000 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 250 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7188 7255 0.00102 0.00714 0.00117 300 0 0 0 0 1 0 0 159.4300 10.3100 -159.1700 -8.6100 0.0000 0.0000 0.0000 0.0000; + 7198 7201 0.00328 0.02241 0.00381 221 0 0 0 0 1 0 0 -57.9600 84.7700 58.2900 -82.9300 0.0000 0.0000 0.0000 0.0000; + 7198 7201 0.00328 0.02241 0.00381 221 0 0 0 0 1 0 0 -57.9600 84.7700 58.2900 -82.9300 0.0000 0.0000 0.0000 0.0000; + 7198 7225 0.01119 0.07798 0.01275 221 0 0 0 0 1 0 0 29.8000 50.7100 -29.4300 -49.4100 0.0000 0.0000 0.0000 0.0000; + 7200 7199 0.0002 0.01412 0 1344 0 0 1 0 1 0 0 -528.0700 -46.7000 528.6100 85.3000 0.0000 0.0000 0.0000 0.0000; + 7199 7331 0.0004 0.00819 0.57112 3146 0 0 0 0 1 0 0 -1009.5300 18.3500 1013.4200 1.3500 0.0000 0.0000 0.0000 0.0000; + 7201 7200 0.0006 0.03834 0 320.4 0 0 1 0 1 0 0 -170.4000 7.1200 170.5700 3.7400 0.0000 0.0000 0.0000 0.0000; + 7201 7200 0.0006 0.03834 0 320.4 0 0 1 0 1 0 0 -170.4000 7.1200 170.5700 3.7400 0.0000 0.0000 0.0000 0.0000; + 7201 7200 0.0006 0.03834 0 320.4 0 0 1 0 1 0 0 -170.4000 7.1200 170.5700 3.7400 0.0000 0.0000 0.0000 0.0000; + 7420 7200 0.00231 0.02255 0.04338 548 0 0 0 0 1 0 0 -102.2900 -10.8600 102.5300 8.7500 0.0000 0.0000 0.0000 0.0000; + 7203 7247 0.00676 0.03864 0.00581 98 0 0 0 0 1 0 0 18.6300 -2.2900 -18.6100 1.8400 0.0000 0.0000 0.0000 0.0000; + 7203 7313 0.018 0.078 0.012 150 0 0 0 0 1 0 0 -29.1800 -5.2500 29.3400 4.7300 0.0000 0.0000 0.0000 0.0000; + 7393 7203 0.03637 0.08891 0.01164 98 0 0 0 0 1 0 0 -3.5300 5.6300 3.5500 -6.7500 0.0000 0.0000 0.0000 0.0000; + 7426 7203 0.03596 0.08792 0.01151 221 0 0 0 0 1 0 0 13.6500 -9.3700 -13.5600 8.4700 0.0000 0.0000 0.0000 0.0000; + 7205 7204 0.00014 0.01015 0 1324 0 0 1 0 1 0 0 -569.6400 -61.7600 570.0700 93.4200 0.0000 0.0000 0.0000 0.0000; + 7207 7204 0.00039 0.02463 0 243 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 7208 7204 0.00013 0.00923 0 1265 0 0 1 0 1 0 0 762.9000 79.0300 -762.1900 -28.8300 0.0000 0.0000 0.0000 0.0000; + 7209 7204 7e-05 0.00639 0 1260 0 0 1 0 1 0 0 762.9000 102.5600 -762.5200 -67.5500 0.0000 0.0000 0.0000 0.0000; + 7210 7204 0.00047 0.02188 0 664 0 0 1 0 1 0 0 178.0100 26.7400 -177.8700 -20.1800 0.0000 0.0000 0.0000 0.0000; + 7211 7204 0.00025 0.01573 0 656 0 0 1 0 1 0 0 178.0100 37.5300 -177.9300 -32.7100 0.0000 0.0000 0.0000 0.0000; + 7212 7204 0.00039 0.02557 0 669 0 0 1 0 1 0 0 178.0100 24.4500 -177.8900 -16.8100 0.0000 0.0000 0.0000 0.0000; + 7263 7204 0.00018 0.00218 0.14491 2020 0 0 0 0 1 0 0 -237.8600 -278.4000 238.0800 265.6700 0.0000 0.0000 0.0000 0.0000; + 7204 7428 0.00115 0.01399 0.92975 2020 0 0 0 0 1 0 0 408.9600 -114.7200 -407.1200 37.1400 0.0000 0.0000 0.0000 0.0000; + 7206 7205 0.00229 0.09203 0 181 0 0 1 0 1 0 0 -81.4100 3.1600 81.5600 2.6700 0.0000 0.0000 0.0000 0.0000; + 7282 7205 0.00079 0.00822 0.02799 750 0 0 0 0 1 0 0 -174.1100 -30.7400 174.3400 30.2600 0.0000 0.0000 0.0000 0.0000; + 7206 7294 0.0068 0.039 0.0058 100 0 0 0 0 1 0 0 58.6400 -18.1100 -58.4000 18.8900 0.0000 0.0000 0.0000 0.0000; + 7213 7273 0.01615 0.03947 0.00517 109.76 0 0 0 0 1 0 0 -38.0400 -43.5100 38.5600 44.2600 0.0000 0.0000 0.0000 0.0000; + 7293 7213 0.0088 0.03851 0.00586 149 0 0 0 0 1 0 0 26.5200 -14.4100 -26.4400 14.1700 0.0000 0.0000 0.0000 0.0000; + 7213 7363 0.00686 0.03916 0.00588 98 0 0 0 0 1 0 0 -4.0300 9.9300 4.0400 -10.4800 0.0000 0.0000 0.0000 0.0000; + 7214 7257 0.00967 0.04229 0.00644 149 0 0 0 0 1 0 0 -34.3500 6.6600 34.4700 -6.7600 0.0000 0.0000 0.0000 0.0000; + 7214 7297 0.00755 0.03365 0.00493 149 0 0 0 0 1 0 0 38.7400 -2.0900 -38.6200 2.1300 0.0000 0.0000 0.0000 0.0000; + 7345 7214 0.00276 0.01888 0.00321 221 0 0 0 0 1 0 0 44.2000 14.2700 -44.1400 -14.1700 0.0000 0.0000 0.0000 0.0000; + 7345 7214 0.00276 0.01888 0.00321 221 0 0 0 0 1 0 0 44.2000 14.2700 -44.1400 -14.1700 0.0000 0.0000 0.0000 0.0000; + 7411 7215 0.00253 0.01729 0.00294 221 0 0 0 0 1 0 0 -21.2900 24.1000 21.3200 -24.2100 0.0000 0.0000 0.0000 0.0000; + 7215 7431 0.00465 0.02075 0.00304 149 0 0 0 0 1 0 0 -71.3000 -11.5000 71.5400 12.3000 0.0000 0.0000 0.0000 0.0000; + 7216 7382 0.00725 0.03234 0.00474 149 0 0 0 0 1 0 0 -37.3400 10.2700 37.4500 -10.2400 0.0000 0.0000 0.0000 0.0000; + 7216 7386 0.00794 0.04769 0.00647 98 0 0 0 0 1 0 0 5.8500 -10.7900 -5.8300 10.2200 0.0000 0.0000 0.0000 0.0000; + 7249 7217 0.00192 0.01152 0.00156 98 0 0 0 0 1 0 0 19.8200 -27.3900 -19.8000 27.3700 0.0000 0.0000 0.0000 0.0000; + 7217 7276 0.01308 0.03197 0.00419 150 0 0 0 0 1 0 0 0.1500 -65.3900 0.4100 66.3400 0.0000 0.0000 0.0000 0.0000; + 7421 7218 0.00797 0.03307 0.00561 149 0 0 0 0 1 0 0 60.3200 -4.1600 -60.0200 4.8300 0.0000 0.0000 0.0000 0.0000; + 7218 8009 0.02277 0.05567 0.00729 98 0 0 0 0 1 0 0 11.9100 -18.4600 -11.8100 18.0100 0.0000 0.0000 0.0000 0.0000; + 7230 7219 0.00954 0.04175 0.00636 149 0 0 0 0 1 0 0 -61.8400 28.5400 62.2700 -27.2700 0.0000 0.0000 0.0000 0.0000; + 7219 7237 0.01747 0.07641 0.01164 149 0 0 0 0 1 0 0 48.1000 8.3300 -47.6900 -7.6600 0.0000 0.0000 0.0000 0.0000; + 7413 7219 0.0058 0.03963 0.00674 221 0 0 0 0 1 0 0 56.0000 -8.7000 -55.8200 9.2900 0.0000 0.0000 0.0000 0.0000; + 7413 7219 0.0058 0.03963 0.00674 221 0 0 0 0 1 0 0 56.0000 -8.7000 -55.8200 9.2900 0.0000 0.0000 0.0000 0.0000; + 7221 7220 0.00146 0.00997 0.0017 221 0 0 0 0 1 0 0 52.5200 -17.2400 -52.4700 17.3800 0.0000 0.0000 0.0000 0.0000; + 7221 7220 0.00146 0.00997 0.0017 221 0 0 0 0 1 0 0 52.5200 -17.2400 -52.4700 17.3800 0.0000 0.0000 0.0000 0.0000; + 7220 7396 0.00651 0.04448 0.00757 221 0 0 0 0 1 0 0 -0.2600 8.3200 0.2600 -9.0300 0.0000 0.0000 0.0000 0.0000; + 7221 7296 0.00652 0.02849 0.00434 250 0 0 0 0 1 0 0 106.6100 5.2300 -105.8600 -2.3500 0.0000 0.0000 0.0000 0.0000; + 7222 7338 0.00615 0.01503 0.00197 98 0 0 0 0 1 0 0 11.3400 -7.5700 -11.3300 7.4000 0.0000 0.0000 0.0000 0.0000; + 7222 7362 0.01114 0.04873 0.00742 149 0 0 0 0 1 0 0 63.9600 -7.2400 -63.4900 8.5600 0.0000 0.0000 0.0000 0.0000; + 7292 7223 0.002 0.01393 0.00228 221 0 0 0 0 1 0 0 129.3100 19.6700 -128.9700 -17.5200 0.0000 0.0000 0.0000 0.0000; + 7292 7223 0.002 0.01393 0.00228 221 0 0 0 0 1 0 0 129.3100 19.6700 -128.9700 -17.5200 0.0000 0.0000 0.0000 0.0000; + 7223 7404 0.0068 0.02978 0.00454 221 0 0 0 0 1 0 0 103.4400 10.7900 -102.7000 -7.9900 0.0000 0.0000 0.0000 0.0000; + 7223 7425 0.00566 0.03229 0.00485 221 0 0 0 0 1 0 0 104.8700 10.1900 -104.2300 -7.0600 0.0000 0.0000 0.0000 0.0000; + 7224 7248 0.00705 0.04027 0.00605 98 0 0 0 0 1 0 0 29.8600 4.6300 -29.7900 -4.8400 0.0000 0.0000 0.0000 0.0000; + 7384 7224 0.00429 0.01049 0.00137 98 0 0 0 0 1 0 0 24.2800 -28.6400 -24.2100 28.6500 0.0000 0.0000 0.0000 0.0000; + 7224 7417 0.00479 0.02874 0.0039 98 0 0 0 0 1 0 0 -36.4200 -42.0000 36.5700 42.5100 0.0000 0.0000 0.0000 0.0000; + 7246 7225 0.00662 0.02747 0.00466 149 0 0 0 0 1 0 0 -21.0900 -14.5700 21.1300 14.3100 0.0000 0.0000 0.0000 0.0000; + 7225 7395 0.00809 0.04618 0.00694 98 0 0 0 0 1 0 0 -43.5200 -8.6900 43.6900 8.9300 0.0000 0.0000 0.0000 0.0000; + 7226 7240 0.00701 0.03067 0.00467 149 0 0 0 0 1 0 0 36.7500 -17.8700 -36.6300 17.9100 0.0000 0.0000 0.0000 0.0000; + 7226 7250 0.00636 0.03633 0.00546 98 0 0 0 0 1 0 0 -22.3300 -2.8200 22.3600 2.4500 0.0000 0.0000 0.0000 0.0000; + 7226 7272 0.00504 0.02244 0.00329 149 0 0 0 0 1 0 0 -66.7300 40.0400 67.0400 -39.0000 0.0000 0.0000 0.0000 0.0000; + 7226 7338 0.01145 0.02798 0.00366 98 0 0 0 0 1 0 0 -28.7400 36.8800 29.0000 -36.6200 0.0000 0.0000 0.0000 0.0000; + 7228 7227 0.00016 0.01098 0 1259 0 0 1 0 1 0 0 -651.5800 -118.9900 652.2600 166.1300 0.0000 0.0000 0.0000 0.0000; + 7227 7422 0.00048 0.00974 0.67927 2768 0 0 0 0 1 0 0 -449.4400 -138.6300 450.4000 85.6700 0.0000 0.0000 0.0000 0.0000; + 7229 7228 0.00043 0.01801 0 467 0 0 1 0 1 0 0 -234.8100 -24.5800 235.0400 34.5200 0.0000 0.0000 0.0000 0.0000; + 7229 7228 0.00043 0.01801 0 467 0 0 1 0 1 0 0 -234.8100 -24.5800 235.0400 34.5200 0.0000 0.0000 0.0000 0.0000; + 7229 7228 0.00043 0.01801 0 467 0 0 1 0 1 0 0 -234.8100 -24.5800 235.0400 34.5200 0.0000 0.0000 0.0000 0.0000; + 7409 7228 0.0016 0.01143 0.02083 443 0 0 0 0 1 0 0 62.5400 -37.2100 -62.4500 35.6700 0.0000 0.0000 0.0000 0.0000; + 7397 7230 0.01033 0.04606 0.00675 149 0 0 0 0 1 0 0 -54.0700 31.7000 54.4700 -30.6300 0.0000 0.0000 0.0000 0.0000; + 7265 7231 0.00327 0.02233 0.0038 221 0 0 0 0 1 0 0 132.1300 11.6000 -131.5600 -8.0800 0.0000 0.0000 0.0000 0.0000; + 7265 7231 0.00327 0.02233 0.0038 221 0 0 0 0 1 0 0 132.1300 11.6000 -131.5600 -8.0800 0.0000 0.0000 0.0000 0.0000; + 7265 7231 0.00327 0.02233 0.0038 221 0 0 0 0 1 0 0 132.1300 11.6000 -131.5600 -8.0800 0.0000 0.0000 0.0000 0.0000; + 7265 7231 0.00327 0.02233 0.0038 221 0 0 0 0 1 0 0 132.1300 11.6000 -131.5600 -8.0800 0.0000 0.0000 0.0000 0.0000; + 7231 7403 0.00187 0.01275 0.00217 221 0 0 0 0 1 0 0 102.3800 -18.0000 -102.1800 19.1700 0.0000 0.0000 0.0000 0.0000; + 7231 7403 0.00187 0.01275 0.00217 221 0 0 0 0 1 0 0 102.3800 -18.0000 -102.1800 19.1700 0.0000 0.0000 0.0000 0.0000; + 7273 7232 0.00198 0.01376 0.00225 221 0 0 0 0 1 0 0 -88.1000 65.4700 88.3200 -64.1400 0.0000 0.0000 0.0000 0.0000; + 7233 7251 0.01464 0.0358 0.00469 98 0 0 0 0 1 0 0 -19.2600 -11.3800 19.3300 11.1000 0.0000 0.0000 0.0000 0.0000; + 7251 7235 0.01132 0.04952 0.00754 149 0 0 0 0 1 0 0 -26.4400 -59.8800 26.9200 61.2100 0.0000 0.0000 0.0000 0.0000; + 7235 7315 0.00551 0.03841 0.00628 221 0 0 0 0 1 0 0 -89.2700 65.1600 89.9000 -61.3800 0.0000 0.0000 0.0000 0.0000; + 7235 7315 0.00551 0.03841 0.00628 221 0 0 0 0 1 0 0 -89.2700 65.1600 89.9000 -61.3800 0.0000 0.0000 0.0000 0.0000; + 7236 7245 0.00642 0.02662 0.00452 221 0 0 0 0 1 0 0 33.2100 111.3200 -32.3900 -108.3900 0.0000 0.0000 0.0000 0.0000; + 7236 7292 0.01113 0.04618 0.00784 221 0 0 0 0 1 0 0 -94.9600 87.8300 96.7300 -81.3200 0.0000 0.0000 0.0000 0.0000; + 7236 7411 0.01497 0.06208 0.01054 149 0 0 0 0 1 0 0 23.4900 52.2200 -23.0100 -51.3400 0.0000 0.0000 0.0000 0.0000; + 7237 7247 0.03475 0.15202 0.02315 149 0 0 0 0 1 0 0 -46.6800 5.3600 47.4800 -4.1800 0.0000 0.0000 0.0000 0.0000; + 7238 7392 0.0068 0.039 0.005 221 0 0 0 0 1 0 0 -61.9000 41.6400 62.2600 -40.0700 0.0000 0.0000 0.0000 0.0000; + 7294 7239 0.05931 0.14497 0.01898 98 0 0 0 0 1 0 0 31.7800 5.6100 -31.1800 -6.1100 0.0000 0.0000 0.0000 0.0000; + 7239 7392 0.03658 0.08942 0.01171 98 0 0 0 0 1 0 0 -11.2100 -5.9000 11.2700 4.8600 0.0000 0.0000 0.0000 0.0000; + 7241 7362 0.00281 0.01606 0.00241 98 0 0 0 0 1 0 0 -26.1200 9.0200 26.1400 -9.1300 0.0000 0.0000 0.0000 0.0000; + 7242 7295 0.01417 0.03406 0.00462 98 0 0 0 0 1 0 0 3.8400 0.0500 -3.8400 -0.5000 0.0000 0.0000 0.0000 0.0000; + 7242 7319 0.00493 0.03187 0.00608 221 0 0 0 0 1 0 0 -4.9600 2.1700 4.9600 -2.7500 0.0000 0.0000 0.0000 0.0000; + 7242 7319 0.00493 0.03187 0.00608 221 0 0 0 0 1 0 0 -4.9600 2.1700 4.9600 -2.7500 0.0000 0.0000 0.0000 0.0000; + 7260 7243 0.00509 0.03286 0.00627 221 0 0 0 0 1 0 0 113.0500 -8.4000 -112.4000 11.9800 0.0000 0.0000 0.0000 0.0000; + 7260 7243 0.00509 0.03286 0.00627 221 0 0 0 0 1 0 0 113.0500 -8.4000 -112.4000 11.9800 0.0000 0.0000 0.0000 0.0000; + 7244 7272 0.01177 0.05245 0.00769 149 0 0 0 0 1 0 0 22.9600 -5.9000 -22.8900 5.4400 0.0000 0.0000 0.0000 0.0000; + 7246 7251 0.01351 0.07719 0.0116 98 0 0 0 0 1 0 0 26.0200 -23.7000 -25.8500 23.5300 0.0000 0.0000 0.0000 0.0000; + 7246 7410 0.00919 0.06404 0.01047 221 0 0 0 0 1 0 0 -83.7200 -1.1500 84.3900 4.7800 0.0000 0.0000 0.0000 0.0000; + 7246 7410 0.00919 0.06404 0.01047 221 0 0 0 0 1 0 0 -83.7200 -1.1500 84.3900 4.7800 0.0000 0.0000 0.0000 0.0000; + 7425 7246 0.00724 0.01741 0.00236 98 0 0 0 0 1 0 0 37.1200 16.0200 -37.0000 -15.9500 0.0000 0.0000 0.0000 0.0000; + 7339 7247 0.01441 0.05979 0.01015 149 0 0 0 0 1 0 0 38.2800 0.1400 -38.0700 -0.2800 0.0000 0.0000 0.0000 0.0000; + 7362 7248 0.00406 0.01777 0.00271 149 0 0 0 0 1 0 0 39.2300 -3.1300 -39.1600 3.1400 0.0000 0.0000 0.0000 0.0000; + 7248 7386 0.00247 0.01596 0.00304 221 0 0 0 0 1 0 0 -84.9100 -30.9200 85.1200 31.9600 0.0000 0.0000 0.0000 0.0000; + 7248 7386 0.00247 0.01596 0.00304 221 0 0 0 0 1 0 0 -84.9100 -30.9200 85.1200 31.9600 0.0000 0.0000 0.0000 0.0000; + 7249 7255 0.00406 0.02776 0.00472 221 0 0 0 0 1 0 0 -124.6100 -10.4800 125.2600 14.4400 0.0000 0.0000 0.0000 0.0000; + 7249 7255 0.00406 0.02776 0.00472 221 0 0 0 0 1 0 0 -124.6100 -10.4800 125.2600 14.4400 0.0000 0.0000 0.0000 0.0000; + 7249 7344 0.00383 0.02615 0.00445 221 0 0 0 0 1 0 0 90.4300 7.7900 -90.1100 -6.0200 0.0000 0.0000 0.0000 0.0000; + 7249 7344 0.00383 0.02615 0.00445 221 0 0 0 0 1 0 0 90.4300 7.7900 -90.1100 -6.0200 0.0000 0.0000 0.0000 0.0000; + 7249 7382 0.01682 0.04113 0.00539 98 0 0 0 0 1 0 0 -23.2900 12.4200 23.4100 -12.6600 0.0000 0.0000 0.0000 0.0000; + 7250 7276 0.00404 0.0261 0.00498 221 0 0 0 0 1 0 0 94.2500 -62.8500 -93.7300 65.6800 0.0000 0.0000 0.0000 0.0000; + 7250 7276 0.00404 0.0261 0.00498 221 0 0 0 0 1 0 0 94.2500 -62.8500 -93.7300 65.6800 0.0000 0.0000 0.0000 0.0000; + 7253 7252 0.0009 0.03239 0 297 0 0 1 0 1 0 0 -178.8400 -33.5200 179.1400 44.1300 0.0000 0.0000 0.0000 0.0000; + 7312 7252 0.00133 0.01297 0.02495 647 0 0 0 0 1 0 0 107.7800 30.1700 -107.6200 -31.2100 0.0000 0.0000 0.0000 0.0000; + 7327 7252 0.00593 0.04235 0.07721 443 0 0 0 0 1 0 0 21.2700 0.3500 -21.2500 -8.2000 0.0000 0.0000 0.0000 0.0000; + 7347 7252 0.00363 0.03547 0.06824 548 0 0 0 0 1 0 0 106.2400 -6.0900 -105.8500 2.8200 0.0000 0.0000 0.0000 0.0000; + 7313 7253 0.01056 0.04704 0.0069 149 0 0 0 0 1 0 0 13.2500 -1.0600 -13.2300 0.4500 0.0000 0.0000 0.0000 0.0000; + 7253 7412 0.00665 0.04295 0.00819 221 0 0 0 0 1 0 0 50.5700 3.6500 -50.4000 -3.3800 0.0000 0.0000 0.0000 0.0000; + 7253 7412 0.00665 0.04295 0.00819 221 0 0 0 0 1 0 0 50.5700 3.6500 -50.4000 -3.3800 0.0000 0.0000 0.0000 0.0000; + 7255 7258 0.00242 0.01655 0.00282 221 0 0 0 0 1 0 0 116.5000 11.9600 -116.1700 -9.9700 0.0000 0.0000 0.0000 0.0000; + 7255 7258 0.00242 0.01655 0.00282 221 0 0 0 0 1 0 0 116.5000 11.9600 -116.1700 -9.9700 0.0000 0.0000 0.0000 0.0000; + 7255 7399 0.00104 0.00673 0.00128 250 0 0 0 0 1 0 0 173.2300 -2.2600 -172.9100 4.1600 0.0000 0.0000 0.0000 0.0000; + 7255 7399 0.00104 0.00673 0.00128 250 0 0 0 0 1 0 0 173.2300 -2.2600 -172.9100 4.1600 0.0000 0.0000 0.0000 0.0000; + 7255 7399 0.00104 0.00673 0.00128 250 0 0 0 0 1 0 0 173.2300 -2.2600 -172.9100 4.1600 0.0000 0.0000 0.0000 0.0000; + 7255 7399 0.00104 0.00673 0.00128 250 0 0 0 0 1 0 0 173.2300 -2.2600 -172.9100 4.1600 0.0000 0.0000 0.0000 0.0000; + 7256 7297 0.00926 0.02263 0.00296 98 0 0 0 0 1 0 0 34.2600 14.8300 -34.1300 -14.8000 0.0000 0.0000 0.0000 0.0000; + 7257 7317 0.00452 0.03088 0.00525 221 0 0 0 0 1 0 0 -65.9100 -8.4500 66.1100 9.3300 0.0000 0.0000 0.0000 0.0000; + 7257 7317 0.00452 0.03088 0.00525 221 0 0 0 0 1 0 0 -65.9100 -8.4500 66.1100 9.3300 0.0000 0.0000 0.0000 0.0000; + 7259 7403 0.00479 0.03335 0.00545 221 0 0 0 0 1 0 0 -110.3900 30.5200 111.0100 -26.7100 0.0000 0.0000 0.0000 0.0000; + 7259 7403 0.00479 0.03335 0.00545 221 0 0 0 0 1 0 0 -110.3900 30.5200 111.0100 -26.7100 0.0000 0.0000 0.0000 0.0000; + 7368 7260 0.00263 0.01833 0.003 221 0 0 0 0 1 0 0 117.2700 8.3800 -116.9100 -6.1700 0.0000 0.0000 0.0000 0.0000; + 7368 7260 0.00263 0.01833 0.003 221 0 0 0 0 1 0 0 117.2700 8.3800 -116.9100 -6.1700 0.0000 0.0000 0.0000 0.0000; + 7368 7260 0.00263 0.01833 0.003 221 0 0 0 0 1 0 0 117.2700 8.3800 -116.9100 -6.1700 0.0000 0.0000 0.0000 0.0000; + 7262 7261 0.00059 0.02478 0 305 0 0 1 0 1 0 0 -153.6200 41.0200 153.7600 -35.1000 0.0000 0.0000 0.0000 0.0000; + 7261 7429 0.0045 0.04398 0.08462 548 0 0 0 0 1 0 0 85.1000 -30.8400 -84.7600 25.3000 0.0000 0.0000 0.0000 0.0000; + 7262 7302 0.01427 0.06362 0.00933 149 0 0 0 0 1 0 0 81.5900 13.6600 -80.6700 -10.5100 0.0000 0.0000 0.0000 0.0000; + 7264 7263 0.00013 0.00819 0 1362 0 0 1 0 1 0 0 -669.7100 -64.0300 670.2700 99.6100 0.0000 0.0000 0.0000 0.0000; + 7264 7263 0.00013 0.00819 0 1362 0 0 1 0 1 0 0 -669.7100 -64.0300 670.2700 99.6100 0.0000 0.0000 0.0000 0.0000; + 7266 7263 0.00013 0.00771 0 983 0 0 1 0 1 0 0 303.7600 -33.8100 -303.6500 40.6600 0.0000 0.0000 0.0000 0.0000; + 7267 7263 0.00069 0.04478 0 443 0 0 1 0 1 0 0 90.3900 -10.0600 -90.3400 13.6000 0.0000 0.0000 0.0000 0.0000; + 7268 7263 0.0002 0.01399 0 438 0 0 1 0 1 0 0 90.3900 -10.0600 -90.3800 11.1600 0.0000 0.0000 0.0000 0.0000; + 7269 7263 0.00038 0.04031 0 440 0 0 1 0 1 0 0 90.3900 -10.0600 -90.3600 13.2400 0.0000 0.0000 0.0000 0.0000; + 7270 7263 0.00019 0.01203 0 701 0 0 1 0 1 0 0 180.7800 -20.1200 -180.7200 23.9000 0.0000 0.0000 0.0000 0.0000; + 7265 7264 0.00053 0.0323 0 461 0 0 1 0 1 0 0 -295.7100 -32.1100 296.1800 60.4400 0.0000 0.0000 0.0000 0.0000; + 7265 7264 0.00053 0.0323 0 461 0 0 1 0 1 0 0 -295.7100 -32.1100 296.1800 60.4400 0.0000 0.0000 0.0000 0.0000; + 7264 7332 0.00258 0.01841 0.03356 523 0 0 0 0 1 0 0 194.2200 4.9000 -193.2900 -1.7100 0.0000 0.0000 0.0000 0.0000; + 7315 7271 0.01055 0.04377 0.00743 149 0 0 0 0 1 0 0 32.0800 29.5300 -31.8800 -29.4500 0.0000 0.0000 0.0000 0.0000; + 7271 7340 0.01045 0.04336 0.00736 149 0 0 0 0 1 0 0 3.4300 21.3900 -3.3800 -21.9000 0.0000 0.0000 0.0000 0.0000; + 7316 7272 0.00354 0.02023 0.00304 98 0 0 0 0 1 0 0 -16.3800 -18.8100 16.4000 18.6400 0.0000 0.0000 0.0000 0.0000; + 7273 7405 0.01205 0.06881 0.01034 98 0 0 0 0 1 0 0 -18.4000 25.0100 18.5100 -25.4500 0.0000 0.0000 0.0000 0.0000; + 7275 7274 0.00248 0.12538 0 143 0 0 1 0 1 0 0 -25.2000 -0.8000 25.2200 1.5800 0.0000 0.0000 0.0000 0.0000; + 7276 7395 0.00344 0.02064 0.0028 221 0 0 0 0 1 0 0 35.0700 83.0500 -34.8000 -81.6900 0.0000 0.0000 0.0000 0.0000; + 7277 7337 0.02832 0.06923 0.00906 98 0 0 0 0 1 0 0 34.5100 15.3200 -34.1200 -15.3300 0.0000 0.0000 0.0000 0.0000; + 7279 7278 0.00131 0.07995 0 172 0 0 1 0 1 0 0 -72.4000 -1.2200 72.4700 5.3200 0.0000 0.0000 0.0000 0.0000; + 7280 7278 0.00175 0.10484 0 87 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7281 7278 0.00169 0.12869 0 91 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7367 7278 0.00241 0.0172 0.03135 443 0 0 0 0 1 0 0 0.8400 5.8300 -0.8400 -9.0500 0.0000 0.0000 0.0000 0.0000; + 7392 7279 0.00555 0.02431 0.0037 221 0 0 0 0 1 0 0 -125.5600 20.4700 126.4400 -16.9800 0.0000 0.0000 0.0000 0.0000; + 7283 7282 0.00254 0.07063 0 145 0 0 1 0 1 0 0 -112.9200 -21.2600 113.2600 30.5700 0.0000 0.0000 0.0000 0.0000; + 7284 7282 0.00703 0.26257 0 70 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7285 7282 0.00137 0.08957 0 93 0 0 1 0 1 0 0 21.2200 0.0000 -21.2100 0.3900 0.0000 0.0000 0.0000 0.0000; + 7286 7282 0.00545 0.20611 0 93 0 0 1 0 1 0 0 21.2200 0.0000 -21.2000 0.8900 0.0000 0.0000 0.0000 0.0000; + 7287 7282 0.00328 0.17841 0 91 0 0 1 0 1 0 0 21.2200 -0.0000 -21.2100 0.7700 0.0000 0.0000 0.0000 0.0000; + 7288 7282 0.00467 0.19001 0 93 0 0 1 0 1 0 0 21.2200 0.0000 -21.2000 0.8200 0.0000 0.0000 0.0000 0.0000; + 7289 7282 0.00155 0.07083 0 124 0 0 1 0 1 0 0 42.4500 -0.0000 -42.4200 1.2200 0.0000 0.0000 0.0000 0.0000; + 7282 7332 0.00276 0.01973 0.03596 443 0 0 0 0 1 0 0 124.2500 17.6600 -123.8300 -18.4000 0.0000 0.0000 0.0000 0.0000; + 7282 7367 0.00169 0.01205 0.02197 523 0 0 0 0 1 0 0 231.4000 15.1500 -230.5300 -11.2200 0.0000 0.0000 0.0000 0.0000; + 7411 7290 0.00285 0.01709 0.00232 98 0 0 0 0 1 0 0 15.4200 39.3900 -15.3700 -39.3100 0.0000 0.0000 0.0000 0.0000; + 7291 7295 0.00838 0.03474 0.0059 149 0 0 0 0 1 0 0 -54.3300 -20.5800 54.6200 21.2400 0.0000 0.0000 0.0000 0.0000; + 7424 7293 0.0065 0.02894 0.00424 149 0 0 0 0 1 0 0 42.5900 -9.7800 -42.4600 9.9000 0.0000 0.0000 0.0000 0.0000; + 7294 7405 0.0229 0.13751 0.01866 98 0 0 0 0 1 0 0 19.3700 5.1100 -19.2800 -6.5200 0.0000 0.0000 0.0000 0.0000; + 7296 7427 0.0045 0.011 0.00144 102.9 0 0 0 0 1 0 0 12.0200 -24.2400 -11.9800 24.1800 0.0000 0.0000 0.0000 0.0000; + 7316 7297 0.00394 0.01758 0.00258 149 0 0 0 0 1 0 0 72.4200 -6.7700 -72.2100 7.4600 0.0000 0.0000 0.0000 0.0000; + 7297 7384 0.00423 0.0185 0.00282 149 0 0 0 0 1 0 0 51.1900 -21.3600 -51.0500 21.6700 0.0000 0.0000 0.0000 0.0000; + 7298 7362 0.01319 0.03222 0.00422 98 0 0 0 0 1 0 0 -5.0100 9.8900 5.0300 -10.2600 0.0000 0.0000 0.0000 0.0000; + 7298 7395 0.00338 0.0148 0.00225 149 0 0 0 0 1 0 0 5.6500 -36.5800 -5.6000 36.5600 0.0000 0.0000 0.0000 0.0000; + 7364 7299 0.01228 0.07011 0.01053 98 0 0 0 0 1 0 0 -33.7100 -0.5100 33.8600 0.3000 0.0000 0.0000 0.0000 0.0000; + 7413 7299 0.01459 0.065 0.00953 149 0 0 0 0 1 0 0 52.6600 6.3900 -52.2500 -5.5100 0.0000 0.0000 0.0000 0.0000; + 7301 7318 0.01182 0.05168 0.00787 149 0 0 0 0 1 0 0 43.2300 -5.0400 -43.0000 5.2700 0.0000 0.0000 0.0000 0.0000; + 7302 7426 0.02525 0.06173 0.00808 221 0 0 0 0 1 0 0 56.2400 3.5800 -55.4500 -2.4700 0.0000 0.0000 0.0000 0.0000; + 7303 7393 0.07296 0.17836 0.02335 98 0 0 0 0 1 0 0 3.8300 5.4300 -3.7800 -7.7100 0.0000 0.0000 0.0000 0.0000; + 7305 7304 0.00017 0.01241 0 1160 0 0 1 0 1 0 0 -595.7600 4.3900 596.3500 37.9800 0.0000 0.0000 0.0000 0.0000; + 7307 7304 0.00035 0.02169 0 473 0 0 1 0 1 0 0 96.4100 49.2100 -96.3800 -46.8300 0.0000 0.0000 0.0000 0.0000; + 7308 7304 0.00021 0.02062 0 459 0 0 1 0 1 0 0 96.4100 49.2100 -96.3900 -46.9400 0.0000 0.0000 0.0000 0.0000; + 7309 7304 0.00056 0.04001 0 454 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 7310 7304 0.00063 0.03797 0 464 0 0 1 0 1 0 0 96.4200 47.4300 -96.3500 -43.3800 0.0000 0.0000 0.0000 0.0000; + 7311 7304 0.00019 0.01172 0 729 0 0 1 0 1 0 0 192.8400 98.4200 -192.7600 -93.2800 0.0000 0.0000 0.0000 0.0000; + 7341 7304 0.00071 0.00864 0.57375 2020 0 0 0 0 1 0 0 -556.9700 -15.2600 559.0900 -18.7000 0.0000 0.0000 0.0000 0.0000; + 7306 7305 0.00078 0.04744 0 305 0 0 1 0 1 0 0 -170.9100 -13.7800 171.1300 27.4800 0.0000 0.0000 0.0000 0.0000; + 7305 7327 0.0022 0.01568 0.02859 443 0 0 0 0 1 0 0 61.4100 -25.8600 -61.3200 23.5400 0.0000 0.0000 0.0000 0.0000; + 7306 7413 0.00627 0.04371 0.00714 221 0 0 0 0 1 0 0 81.6100 5.8000 -81.2000 -3.6400 0.0000 0.0000 0.0000 0.0000; + 7306 7413 0.00627 0.04371 0.00714 221 0 0 0 0 1 0 0 81.6100 5.8000 -81.2000 -3.6400 0.0000 0.0000 0.0000 0.0000; + 7313 7312 0.00097 0.06614 0 168 0 0 1 0 1 0 0 -98.5200 -23.2700 98.6100 29.9600 0.0000 0.0000 0.0000 0.0000; + 7312 7321 0.00143 0.014 0.02693 548 0 0 0 0 1 0 0 -59.2200 -22.0800 59.2800 19.7600 0.0000 0.0000 0.0000 0.0000; + 7312 7429 0.00088 0.00862 0.01659 548 0 0 0 0 1 0 0 -147.1700 -38.0500 147.3700 38.2000 0.0000 0.0000 0.0000 0.0000; + 7313 7430 0.00541 0.0309 0.00464 98 0 0 0 0 1 0 0 -30.2800 -4.8300 30.3300 4.6500 0.0000 0.0000 0.0000 0.0000; + 7340 7314 0.01916 0.07949 0.01349 149 0 0 0 0 1 0 0 -5.5800 -0.3100 5.5800 -0.9800 0.0000 0.0000 0.0000 0.0000; + 7316 7383 0.01217 0.07861 0.015 221 0 0 0 0 1 0 0 -79.6800 5.9400 80.4800 -2.2800 0.0000 0.0000 0.0000 0.0000; + 7316 7383 0.01217 0.07861 0.015 221 0 0 0 0 1 0 0 -79.6800 5.9400 80.4800 -2.2800 0.0000 0.0000 0.0000 0.0000; + 7317 7424 0.00457 0.02949 0.00563 221 0 0 0 0 1 0 0 -79.2600 -14.8200 79.5600 16.1900 0.0000 0.0000 0.0000 0.0000; + 7317 7424 0.00457 0.02949 0.00563 221 0 0 0 0 1 0 0 -79.2600 -14.8200 79.5600 16.1900 0.0000 0.0000 0.0000 0.0000; + 7317 7424 0.00457 0.02949 0.00563 221 0 0 0 0 1 0 0 -79.2600 -14.8200 79.5600 16.1900 0.0000 0.0000 0.0000 0.0000; + 7317 7424 0.00457 0.02949 0.00563 221 0 0 0 0 1 0 0 -79.2600 -14.8200 79.5600 16.1900 0.0000 0.0000 0.0000 0.0000; + 7318 7382 0.00912 0.04063 0.00596 149 0 0 0 0 1 0 0 11.6400 -11.7000 -11.6100 11.2300 0.0000 0.0000 0.0000 0.0000; + 7321 7320 0.00023 0.01682 0 1000 0 0 1 0 1 0 0 -142.9800 -36.9300 143.0300 40.4000 0.0000 0.0000 0.0000 0.0000; + 7323 7320 0.00036 0.02134 0 584 0 0 1 0 1 0 0 37.8300 -13.8200 -37.8200 14.1500 0.0000 0.0000 0.0000 0.0000; + 7324 7320 0.00032 0.02884 0 577 0 0 1 0 1 0 0 37.8300 -13.8200 -37.8200 14.2600 0.0000 0.0000 0.0000 0.0000; + 7325 7320 0.0003 0.02899 0 581 0 0 1 0 1 0 0 37.8300 -13.8200 -37.8200 14.2600 0.0000 0.0000 0.0000 0.0000; + 7326 7320 0.00017 0.01413 0 568 0 0 1 0 1 0 0 37.8300 -13.8200 -37.8300 14.0300 0.0000 0.0000 0.0000 0.0000; + 7320 7422 0.00066 0.00806 0.53536 2020 0 0 0 0 1 0 0 8.2700 -97.1000 -8.2400 39.8500 0.0000 0.0000 0.0000 0.0000; + 7322 7321 0.00198 0.07214 0 128.4 0 0 1 0 1 0 0 -83.5700 -12.1800 83.7000 17.1600 0.0000 0.0000 0.0000 0.0000; + 7322 7380 0.00578 0.02527 0.00385 149 0 0 0 0 1 0 0 83.5700 12.1800 -83.1700 -10.8300 0.0000 0.0000 0.0000 0.0000; + 7328 7327 0.00161 0.04271 0 172 0 0 1 0 1 0 0 -70.9200 -11.0900 71.0000 13.2200 0.0000 0.0000 0.0000 0.0000; + 7329 7327 0.00104 0.04807 0 190 0 0 1 0 1 0 0 30.9700 38.1900 -30.9500 -37.1100 0.0000 0.0000 0.0000 0.0000; + 7328 7339 0.01199 0.05341 0.00783 149 0 0 0 0 1 0 0 70.9200 11.0900 -70.3200 -9.2100 0.0000 0.0000 0.0000 0.0000; + 7362 7330 0.00719 0.01758 0.0023 98 0 0 0 0 1 0 0 -62.9200 -1.9200 63.2100 2.4000 0.0000 0.0000 0.0000 0.0000; + 7332 7331 0.00024 0.01699 0 1122 0 0 1 0 1 0 0 -307.5800 -60.4400 307.8100 76.6400 0.0000 0.0000 0.0000 0.0000; + 7334 7331 0.00083 0.0414 0 244 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 7335 7331 0.00017 0.0093 0 1106 0 0 1 0 1 0 0 137.8300 140.2900 -137.7700 -136.9700 0.0000 0.0000 0.0000 0.0000; + 7400 7331 8e-05 0.00168 0.11713 2768 0 0 0 0 1 0 0 837.7600 -60.0400 -837.2300 58.9100 0.0000 0.0000 0.0000 0.0000; + 7333 7332 0.00093 0.03886 0 421.2 0 0 1 0 1 0 0 -255.1700 -21.0700 255.7800 46.5500 0.0000 0.0000 0.0000 0.0000; + 7333 7332 0.00093 0.03886 0 421.2 0 0 1 0 1 0 0 -255.1700 -21.0700 255.7800 46.5500 0.0000 0.0000 0.0000 0.0000; + 7333 7332 0.00093 0.03886 0 421.2 0 0 1 0 1 0 0 -255.1700 -21.0700 255.7800 46.5500 0.0000 0.0000 0.0000 0.0000; + 7401 7332 0.00104 0.01017 0.01957 548 0 0 0 0 1 0 0 95.7200 16.4500 -95.6300 -17.5400 0.0000 0.0000 0.0000 0.0000; + 7336 7418 0.00361 0.02463 0.00419 221 0 0 0 0 1 0 0 75.0600 -20.0800 -74.8400 21.1400 0.0000 0.0000 0.0000 0.0000; + 7336 7418 0.00361 0.02463 0.00419 221 0 0 0 0 1 0 0 75.0600 -20.0800 -74.8400 21.1400 0.0000 0.0000 0.0000 0.0000; + 7345 7338 0.0023 0.01602 0.00262 221 0 0 0 0 1 0 0 63.5300 1.2600 -63.4300 -0.8600 0.0000 0.0000 0.0000 0.0000; + 7345 7338 0.0023 0.01602 0.00262 221 0 0 0 0 1 0 0 63.5300 1.2600 -63.4300 -0.8600 0.0000 0.0000 0.0000 0.0000; + 7342 7341 0.00017 0.01252 0 1311 0 0 1 0 1 0 0 -750.4700 -35.7100 751.4100 105.1300 0.0000 0.0000 0.0000 0.0000; + 7343 7342 0.00185 0.0832 0 190 0 0 1 0 1 0 0 -109.5700 -23.9400 109.8100 34.7800 0.0000 0.0000 0.0000 0.0000; + 7343 7342 0.00185 0.0832 0 190 0 0 1 0 1 0 0 -109.5700 -23.9400 109.8100 34.7800 0.0000 0.0000 0.0000 0.0000; + 7342 7409 0.00056 0.00583 0.01986 750 0 0 0 0 1 0 0 192.1300 2.6300 -191.9200 -2.5300 0.0000 0.0000 0.0000 0.0000; + 7342 7409 0.00056 0.00583 0.01986 750 0 0 0 0 1 0 0 192.1300 2.6300 -191.9200 -2.5300 0.0000 0.0000 0.0000 0.0000; + 7344 7404 0.00903 0.03745 0.00635 149 0 0 0 0 1 0 0 17.7700 -10.6800 -17.7300 10.2300 0.0000 0.0000 0.0000 0.0000; + 7345 7382 0.00439 0.02833 0.00541 221 0 0 0 0 1 0 0 63.8700 5.8900 -63.6900 -5.2400 0.0000 0.0000 0.0000 0.0000; + 7345 7382 0.00439 0.02833 0.00541 221 0 0 0 0 1 0 0 63.8700 5.8900 -63.6900 -5.2400 0.0000 0.0000 0.0000 0.0000; + 7347 7346 0.00014 0.00986 0 1271 0 0 1 0 1 0 0 -699.2100 -86.4500 699.8800 133.3700 0.0000 0.0000 0.0000 0.0000; + 7347 7346 0.00014 0.00986 0 1271 0 0 1 0 1 0 0 -699.2100 -86.4500 699.8800 133.3700 0.0000 0.0000 0.0000 0.0000; + 7349 7346 8e-05 0.00563 0 1019 0 0 1 0 1 0 0 312.9700 130.1700 -312.8800 -124.1900 0.0000 0.0000 0.0000 0.0000; + 7350 7346 0.00022 0.01346 0 1021 0 0 1 0 1 0 0 312.9700 56.2400 -312.7600 -43.6500 0.0000 0.0000 0.0000 0.0000; + 7351 7346 0.00031 0.01784 0 1018 0 0 1 0 1 0 0 312.9700 44.3400 -312.6800 -27.8600 0.0000 0.0000 0.0000 0.0000; + 7352 7346 0.00034 0.01655 0 1025 0 0 1 0 1 0 0 312.9700 46.0100 -312.6500 -30.7000 0.0000 0.0000 0.0000 0.0000; + 7353 7346 0.00019 0.01203 0 1225 0 0 1 0 1 0 0 594.8700 72.1800 -594.2400 -32.2400 0.0000 0.0000 0.0000 0.0000; + 7354 7346 6e-05 0.00671 0 1222 0 0 1 0 1 0 0 591.1000 116.4200 -590.9000 -93.9000 0.0000 0.0000 0.0000 0.0000; + 7355 7346 6e-05 0.00677 0 1218 0 0 1 0 1 0 0 591.1000 115.5800 -590.9000 -92.8700 0.0000 0.0000 0.0000 0.0000; + 7356 7346 0.00012 0.00609 0 1219 0 0 1 0 1 0 0 591.0500 120.2900 -590.6500 -99.8000 0.0000 0.0000 0.0000 0.0000; + 7357 7346 0.00066 0.04067 0 287 0 0 1 0 1 0 0 16.2600 8.3000 -16.2500 -8.1700 0.0000 0.0000 0.0000 0.0000; + 7358 7346 0.0003 0.02129 0 835 0 0 1 0 1 0 0 224.5800 36.7400 -224.4400 -26.5500 0.0000 0.0000 0.0000 0.0000; + 7359 7346 0.00013 0.00906 0 846 0 0 1 0 1 0 0 224.5800 80.9600 -224.5100 -76.1900 0.0000 0.0000 0.0000 0.0000; + 7360 7346 0.00021 0.01514 0 845 0 0 1 0 1 0 0 224.5800 49.5400 -224.4800 -42.1300 0.0000 0.0000 0.0000 0.0000; + 7361 7346 0.00026 0.02464 0 471 0 0 1 0 1 0 0 102.4200 30.2900 -102.3900 -27.7000 0.0000 0.0000 0.0000 0.0000; + 7348 7347 0.00062 0.02698 0 407 0 0 1 0 1 0 0 -244.8800 -20.1500 245.2500 36.0400 0.0000 0.0000 0.0000 0.0000; + 7348 7347 0.00062 0.02698 0 407 0 0 1 0 1 0 0 -244.8800 -20.1500 245.2500 36.0400 0.0000 0.0000 0.0000 0.0000; + 7380 7363 0.03224 0.13375 0.0227 149 0 0 0 0 1 0 0 30.9300 -3.9700 -30.6200 2.9400 0.0000 0.0000 0.0000 0.0000; + 7365 7381 0.00343 0.01423 0.00241 250 0 0 0 0 1 0 0 91.1100 -33.4300 -90.7900 34.5400 0.0000 0.0000 0.0000 0.0000; + 7367 7366 0.00021 0.01366 0 1249 0 0 1 0 1 0 0 -594.6900 -71.6600 595.4200 119.0700 0.0000 0.0000 0.0000 0.0000; + 7367 7366 0.00021 0.01366 0 1249 0 0 1 0 1 0 0 -594.6900 -71.6600 595.4200 119.0700 0.0000 0.0000 0.0000 0.0000; + 7369 7366 0.00053 0.03243 0 494 0 0 1 0 1 0 0 106.9800 30.1500 -106.9200 -26.4400 0.0000 0.0000 0.0000 0.0000; + 7370 7366 0.00065 0.04118 0 480 0 0 1 0 1 0 0 106.9800 24.2600 -106.9000 -19.6800 0.0000 0.0000 0.0000 0.0000; + 7371 7366 0.00049 0.03404 0 469 0 0 1 0 1 0 0 106.9800 29.0100 -106.9200 -25.1500 0.0000 0.0000 0.0000 0.0000; + 7372 7366 0.00049 0.03162 0 485 0 0 1 0 1 0 0 106.9800 30.9700 -106.9200 -27.3400 0.0000 0.0000 0.0000 0.0000; + 7373 7366 0.0001 0.01184 0 491 0 0 1 0 1 0 0 106.9800 54.6000 -106.9600 -53.0100 0.0000 0.0000 0.0000 0.0000; + 7374 7366 0.0004 0.0255 0 487 0 0 1 0 1 0 0 106.9800 38.0500 -106.9300 -35.0100 0.0000 0.0000 0.0000 0.0000; + 7375 7366 0.00045 0.02708 0 712 0 0 1 0 1 0 0 183.1600 37.3100 -183.0100 -28.5600 0.0000 0.0000 0.0000 0.0000; + 7376 7366 0.00035 0.02498 0 713 0 0 1 0 1 0 0 183.1600 40.5000 -183.0400 -32.3700 0.0000 0.0000 0.0000 0.0000; + 7377 7366 0.00031 0.01898 0 705 0 0 1 0 1 0 0 183.1600 51.5200 -183.0500 -45.1600 0.0000 0.0000 0.0000 0.0000; + 7378 7366 0.00036 0.02384 0 694 0 0 1 0 1 0 0 183.1600 41.9900 -183.0400 -34.2100 0.0000 0.0000 0.0000 0.0000; + 7379 7366 0.00031 0.02202 0 700 0 0 1 0 1 0 0 183.1600 45.2900 -183.0500 -38.0400 0.0000 0.0000 0.0000 0.0000; + 7366 7400 0.00014 0.00168 0.11182 2295 0 0 0 0 1 0 0 683.7000 162.0700 -683.0500 -166.0700 0.0000 0.0000 0.0000 0.0000; + 7368 7367 0.00086 0.03726 0 392 0 0 1 0 1 0 0 -224.2400 -15.5300 224.6700 34.1500 0.0000 0.0000 0.0000 0.0000; + 7368 7367 0.00086 0.03726 0 392 0 0 1 0 1 0 0 -224.2400 -15.5300 224.6700 34.1500 0.0000 0.0000 0.0000 0.0000; + 7368 7367 0.00086 0.03726 0 392 0 0 1 0 1 0 0 -224.2400 -15.5300 224.6700 34.1500 0.0000 0.0000 0.0000 0.0000; + 7385 7404 0.00674 0.03846 0.00578 98 0 0 0 0 1 0 0 19.5700 5.9100 -19.5400 -6.3100 0.0000 0.0000 0.0000 0.0000; + 7390 7389 0.00019 0.01131 0 1278 0 0 1 0 1 0 0 -446.7100 -59.5900 447.0700 81.3200 0.0000 0.0000 0.0000 0.0000; + 8030 7389 0.00054 0.00651 0.43275 2020 0 0 0 0 1 0 0 -648.8500 -20.7100 650.9800 0.0800 0.0000 0.0000 0.0000 0.0000; + 7391 7390 0.00148 0.044 0 190.8 0 0 1 0 1 0 0 -78.0600 -33.0300 78.1600 36.1200 0.0000 0.0000 0.0000 0.0000; + 7396 7410 0.00293 0.01892 0.00361 221 0 0 0 0 1 0 0 -83.7200 -2.8500 83.9300 3.8500 0.0000 0.0000 0.0000 0.0000; + 7396 7410 0.00293 0.01892 0.00361 221 0 0 0 0 1 0 0 -83.7200 -2.8500 83.9300 3.8500 0.0000 0.0000 0.0000 0.0000; + 7396 7410 0.00293 0.01892 0.00361 221 0 0 0 0 1 0 0 -83.7200 -2.8500 83.9300 3.8500 0.0000 0.0000 0.0000 0.0000; + 7403 7398 0.00218 0.01408 0.00269 221 0 0 0 0 1 0 0 50.1300 -12.5000 -50.0800 12.6000 0.0000 0.0000 0.0000 0.0000; + 7403 7398 0.00218 0.01408 0.00269 221 0 0 0 0 1 0 0 50.1300 -12.5000 -50.0800 12.6000 0.0000 0.0000 0.0000 0.0000; + 7399 7417 0.00504 0.03508 0.00573 221 0 0 0 0 1 0 0 53.7100 -29.4500 -53.5200 30.1900 0.0000 0.0000 0.0000 0.0000; + 7399 7417 0.00504 0.03508 0.00573 221 0 0 0 0 1 0 0 53.7100 -29.4500 -53.5200 30.1900 0.0000 0.0000 0.0000 0.0000; + 7401 7400 0.00011 0.00786 0 1297 0 0 1 0 1 0 0 -720.7200 -88.6100 721.2800 128.6200 0.0000 0.0000 0.0000 0.0000; + 7402 7401 0.00049 0.03223 0 423 0 0 1 0 1 0 0 -259.4500 -16.2900 259.7700 37.7200 0.0000 0.0000 0.0000 0.0000; + 7401 7409 0.00483 0.04717 0.09075 548 0 0 0 0 1 0 0 159.2500 6.4800 -158.0600 -4.1900 0.0000 0.0000 0.0000 0.0000; + 7403 7419 0.00504 0.03445 0.00586 221 0 0 0 0 1 0 0 -93.8000 10.1600 94.2500 -7.6700 0.0000 0.0000 0.0000 0.0000; + 7403 7419 0.00504 0.03445 0.00586 221 0 0 0 0 1 0 0 -93.8000 10.1600 94.2500 -7.6700 0.0000 0.0000 0.0000 0.0000; + 7407 7406 0.0002 0.01441 0 1026 0 0 1 0 1 0 0 -136.1400 -10.5300 136.1800 13.1200 0.0000 0.0000 0.0000 0.0000; + 7414 7406 0.00034 0.0041 0.275 2295 0 0 0 0 1 0 0 -1352.6400 182.0500 1358.7000 -137.7200 0.0000 0.0000 0.0000 0.0000; + 7408 7407 0.00118 0.08057 0 143.8 0 0 1 0 1 0 0 -69.2700 -20.7000 69.3300 24.9000 0.0000 0.0000 0.0000 0.0000; + 7410 7409 0.00054 0.03923 0 372.6 0 0 1 0 1 0 0 -212.0800 -27.4100 212.3300 45.6300 0.0000 0.0000 0.0000 0.0000; + 7410 7409 0.00054 0.03923 0 372.6 0 0 1 0 1 0 0 -212.0800 -27.4100 212.3300 45.6300 0.0000 0.0000 0.0000 0.0000; + 7410 7409 0.00054 0.03923 0 372.6 0 0 1 0 1 0 0 -212.0800 -27.4100 212.3300 45.6300 0.0000 0.0000 0.0000 0.0000; + 7409 7420 0.00502 0.04904 0.09435 548 0 0 0 0 1 0 0 122.0900 -16.7800 -121.3400 14.4500 0.0000 0.0000 0.0000 0.0000; + 7415 7414 0.0004 0.04372 0 239 0 0 1 0 1 0 0 -18.6000 -12.4600 18.6000 12.6700 0.0000 0.0000 0.0000 0.0000; + 7416 7415 0.00128 0.09703 0 109 0 0 1 0 1 0 0 -40.2900 -4.8800 40.3100 6.4400 0.0000 0.0000 0.0000 0.0000; + 7417 7418 0.00278 0.01937 0.00317 221 0 0 0 0 1 0 0 -38.9600 3.4800 39.0000 -3.5000 0.0000 0.0000 0.0000 0.0000; + 7417 7418 0.00278 0.01937 0.00317 221 0 0 0 0 1 0 0 -38.9600 3.4800 39.0000 -3.5000 0.0000 0.0000 0.0000 0.0000; + 7421 7420 0.00106 0.06841 0 242.1 0 0 1 0 1 0 0 -119.8500 -15.0100 120.0100 25.1000 0.0000 0.0000 0.0000 0.0000; + 7421 7420 0.00106 0.06841 0 242.1 0 0 1 0 1 0 0 -119.8500 -15.0100 120.0100 25.1000 0.0000 0.0000 0.0000 0.0000; + 7423 7422 0.00014 0.00897 0 1350 0 0 1 0 1 0 0 -573.5100 -186.3400 574.0000 217.6000 0.0000 0.0000 0.0000 0.0000; + 7424 7423 0.00105 0.04353 0 238.56 0 0 1 0 1 0 0 -166.9000 -31.5300 167.2000 44.0000 0.0000 0.0000 0.0000 0.0000; + 7424 7423 0.00105 0.04353 0 238.56 0 0 1 0 1 0 0 -166.9000 -31.5300 167.2000 44.0000 0.0000 0.0000 0.0000 0.0000; + 7424 7423 0.00105 0.04353 0 238.56 0 0 1 0 1 0 0 -166.9000 -31.5300 167.2000 44.0000 0.0000 0.0000 0.0000 0.0000; + 7429 7428 0.00026 0.01258 0 927 0 0 1 0 1 0 0 -139.9900 -86.9300 140.0500 90.1500 0.0000 0.0000 0.0000 0.0000; + 7430 7429 0.00214 0.08887 0 133.8 0 0 1 0 1 0 0 -77.2500 -17.9400 77.3800 23.4300 0.0000 0.0000 0.0000 0.0000; + 7432 8003 0.02966 0.07251 0.00949 98 0 0 0 0 1 0 0 -23.9900 -16.5800 24.2300 16.1800 0.0000 0.0000 0.0000 0.0000; + 7432 8037 0.0136 0.05948 0.00906 149 0 0 0 0 1 0 0 63.7300 -1.4400 -63.1900 2.8800 0.0000 0.0000 0.0000 0.0000; + 7432 8141 0.03471 0.2084 0.02828 221 0 0 0 0 1 0 0 -62.6900 11.5200 64.0800 -6.0800 0.0000 0.0000 0.0000 0.0000; + 8003 8001 0.01464 0.06073 0.01031 149 0 0 0 0 1 0 0 -36.2100 20.7000 36.4600 -20.7800 0.0000 0.0000 0.0000 0.0000; + 8010 8001 0.01076 0.04467 0.00758 149 0 0 0 0 1 0 0 47.5400 -17.4100 -47.2700 17.7100 0.0000 0.0000 0.0000 0.0000; + 8028 8002 0.01939 0.04659 0.00632 98 0 0 0 0 1 0 0 -42.3100 -3.4600 42.6600 3.6400 0.0000 0.0000 0.0000 0.0000; + 8002 8100 0.00588 0.03355 0.00504 98 0 0 0 0 1 0 0 -54.4700 -6.9800 54.6400 7.4400 0.0000 0.0000 0.0000 0.0000; + 8005 8004 0.00029 0.01244 0 459 0 0 1 0 1 0 0 -180.9100 42.3500 181.0100 -38.3000 0.0000 0.0000 0.0000 0.0000; + 8005 8004 0.00029 0.01244 0 459 0 0 1 0 1 0 0 -180.9100 42.3500 181.0100 -38.3000 0.0000 0.0000 0.0000 0.0000; + 8097 8004 0.0073 0.05215 0.09507 443 0 0 0 0 1 0 0 15.1200 -3.1100 -15.1000 -6.7900 0.0000 0.0000 0.0000 0.0000; + 8005 8023 0.00379 0.02588 0.0044 221 0 0 0 0 1 0 0 96.9600 13.5700 -96.6200 -11.6900 0.0000 0.0000 0.0000 0.0000; + 8005 8023 0.00379 0.02588 0.0044 221 0 0 0 0 1 0 0 96.9600 13.5700 -96.6200 -11.6900 0.0000 0.0000 0.0000 0.0000; + 8137 8005 0.02182 0.09544 0.01454 149 0 0 0 0 1 0 0 -64.9800 -5.5600 65.8900 8.0200 0.0000 0.0000 0.0000 0.0000; + 8006 8007 0.00768 0.04613 0.00626 98 0 0 0 0 1 0 0 41.8200 27.1000 -41.6400 -26.6600 0.0000 0.0000 0.0000 0.0000; + 8006 8134 0.00667 0.02973 0.00436 250 0 0 0 0 1 0 0 -79.2200 37.1900 79.7000 -35.4900 0.0000 0.0000 0.0000 0.0000; + 8007 8017 0.00629 0.03774 0.00512 98 0 0 0 0 1 0 0 11.5700 18.1400 -11.5400 -18.4800 0.0000 0.0000 0.0000 0.0000; + 8008 8053 0.01567 0.09407 0.01277 98 0 0 0 0 1 0 0 -21.9300 1.6500 22.0000 -2.4300 0.0000 0.0000 0.0000 0.0000; + 8081 8008 0.02514 0.06143 0.00804 98 0 0 0 0 1 0 0 17.4100 12.2500 -17.3000 -12.7600 0.0000 0.0000 0.0000 0.0000; + 8009 8104 0.01187 0.06777 0.01018 98 0 0 0 0 1 0 0 2.0000 -20.7800 -1.9500 20.0400 0.0000 0.0000 0.0000 0.0000; + 8086 8010 0.0146 0.0834 0.01253 98 0 0 0 0 1 0 0 15.5600 -8.8900 -15.5100 7.8400 0.0000 0.0000 0.0000 0.0000; + 8010 8103 0.00735 0.04411 0.00599 98 0 0 0 0 1 0 0 -37.4200 8.0400 37.5200 -8.0400 0.0000 0.0000 0.0000 0.0000; + 8045 8011 0.00606 0.03914 0.00747 221 0 0 0 0 1 0 0 76.3700 11.9200 -76.0200 -10.4000 0.0000 0.0000 0.0000 0.0000; + 8045 8011 0.00606 0.03914 0.00747 221 0 0 0 0 1 0 0 76.3700 11.9200 -76.0200 -10.4000 0.0000 0.0000 0.0000 0.0000; + 8072 8011 0.00722 0.05031 0.00822 221 0 0 0 0 1 0 0 -123.6600 -6.0300 124.7900 13.0700 0.0000 0.0000 0.0000 0.0000; + 8012 8032 0.00861 0.03768 0.00574 149 0 0 0 0 1 0 0 -38.6700 -3.0400 38.8000 2.9900 0.0000 0.0000 0.0000 0.0000; + 8104 8012 0.01361 0.05953 0.00907 149 0 0 0 0 1 0 0 -30.9500 -1.2600 31.0700 0.8800 0.0000 0.0000 0.0000 0.0000; + 8026 8013 0.01793 0.10765 0.01461 98 0 0 0 0 1 0 0 -7.6600 -9.4600 7.6800 8.1400 0.0000 0.0000 0.0000 0.0000; + 8013 8039 0.02164 0.12994 0.01763 98 0 0 0 0 1 0 0 -2.5400 3.7100 2.5500 -5.4500 0.0000 0.0000 0.0000 0.0000; + 8013 8136 0.01354 0.05923 0.00902 149 0 0 0 0 1 0 0 -65.1700 21.7000 65.8000 -19.8300 0.0000 0.0000 0.0000 0.0000; + 8014 8037 0.01899 0.08308 0.01265 149 0 0 0 0 1 0 0 -51.3900 7.0600 51.9100 -6.0800 0.0000 0.0000 0.0000 0.0000; + 8118 8014 0.01481 0.08893 0.01207 98 0 0 0 0 1 0 0 -36.0300 11.4100 36.2400 -11.3500 0.0000 0.0000 0.0000 0.0000; + 8111 8015 0.02139 0.05228 0.00685 98 0 0 0 0 1 0 0 32.5000 -2.7800 -32.2800 2.6200 0.0000 0.0000 0.0000 0.0000; + 8015 8150 0.00949 0.05422 0.00815 98 0 0 0 0 1 0 0 8.3500 -9.4000 -8.3400 8.6500 0.0000 0.0000 0.0000 0.0000; + 8016 8122 0.03388 0.08282 0.01084 98 0 0 0 0 1 0 0 25.0100 -0.7500 -24.8100 0.1000 0.0000 0.0000 0.0000 0.0000; + 8016 8152 0.00375 0.01641 0.0025 221 0 0 0 0 1 0 0 -94.8800 39.2800 95.2500 -37.9100 0.0000 0.0000 0.0000 0.0000; + 8017 8040 0.01458 0.08752 0.01188 98 0 0 0 0 1 0 0 -6.9000 13.2600 6.9300 -14.2400 0.0000 0.0000 0.0000 0.0000; + 8019 8018 0.00115 0.03658 0 378 0 0 1 0 1 0 0 -213.5400 38.1200 214.0500 -21.9000 0.0000 0.0000 0.0000 0.0000; + 8019 8018 0.00115 0.03658 0 378 0 0 1 0 1 0 0 -213.5400 38.1200 214.0500 -21.9000 0.0000 0.0000 0.0000 0.0000; + 8127 8018 0.00839 0.08205 0.15788 647 0 0 0 0 1 0 0 221.9300 -0.4500 -218.0300 21.9100 0.0000 0.0000 0.0000 0.0000; + 8018 8133 0.00093 0.00905 0.01742 548 0 0 0 0 1 0 0 -210.0600 21.8900 210.4600 -19.8400 0.0000 0.0000 0.0000 0.0000; + 8019 8052 0.00643 0.02664 0.00452 149 0 0 0 0 1 0 0 74.9200 23.2500 -74.5400 -22.1800 0.0000 0.0000 0.0000 0.0000; + 8019 8100 0.0068 0.043 0.0058 150 0 0 0 0 1 0 0 47.7600 11.5600 -47.6100 -11.1900 0.0000 0.0000 0.0000 0.0000; + 8019 8135 0.00212 0.0148 0.00242 221 0 0 0 0 1 0 0 100.6400 24.2400 -100.4300 -23.0000 0.0000 0.0000 0.0000 0.0000; + 8019 8135 0.00212 0.0148 0.00242 221 0 0 0 0 1 0 0 100.6400 24.2400 -100.4300 -23.0000 0.0000 0.0000 0.0000 0.0000; + 8020 8029 0.01833 0.0817 0.01198 149 0 0 0 0 1 0 0 18.8300 -0.2100 -18.7600 -0.6800 0.0000 0.0000 0.0000 0.0000; + 8020 8040 0.02253 0.09344 0.01586 149 0 0 0 0 1 0 0 -43.8500 10.9200 44.3200 -10.5300 0.0000 0.0000 0.0000 0.0000; + 8020 8153 0.01361 0.08173 0.01109 98 0 0 0 0 1 0 0 10.7600 -3.9500 -10.7400 2.9600 0.0000 0.0000 0.0000 0.0000; + 8020 8154 0.04852 0.1186 0.01553 98 0 0 0 0 1 0 0 -3.0800 -11.6800 3.1500 10.2800 0.0000 0.0000 0.0000 0.0000; + 8022 8021 0.06068 0.14832 0.01942 98 0 0 0 0 1 0 0 -7.1100 6.1600 7.1600 -8.0400 0.0000 0.0000 0.0000 0.0000; + 8021 8041 0.01109 0.0485 0.00739 149 0 0 0 0 1 0 0 81.1500 -17.3000 -80.4200 19.7400 0.0000 0.0000 0.0000 0.0000; + 8021 8119 0.01573 0.06526 0.01107 156.45 0 0 0 0 1 0 0 -99.0500 22.3100 100.6100 -16.9700 0.0000 0.0000 0.0000 0.0000; + 8022 8150 0.05259 0.12855 0.01683 98 0 0 0 0 1 0 0 0.2200 9.4400 -0.1700 -11.0600 0.0000 0.0000 0.0000 0.0000; + 8024 8023 0.01105 0.18799 0 47 0 0 1 0 1 0 0 33.0000 -0.0000 -32.8900 1.9500 0.0000 0.0000 0.0000 0.0000; + 8023 8111 0.00548 0.03542 0.00676 221 0 0 0 0 1 0 0 113.0600 10.7200 -112.3900 -7.0500 0.0000 0.0000 0.0000 0.0000; + 8023 8111 0.00548 0.03542 0.00676 221 0 0 0 0 1 0 0 113.0600 10.7200 -112.3900 -7.0500 0.0000 0.0000 0.0000 0.0000; + 8025 8055 0.04211 0.10294 0.01348 98 0 0 0 0 1 0 0 -30.5900 19.3200 31.1200 -19.4300 0.0000 0.0000 0.0000 0.0000; + 8025 8121 0.03375 0.08251 0.0108 98 0 0 0 0 1 0 0 -25.2600 24.4000 25.6700 -24.5400 0.0000 0.0000 0.0000 0.0000; + 8025 8151 0.02868 0.1722 0.02337 98 0 0 0 0 1 0 0 5.0900 -4.1400 -5.0800 1.7300 0.0000 0.0000 0.0000 0.0000; + 8026 8154 0.02053 0.05018 0.00657 98 0 0 0 0 1 0 0 -47.4300 -6.1500 47.9000 6.6500 0.0000 0.0000 0.0000 0.0000; + 8100 8027 0.00732 0.03203 0.00488 223.5 0 0 0 0 1 0 0 -77.4000 25.5200 77.8700 -23.9900 0.0000 0.0000 0.0000 0.0000; + 8027 8134 0.00435 0.02974 0.00506 221 0 0 0 0 1 0 0 -117.2400 12.8300 117.8200 -9.3800 0.0000 0.0000 0.0000 0.0000; + 8146 8028 0.02838 0.06936 0.00908 98 0 0 0 0 1 0 0 -18.1500 2.6800 18.2500 -3.3600 0.0000 0.0000 0.0000 0.0000; + 8073 8029 0.02002 0.08756 0.01333 149 0 0 0 0 1 0 0 6.9100 5.3500 -6.8900 -6.5900 0.0000 0.0000 0.0000 0.0000; + 8031 8030 7e-05 0.00828 0 1036 0 0 1 0 1 0 0 -191.4800 -48.5200 191.5000 51.5700 0.0000 0.0000 0.0000 0.0000; + 8033 8030 0.00029 0.02168 0 826 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8034 8030 0.00021 0.01721 0 818 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8035 8030 0.00021 0.01536 0 830 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8036 8030 0.00021 0.01615 0 820 0 0 1 0 1 0 0 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8158 8030 0.00069 0.0084 0.55816 2020 0 0 0 0 1 0 0 -456.0000 -12.0600 457.3500 -30.8600 0.0000 0.0000 0.0000 0.0000; + 8032 8031 0.00099 0.03425 0 400 0 0 1 0 1 0 0 -212.6600 -8.3300 213.0900 23.2000 0.0000 0.0000 0.0000 0.0000; + 8143 8032 0.017 0.07576 0.01111 250 0 0 0 0 1 0 0 -94.3600 22.4700 95.9000 -16.7500 0.0000 0.0000 0.0000 0.0000; + 8038 8066 0.01227 0.05467 0.00802 149 0 0 0 0 1 0 0 -47.6400 6.2000 47.9300 -5.7200 0.0000 0.0000 0.0000 0.0000; + 8038 8124 0.01143 0.06861 0.00931 98 0 0 0 0 1 0 0 18.9000 -16.1100 -18.8300 15.6000 0.0000 0.0000 0.0000 0.0000; + 8039 8081 0.01342 0.07667 0.01152 98 0 0 0 0 1 0 0 -15.1600 1.8800 15.1900 -2.8500 0.0000 0.0000 0.0000 0.0000; + 8040 8072 0.02142 0.09547 0.014 149 0 0 0 0 1 0 0 -52.9200 15.4100 53.5800 -13.8300 0.0000 0.0000 0.0000 0.0000; + 8109 8040 0.015 0.088 0.012 98 0 0 0 0 1 0 0 16.4700 -5.1500 -16.4200 4.2300 0.0000 0.0000 0.0000 0.0000; + 8041 8063 0.02127 0.05109 0.00693 98 0 0 0 0 1 0 0 27.6400 17.3000 -27.4200 -17.4800 0.0000 0.0000 0.0000 0.0000; + 8111 8042 0.02452 0.05992 0.00785 98 0 0 0 0 1 0 0 45.1800 2.6900 -44.6900 -2.2900 0.0000 0.0000 0.0000 0.0000; + 8118 8042 0.02735 0.16423 0.02229 98 0 0 0 0 1 0 0 -17.2900 3.7300 17.3700 -5.4500 0.0000 0.0000 0.0000 0.0000; + 8044 8043 9e-05 0.00881 0 1072 0 0 1 0 1 0 0 -445.9800 -5.8200 446.1600 22.8200 0.0000 0.0000 0.0000 0.0000; + 8046 8043 0.00013 0.01356 0 606 0 0 1 0 1 0 0 172.2000 -19.1700 -172.1600 23.1300 0.0000 0.0000 0.0000 0.0000; + 8047 8043 0.00021 0.01156 0 613 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8048 8043 0.00055 0.02691 0 598 0 0 1 0 1 0 0 172.2000 87.8900 -172.0100 -78.5800 0.0000 0.0000 0.0000 0.0000; + 8049 8043 0.00017 0.00903 0 608 0 0 1 0 1 0 0 172.2000 -19.1700 -172.1500 21.8000 0.0000 0.0000 0.0000 0.0000; + 8050 8043 0.00032 0.0182 0 618 0 0 1 0 1 0 0 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8051 8043 0.00013 0.00831 0 608 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8043 8067 0.0004 0.00819 0.57108 2768 0 0 0 0 1 0 0 -572.5700 55.6000 573.8600 -87.9000 0.0000 0.0000 0.0000 0.0000; + 8045 8044 0.00042 0.02402 0 388 0 0 1 0 1 0 0 -237.0000 2.5700 237.2300 10.5700 0.0000 0.0000 0.0000 0.0000; + 8147 8044 0.00245 0.02399 0.04616 647 0 0 0 0 1 0 0 -207.7200 10.1600 208.7600 -4.7500 0.0000 0.0000 0.0000 0.0000; + 8045 8091 0.02272 0.09941 0.01514 149 0 0 0 0 1 0 0 53.5400 -28.0400 -52.7400 29.9600 0.0000 0.0000 0.0000 0.0000; + 8045 8144 0.01434 0.08609 0.01168 98 0 0 0 0 1 0 0 30.7100 1.6400 -30.5800 -2.0300 0.0000 0.0000 0.0000 0.0000; + 8081 8052 0.01891 0.04622 0.00605 98 0 0 0 0 1 0 0 -58.6600 -16.7800 59.3600 17.8800 0.0000 0.0000 0.0000 0.0000; + 8053 8065 0.0229 0.10022 0.01526 149 0 0 0 0 1 0 0 -62.4100 4.9100 63.3200 -2.4100 0.0000 0.0000 0.0000 0.0000; + 8053 8153 0.01818 0.10383 0.0156 98 0 0 0 0 1 0 0 19.4400 -8.4200 -19.3600 7.3500 0.0000 0.0000 0.0000 0.0000; + 8054 8092 0.00962 0.05775 0.00784 98 0 0 0 0 1 0 0 18.2400 -13.7700 -18.1900 13.2800 0.0000 0.0000 0.0000 0.0000; + 8132 8054 0.01211 0.06914 0.01039 98 0 0 0 0 1 0 0 34.5500 -9.3300 -34.4000 9.1900 0.0000 0.0000 0.0000 0.0000; + 8055 8098 0.011 0.078 0.013 220 0 0 0 0 1 0 0 -80.3100 9.7700 81.0000 -6.2000 0.0000 0.0000 0.0000 0.0000; + 8121 8055 0.02807 0.06863 0.00899 98 0 0 0 0 1 0 0 -15.3300 -0.8600 15.4000 0.0900 0.0000 0.0000 0.0000 0.0000; + 8056 8089 0.0071 0.04055 0.00609 98 0 0 0 0 1 0 0 -20.1600 8.0400 20.1900 -8.5000 0.0000 0.0000 0.0000 0.0000; + 8056 8138 0.00777 0.04664 0.00633 98 0 0 0 0 1 0 0 9.6100 -11.0400 -9.5900 10.4600 0.0000 0.0000 0.0000 0.0000; + 8058 8057 0.00019 0.02064 0 491 0 0 1 0 1 0 0 23.3800 -35.8900 -23.3800 36.2500 0.0000 0.0000 0.0000 0.0000; + 8060 8057 0.00013 0.00977 0 1157 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8061 8057 0.00019 0.01179 0 1152 0 0 1 0 1 0 0 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8057 8112 0.0013 0.01581 1.05006 2020 0 0 0 0 1 0 0 99.0900 -105.0500 -98.9300 -4.2900 0.0000 0.0000 0.0000 0.0000; + 8059 8058 0.00191 0.06531 0 143.8 0 0 1 0 1 0 0 -54.2900 -3.9500 54.3400 5.8300 0.0000 0.0000 0.0000 0.0000; + 8058 8068 0.00454 0.04438 0.0854 548 0 0 0 0 1 0 0 -192.8800 21.6100 194.5300 -14.2700 0.0000 0.0000 0.0000 0.0000; + 8058 8147 0.00321 0.03142 0.06046 548 0 0 0 0 1 0 0 115.1500 8.4400 -114.7400 -10.6200 0.0000 0.0000 0.0000 0.0000; + 8064 8059 0.00422 0.01881 0.00276 149 0 0 0 0 1 0 0 -54.1600 -3.6900 54.2900 3.9500 0.0000 0.0000 0.0000 0.0000; + 8062 8098 0.00445 0.01944 0.00296 149 0 0 0 0 1 0 0 17.9400 -7.6500 -17.9300 7.4100 0.0000 0.0000 0.0000 0.0000; + 8119 8062 0.01516 0.06756 0.00991 149 0 0 0 0 1 0 0 28.2600 -5.2700 -28.1400 4.7600 0.0000 0.0000 0.0000 0.0000; + 8101 8063 0.01764 0.10595 0.01438 98 0 0 0 0 1 0 0 27.8900 -5.1000 -27.7500 4.4800 0.0000 0.0000 0.0000 0.0000; + 8063 8125 0.03529 0.08625 0.01129 98 0 0 0 0 1 0 0 -14.2100 -6.6600 14.2900 5.7100 0.0000 0.0000 0.0000 0.0000; + 8144 8064 0.01683 0.06982 0.01185 149 0 0 0 0 1 0 0 -32.7600 1.8600 32.9400 -2.3200 0.0000 0.0000 0.0000 0.0000; + 8065 8149 0.00226 0.01459 0.00278 221 0 0 0 0 1 0 0 -31.1700 4.8200 31.1900 -4.9500 0.0000 0.0000 0.0000 0.0000; + 8065 8149 0.00226 0.01459 0.00278 221 0 0 0 0 1 0 0 -31.1700 4.8200 31.1900 -4.9500 0.0000 0.0000 0.0000 0.0000; + 8066 8093 0.04293 0.19131 0.02805 149 0 0 0 0 1 0 0 -32.0600 -1.4800 32.5000 0.6200 0.0000 0.0000 0.0000 0.0000; + 8142 8066 0.01064 0.0474 0.00695 149 0 0 0 0 1 0 0 19.1400 -6.7800 -19.1000 6.2800 0.0000 0.0000 0.0000 0.0000; + 8068 8067 0.00035 0.03434 0 285 0 0 1 0 1 0 0 -42.8700 18.6700 42.8700 -17.9500 0.0000 0.0000 0.0000 0.0000; + 8070 8067 0.00016 0.01452 0 1325 0 0 1 0 1 0 0 -0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8071 8067 0.00014 0.01049 0 1314 0 0 1 0 1 0 0 922.3600 -94.4500 -921.1600 184.6300 0.0000 0.0000 0.0000 0.0000; + 8069 8068 0.00074 0.05407 0 143 0 0 1 0 1 0 0 -45.8900 5.4900 45.9000 -4.3800 0.0000 0.0000 0.0000 0.0000; + 8068 8083 0.00329 0.03216 0.06187 548 0 0 0 0 1 0 0 -197.5700 -0.0200 198.8100 5.6300 0.0000 0.0000 0.0000 0.0000; + 8103 8069 0.01048 0.04673 0.00685 149 0 0 0 0 1 0 0 -45.6800 5.7300 45.8900 -5.4900 0.0000 0.0000 0.0000 0.0000; + 8073 8108 0.01751 0.10003 0.01503 98 0 0 0 0 1 0 0 13.0100 -10.6800 -12.9600 9.4500 0.0000 0.0000 0.0000 0.0000; + 8136 8073 0.015 0.088 0.012 98 0 0 0 0 1 0 0 39.2000 0.2200 -38.9700 -0.0700 0.0000 0.0000 0.0000 0.0000; + 8075 8074 0.00028 0.02981 0 550 0 0 1 0 1 0 0 -196.0700 6.7900 196.1800 4.0400 0.0000 0.0000 0.0000 0.0000; + 8075 8074 0.00028 0.02981 0 550 0 0 1 0 1 0 0 -196.0700 6.7900 196.1800 4.0400 0.0000 0.0000 0.0000 0.0000; + 8077 8074 0.00016 0.01864 0 806 0 0 1 0 1 0 0 234.2600 8.0300 -234.1700 1.6200 0.0000 0.0000 0.0000 0.0000; + 8078 8074 0.00029 0.01964 0 818 0 0 1 0 1 0 0 234.2600 6.5700 -234.1100 3.5900 0.0000 0.0000 0.0000 0.0000; + 8079 8074 0.0002 0.0153 0 818 0 0 1 0 1 0 0 234.2600 7.2500 -234.1500 0.6700 0.0000 0.0000 0.0000 0.0000; + 8080 8074 0.00022 0.01762 0 814 0 0 1 0 1 0 0 234.2600 7.1500 -234.1400 1.9700 0.0000 0.0000 0.0000 0.0000; + 8076 8075 0.00099 0.04033 0 320 0 0 1 0 1 0 0 -177.7500 3.8800 178.0500 8.2300 0.0000 0.0000 0.0000 0.0000; + 8075 8097 0.00445 0.03181 0.05799 740 0 0 0 0 1 0 0 214.1000 -21.8200 -212.1600 29.5600 0.0000 0.0000 0.0000 0.0000; + 8119 8076 0.00591 0.0412 0.00674 221 0 0 0 0 1 0 0 -88.4300 4.3200 88.8800 -1.9400 0.0000 0.0000 0.0000 0.0000; + 8119 8076 0.00591 0.0412 0.00674 221 0 0 0 0 1 0 0 -88.4300 4.3200 88.8800 -1.9400 0.0000 0.0000 0.0000 0.0000; + 8083 8082 0.00031 0.01574 0 1134 0 0 1 0 1 0 0 -324.6600 -25.2300 324.9700 41.0700 0.0000 0.0000 0.0000 0.0000; + 8087 8082 8e-05 0.00888 0 1315 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8088 8082 8e-05 0.00591 0 1307 0 0 1 0 1 0 0 895.2400 139.8300 -894.6300 -94.9700 0.0000 0.0000 0.0000 0.0000; + 8155 8082 0.00016 0.00337 0.23512 2768 0 0 0 0 1 0 0 -392.6500 -121.7000 392.9000 102.0300 0.0000 0.0000 0.0000 0.0000; + 8084 8083 0.00236 0.06305 0 184.8 0 0 1 0 1 0 0 -125.4900 -9.9000 125.8500 19.6000 0.0000 0.0000 0.0000 0.0000; + 8085 8084 0.00092 0.02498 0 231 0 0 1 0 1 0 0 -36.8400 1.9900 36.8500 -1.6600 0.0000 0.0000 0.0000 0.0000; + 8086 8085 0.00184 0.06658 0 205 0 0 1 0 1 0 0 -36.8100 2.8700 36.8400 -1.9900 0.0000 0.0000 0.0000 0.0000; + 8089 8135 0.00521 0.03628 0.00593 221 0 0 0 0 1 0 0 -20.8300 1.2100 20.8500 -1.6800 0.0000 0.0000 0.0000 0.0000; + 8089 8135 0.00521 0.03628 0.00593 221 0 0 0 0 1 0 0 -20.8300 1.2100 20.8500 -1.6800 0.0000 0.0000 0.0000 0.0000; + 8090 8092 0.01569 0.08961 0.01347 98 0 0 0 0 1 0 0 -11.0300 14.2200 11.0800 -15.2900 0.0000 0.0000 0.0000 0.0000; + 8151 8090 0.01339 0.08041 0.01091 98 0 0 0 0 1 0 0 4.2200 17.6500 -4.1800 -18.5300 0.0000 0.0000 0.0000 0.0000; + 8091 8109 0.07888 0.19284 0.02525 98 0 0 0 0 1 0 0 40.8700 3.7800 -39.6100 -3.2800 0.0000 0.0000 0.0000 0.0000; + 8106 8093 0.018 0.078 0.012 150 0 0 0 0 1 0 0 -21.6300 -7.3400 21.7200 6.5100 0.0000 0.0000 0.0000 0.0000; + 8093 8128 0.01795 0.07854 0.01196 149 0 0 0 0 1 0 0 -59.1300 -8.5300 59.7500 10.0000 0.0000 0.0000 0.0000 0.0000; + 8095 8094 0.00041 0.03017 0 317 0 0 1 0 1 0 0 -172.5500 -26.9700 172.6700 36.2100 0.0000 0.0000 0.0000 0.0000; + 8094 8139 0.00069 0.00679 0.01307 548 0 0 0 0 1 0 0 189.6500 27.0400 -189.4000 -25.9100 0.0000 0.0000 0.0000 0.0000; + 8094 8159 0.00239 0.02336 0.04495 548 0 0 0 0 1 0 0 -64.3800 -88.1900 64.6500 86.1700 0.0000 0.0000 0.0000 0.0000; + 8095 8140 0.01066 0.02604 0.00341 250 0 0 0 0 1 0 0 25.7300 -14.6300 -25.6400 14.5100 0.0000 0.0000 0.0000 0.0000; + 8096 8110 0.0448 0.10762 0.0146 98 0 0 0 0 1 0 0 -43.9100 0.0500 44.7800 0.5600 0.0000 0.0000 0.0000 0.0000; + 8096 8153 0.0128 0.07686 0.01043 98 0 0 0 0 1 0 0 32.7400 -3.2200 -32.6000 3.0200 0.0000 0.0000 0.0000 0.0000; + 8098 8097 0.00373 0.10051 0 175.5 0 0 1 0 1 0 0 -63.0700 -1.2100 63.2200 5.0400 0.0000 0.0000 0.0000 0.0000; + 8099 8097 0.00303 0.097 0 184 0 0 1 0 1 0 0 85.5000 -0.0000 -85.2900 6.7200 0.0000 0.0000 0.0000 0.0000; + 8097 8113 0.00194 0.01386 0.02527 800 0 0 0 0 1 0 0 219.1100 -38.2100 -218.2100 42.0200 0.0000 0.0000 0.0000 0.0000; + 8138 8100 0.01582 0.03801 0.00516 98 0 0 0 0 1 0 0 -28.9400 33.5900 29.2300 -33.4200 0.0000 0.0000 0.0000 0.0000; + 8101 8137 0.01472 0.08841 0.012 98 0 0 0 0 1 0 0 -40.4200 1.5500 40.6600 -1.3300 0.0000 0.0000 0.0000 0.0000; + 8102 8157 0.00742 0.03309 0.00485 149 0 0 0 0 1 0 0 -59.3700 1.4300 59.6300 -0.7900 0.0000 0.0000 0.0000 0.0000; + 8106 8105 0.00098 0.05869 0 212.8 0 0 1 0 1 0 0 -120.1000 -20.7500 120.2400 29.3900 0.0000 0.0000 0.0000 0.0000; + 8105 8127 0.00276 0.02696 0.05188 548 0 0 0 0 1 0 0 -120.2400 -29.3900 120.6400 27.8600 0.0000 0.0000 0.0000 0.0000; + 8142 8106 0.01907 0.08501 0.01247 149 0 0 0 0 1 0 0 -41.5000 0.4400 41.8400 -0.2200 0.0000 0.0000 0.0000 0.0000; + 8128 8107 0.01223 0.05352 0.00815 221 0 0 0 0 1 0 0 136.7900 -19.0500 -134.6000 27.7800 0.0000 0.0000 0.0000 0.0000; + 8145 8107 0.01849 0.08086 0.01231 250 0 0 0 0 1 0 0 -122.6300 9.5100 125.3900 1.2700 0.0000 0.0000 0.0000 0.0000; + 8153 8108 0.013 0.054 0.027 186 0 0 0 0 1 0 0 24.1500 -24.2600 -24.0100 22.1700 0.0000 0.0000 0.0000 0.0000; + 8109 8123 0.00627 0.0358 0.00538 98 0 0 0 0 1 0 0 -28.6200 -6.2400 28.6700 6.0200 0.0000 0.0000 0.0000 0.0000; + 8124 8110 0.00917 0.05504 0.00747 98 0 0 0 0 1 0 0 65.6800 -32.8100 -65.1900 34.9800 0.0000 0.0000 0.0000 0.0000; + 8111 8125 0.01474 0.0885 0.01201 221 0 0 0 0 1 0 0 59.9800 -10.4800 -59.4500 12.4200 0.0000 0.0000 0.0000 0.0000; + 8113 8112 9e-05 0.00481 0 1290 0 0 1 0 1 0 0 -326.2300 -62.9400 326.3300 67.9600 0.0000 0.0000 0.0000 0.0000; + 8115 8112 0.00071 0.04514 0 273 0 0 1 0 1 0 0 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000; + 8116 8112 0.00024 0.01298 0 1026 0 0 1 0 1 0 0 0.0000 0.0000 -0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000; + 8117 8112 0.00025 0.01118 0 1034 0 0 1 0 1 0 0 227.5300 69.5200 -227.4000 -63.6700 0.0000 0.0000 0.0000 0.0000; + 8114 8113 0.00077 0.03155 0 190 0 0 1 0 1 0 0 -114.8100 -8.6700 114.9000 12.6500 0.0000 0.0000 0.0000 0.0000; + 8113 8133 0.003 0.0312 0.10631 750 0 0 0 0 1 0 0 214.7700 4.1400 -213.4600 -1.6900 0.0000 0.0000 0.0000 0.0000; + 8113 8133 0.003 0.0312 0.10631 750 0 0 0 0 1 0 0 214.7700 4.1400 -213.4600 -1.6900 0.0000 0.0000 0.0000 0.0000; + 8121 8114 0.01148 0.07843 0.01334 221 0 0 0 0 1 0 0 -89.5000 2.9700 90.3900 1.7500 0.0000 0.0000 0.0000 0.0000; + 8118 8151 0.01924 0.11555 0.01568 98 0 0 0 0 1 0 0 16.6900 -25.5200 -16.5200 24.9200 0.0000 0.0000 0.0000 0.0000; + 8120 8122 0.03382 0.08268 0.01083 147 0 0 0 0 1 0 0 4.6300 7.3600 -4.6000 -8.4300 0.0000 0.0000 0.0000 0.0000; + 8120 8140 0.01216 0.07301 0.00991 170 0 0 0 0 1 0 0 -52.2500 52.7400 52.8800 -49.9300 0.0000 0.0000 0.0000 0.0000; + 8120 8141 0.0166 0.06885 0.01168 221 0 0 0 0 1 0 0 86.1900 3.4700 -85.0200 0.1400 0.0000 0.0000 0.0000 0.0000; + 8143 8120 0.01659 0.07254 0.01105 221 0 0 0 0 1 0 0 71.4100 -28.9700 -70.4700 31.9200 0.0000 0.0000 0.0000 0.0000; + 8149 8123 0.00474 0.02711 0.00407 147 0 0 0 0 1 0 0 46.3000 11.1900 -46.2000 -10.9800 0.0000 0.0000 0.0000 0.0000; + 8127 8126 0.00011 0.00797 0 1175 0 0 1 0 1 0 0 -269.6300 -13.1500 269.7100 18.6100 0.0000 0.0000 0.0000 0.0000; + 8127 8126 0.00011 0.00797 0 1175 0 0 1 0 1 0 0 -269.6300 -13.1500 269.7100 18.6100 0.0000 0.0000 0.0000 0.0000; + 8129 8126 8e-05 0.00487 0 1190 0 0 1 0 1 0 0 658.1900 -49.8500 -657.8600 69.8500 0.0000 0.0000 0.0000 0.0000; + 8130 8126 0.00026 0.01215 0 1192 0 0 1 0 1 0 0 658.1900 -8.9200 -657.1300 58.5400 0.0000 0.0000 0.0000 0.0000; + 8131 8126 0.0001 0.00621 0 1173 0 0 1 0 1 0 0 658.1900 -36.3400 -657.7800 61.7700 0.0000 0.0000 0.0000 0.0000; + 8128 8127 0.0004 0.02178 0 286 0 0 1 0 1 0 0 -196.5400 9.0500 196.6900 -1.1200 0.0000 0.0000 0.0000 0.0000; + 8132 8144 0.02494 0.10345 0.01756 149 0 0 0 0 1 0 0 -56.4800 3.1200 57.2900 -1.5400 0.0000 0.0000 0.0000 0.0000; + 8134 8133 0.00067 0.03526 0 300 0 0 1 0 1 0 0 -154.5100 6.6400 154.6700 1.4400 0.0000 0.0000 0.0000 0.0000; + 8134 8133 0.00067 0.03526 0 300 0 0 1 0 1 0 0 -154.5100 6.6400 154.6700 1.4400 0.0000 0.0000 0.0000 0.0000; + 8133 8147 0.00702 0.06865 0.13208 548 0 0 0 0 1 0 0 -92.8800 20.3400 93.5100 -27.8300 0.0000 0.0000 0.0000 0.0000; + 8154 8135 0.00895 0.03991 0.00585 149 0 0 0 0 1 0 0 -77.3600 -24.3800 77.9400 26.3600 0.0000 0.0000 0.0000 0.0000; + 8136 8145 0.01057 0.04623 0.00704 149 0 0 0 0 1 0 0 -115.0500 16.7700 116.4800 -11.2500 0.0000 0.0000 0.0000 0.0000; + 8138 8146 0.02103 0.12014 0.01805 98 0 0 0 0 1 0 0 32.0200 16.4600 -31.7600 -16.8200 0.0000 0.0000 0.0000 0.0000; + 8140 8139 0.00037 0.02517 0 365 0 0 1 0 1 0 0 -189.2700 -16.8100 189.4000 25.9100 0.0000 0.0000 0.0000 0.0000; + 8148 8147 0.00049 0.03635 0 201.3 0 0 1 0 1 0 0 -114.4100 -9.4200 114.4700 14.1500 0.0000 0.0000 0.0000 0.0000; + 8148 8147 0.00049 0.03635 0 201.3 0 0 1 0 1 0 0 -114.4100 -9.4200 114.4700 14.1500 0.0000 0.0000 0.0000 0.0000; + 8149 8148 0.00259 0.0686 0 254 0 0 1 0 1 0 0 -108.6800 -1.2900 108.9900 9.3900 0.0000 0.0000 0.0000 0.0000; + 8152 8160 0.00538 0.03751 0.00613 221 0 0 0 0 1 0 0 -70.8000 12.3900 71.0600 -11.2000 0.0000 0.0000 0.0000 0.0000; + 8152 8160 0.00538 0.03751 0.00613 221 0 0 0 0 1 0 0 -70.8000 12.3900 71.0600 -11.2000 0.0000 0.0000 0.0000 0.0000; + 8156 8155 0.00077 0.04753 0 500 0 0 1 0 1 0 0 46.7200 -14.6300 -46.7000 15.7200 0.0000 0.0000 0.0000 0.0000; + 8157 8156 0.0013 0.06678 0 240 0 0 1 0 1 0 0 -109.6700 -3.1000 109.8200 10.8900 0.0000 0.0000 0.0000 0.0000; + 8156 8159 0.00621 0.04434 0.08084 600 0 0 0 0 1 0 0 -156.5400 3.7300 158.0100 -1.8000 0.0000 0.0000 0.0000 0.0000; + 8159 8158 0.00013 0.01364 0 1204 0 0 1 0 1 0 0 -455.7400 14.6700 456.0000 12.0600 0.0000 0.0000 0.0000 0.0000; + 8160 8159 0.0008 0.05008 0 377 0 0 1 0 1 0 0 -116.4400 -1.6600 116.5400 8.1000 0.0000 0.0000 0.0000 0.0000; + 8160 8159 0.0008 0.05008 0 377 0 0 1 0 1 0 0 -116.4400 -1.6600 116.5400 8.1000 0.0000 0.0000 0.0000 0.0000; +]; + +%%----- OPF Data -----%% +%% generator cost data +% 1 startup shutdown n x1 y1 ... xn yn +% 2 startup shutdown n c(n-1) ... c0 +mpc.gencost = [ + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 18.641 1087.8; + 2 0 0 3 0.001 18.641 1087.8; + 2 0 0 3 0.001 17.464 734.1; + 2 0 0 3 0.001 17.464 734.1; + 2 0 0 3 0.001 17.464 734.1; + 2 0 0 3 0.001 17.91 868.2; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.046 608.4; + 2 0 0 3 0.001 17.028 603; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.977 888.2; + 2 0 0 3 0.001 17.495 743.25; + 2 0 0 3 0.001 17.495 743.25; + 2 0 0 3 0.001 17.495 743.25; + 2 0 0 3 0.001 18.448 1029.75; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 27.494 1187.7; + 2 0 0 3 0.002 27.494 1187.7; + 2 0 0 3 0.002 27.494 1187.7; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.989 724.99; + 2 0 0 3 0.001 17.394 850.01; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 17.268 236.16; + 2 0 0 3 0.002 17.268 1398.51; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.033 630; + 2 0 0 3 0.001 16.033 630; + 2 0 0 3 0.001 16.126 660; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 26.597 1001.59; + 2 0 0 3 0.002 26.597 1001.59; + 2 0 0 3 0.002 26.597 1001.59; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0.001 17.482 877.08; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 19.197 601.95; + 2 0 0 3 0.002 19.693 734.1; + 2 0 0 3 0.002 21.704 1365.86; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 19.478 676.95; + 2 0 0 3 0.002 19.478 676.95; + 2 0 0 3 0.002 19.478 676.95; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 17.172 1243.08; + 2 0 0 3 0.002 17.172 1349.57; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.73 666.3; + 2 0 0 3 0.001 17.213 816; + 2 0 0 3 0.001 17.213 816; + 2 0 0 3 0.001 17.213 816; + 2 0 0 3 0.001 17.35 858.49; + 2 0 0 3 0.001 17.35 858.49; + 2 0 0 3 0.001 17.35 858.49; + 2 0 0 3 0.001 16.743 670.5; + 2 0 0 3 0.002 29.085 864.49; + 2 0 0 3 0.002 29.085 864.49; + 2 0 0 3 0.002 29.085 864.49; + 2 0 0 3 0.001 17.694 965.1; + 2 0 0 3 0.001 17.694 965.1; + 2 0 0 3 0.001 17.694 965.1; + 2 0 0 3 0.001 18.22 1128; + 2 0 0 3 0.002 17.172 236.04; + 2 0 0 3 0.002 17.172 236.63; + 2 0 0 3 0.002 17.172 236.2; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0.002 17.172 236.75; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 28.724 797.7; + 2 0 0 3 0.002 28.724 797.7; + 2 0 0 3 0.002 27.928 650.4; + 2 0 0 3 0.002 27.928 650.4; + 2 0 0 3 0.002 27.928 650.4; + 2 0 0 3 0.002 27.928 650.4; + 2 0 0 3 0.002 28.2 700.8; + 2 0 0 3 0.002 28.19 699; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.473 896.66; + 2 0 0 3 0.001 17.473 896.66; + 2 0 0 3 0.001 17.473 896.66; + 2 0 0 3 0.001 16.559 613.5; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.879 712.5; + 2 0 0 3 0.001 17.405 875.66; + 2 0 0 3 0.001 16.632 636; + 2 0 0 3 0.001 16.811 691.5; + 2 0 0 3 0.001 16.566 615.6; + 2 0 0 3 0.001 17.808 1000.5; + 2 0 0 3 0.001 17.808 1000.5; + 2 0 0 3 0.001 17.808 1000.5; + 2 0 0 3 0.001 17.405 875.66; + 2 0 0 3 0.001 17.405 875.66; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 15.962 607.2; + 2 0 0 3 0.001 15.177 606.3; + 2 0 0 3 0.001 15.186 609.6; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.529 1062.7; + 2 0 0 3 0.001 16.996 727.05; + 2 0 0 3 0.001 17.435 1076.03; + 2 0 0 3 0.001 17.422 1076.03; + 2 0 0 3 0.001 15.989 615.9; + 2 0 0 3 0.001 15.948 602.7; + 2 0 0 3 0.001 17.987 1223.61; + 2 0 0 3 0.001 17.987 1223.61; + 2 0 0 3 0.001 17.987 1223.61; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 17.966 236.29; + 2 0 0 3 0.002 17.966 236.15; + 2 0 0 3 0.001 16.531 789.75; + 2 0 0 3 0.001 15.947 602.4; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.101 973.01; + 2 0 0 3 0.001 17.101 973.01; + 2 0 0 3 0.001 17.101 973.01; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 6.975 1485.46; + 2 0 0 3 0 8.11 1209.05; + 2 0 0 3 0.002 19.596 1001.59; + 2 0 0 3 0.002 19.596 1001.59; + 2 0 0 3 0.002 19.596 1001.59; + 2 0 0 3 0.001 16.6 604.8; + 2 0 0 3 0.001 17.143 772.5; + 2 0 0 3 0.001 17.143 772.5; + 2 0 0 3 0.001 17.143 772.5; + 2 0 0 3 0.001 16.986 724.05; + 2 0 0 3 0.001 18.839 1638.81; + 2 0 0 3 0.001 18.839 1638.81; + 2 0 0 3 0.002 19.57 994.2; + 2 0 0 3 0.002 19.57 994.2; + 2 0 0 3 0.002 19.57 994.2; + 2 0 0 3 0.001 16.42 1026.1; + 2 0 0 3 0.001 16.42 1026.1; + 2 0 0 3 0.001 16.42 1026.1; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 18.671 1542.9; + 2 0 0 3 0.001 15.988 615.6; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.936 919.99; + 2 0 0 3 0.001 16.087 913.5; + 2 0 0 3 0.001 16.087 913.5; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.357 734.1; + 2 0 0 3 0.001 16.357 734.1; + 2 0 0 3 0.001 16.357 734.1; + 2 0 0 3 0.001 16.357 734.1; + 2 0 0 3 0.001 16.51 783; + 2 0 0 3 0.001 16.51 783; + 2 0 0 3 0.001 16.51 783; + 2 0 0 3 0.001 16.495 778.2; + 2 0 0 3 0.001 16.495 778.2; + 2 0 0 3 0.001 15.998 618.6; + 2 0 0 3 0.001 15.955 604.8; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 19.71 1033.5; + 2 0 0 3 0.002 18.923 811.95; + 2 0 0 3 0.002 18.923 811.95; + 2 0 0 3 0.001 17.595 919.5; + 2 0 0 3 0.001 18.629 1023.67; + 2 0 0 3 0.001 17.524 897.49; + 2 0 0 3 0.001 17.524 897.49; + 2 0 0 3 0.001 17.524 897.49; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 15.388 605.1; + 2 0 0 3 0.001 15.416 614.4; + 2 0 0 3 0.001 15.393 606.6; + 2 0 0 3 0.001 15.631 686.1; + 2 0 0 3 0.001 15.631 686.1; + 2 0 0 3 0.001 15.631 686.1; + 2 0 0 3 0.001 15.631 686.1; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.001 17.442 872.05; + 2 0 0 3 0.002 17.597 1319.96; + 2 0 0 3 0.002 17.597 1319.96; + 2 0 0 3 0.002 17.597 1319.96; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.855 690.75; + 2 0 0 3 0.001 16.855 690.75; + 2 0 0 3 0.001 17.149 781.5; + 2 0 0 3 0.002 17.597 1333.63; + 2 0 0 3 0.002 17.597 1369.18; + 2 0 0 3 0.001 15.411 612.6; + 2 0 0 3 0.001 17.383 1349.57; + 2 0 0 3 0.001 17.383 1349.57; + 2 0 0 3 0.001 19.572 3859; + 2 0 0 3 0.001 18.626 3859; + 2 0 0 3 0.001 18.626 3859; + 2 0 0 3 0.001 17.702 952.58; + 2 0 0 3 0.001 17.702 952.58; + 2 0 0 3 0.001 17.702 952.58; + 2 0 0 3 0.001 17.702 952.58; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 15.648 691.5; + 2 0 0 3 0.001 16.197 874.5; + 2 0 0 3 0.001 16.716 1047; + 2 0 0 3 0.001 16.716 1047; + 2 0 0 3 0.001 16.716 1047; + 2 0 0 3 0.001 16.199 874.99; + 2 0 0 3 0.001 16.199 874.99; + 2 0 0 3 0.001 16.199 874.99; + 2 0 0 3 0.001 17.503 891; + 2 0 0 3 0.001 17.503 891; + 2 0 0 3 0.001 16.811 677.1; + 2 0 0 3 0.001 17.809 985.5; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.562 909.34; + 2 0 0 3 0.001 17.562 909.34; + 2 0 0 3 0.001 17.562 909.34; + 2 0 0 3 0.001 16.577 604.8; + 2 0 0 3 0.001 17.762 970.88; + 2 0 0 3 0.001 17.762 970.88; + 2 0 0 3 0.001 17.762 970.88; + 2 0 0 3 0.001 17.762 970.88; + 2 0 0 3 0.001 16.62 618; + 2 0 0 3 0.001 16.811 677.25; + 2 0 0 3 0.001 17.061 754.5; + 2 0 0 3 0.001 16.572 603.45; + 2 0 0 3 0.001 16.584 606.9; + 2 0 0 3 0.001 16.569 602.25; + 2 0 0 3 0.001 16.581 606; + 2 0 0 3 0.001 16.592 609.6; + 2 0 0 3 0.001 18.323 1144.5; + 2 0 0 3 0.001 18.323 1144.5; + 2 0 0 3 0.001 16.811 677.25; + 2 0 0 3 0.001 15.681 844.5; + 2 0 0 3 0.001 15.681 844.5; + 2 0 0 3 0.001 15.681 844.5; + 2 0 0 3 0.001 15.681 844.5; + 2 0 0 3 0.001 15.681 844.5; + 2 0 0 3 0.001 14.983 606; + 2 0 0 3 0.001 16.624 633.6; + 2 0 0 3 0.001 16.745 671.1; + 2 0 0 3 0.001 16.745 671.1; + 2 0 0 3 0.001 16.974 742.2; + 2 0 0 3 0.001 16.531 604.8; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 17.428 882.67; + 2 0 0 3 0.001 17.428 882.67; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 17.072 772.35; + 2 0 0 3 0.001 15.969 942.97; + 2 0 0 3 0.001 15.969 942.97; + 2 0 0 3 0.001 15.969 942.97; + 2 0 0 3 0.001 15.969 942.97; + 2 0 0 3 0 7.063 1447.46; + 2 0 0 3 0 7.445 1025.47; + 2 0 0 3 0.001 15.624 825; + 2 0 0 3 0.001 15.19 676.5; + 2 0 0 3 0.001 15.19 676.5; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 15.826 894; + 2 0 0 3 0.001 14.982 605.55; + 2 0 0 3 0.001 14.985 606.45; + 2 0 0 3 0.001 15.037 624.45; + 2 0 0 3 0.001 15.872 909.83; + 2 0 0 3 0.001 15.872 909.83; + 2 0 0 3 0.001 15.872 909.83; + 2 0 0 3 0.001 15.872 909.83; + 2 0 0 3 0.001 16.636 1171.05; + 2 0 0 3 0.001 15.225 688.5; + 2 0 0 3 0.001 15.225 688.5; + 2 0 0 3 0.001 15.225 688.5; + 2 0 0 3 0.001 15.225 688.5; + 2 0 0 3 0.001 15.011 615.3; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.451 765.9; + 2 0 0 3 0.001 15.351 731.58; + 2 0 0 3 0.001 15.351 731.58; + 2 0 0 3 0.001 16.505 1126.31; + 2 0 0 3 0.001 14.996 610.35; + 2 0 0 3 0.001 15.177 672; + 2 0 0 3 0.001 14.988 607.5; + 2 0 0 3 0.001 15.119 652.5; + 2 0 0 3 0.001 14.999 611.25; + 2 0 0 3 0.001 15.979 946.42; + 2 0 0 3 0.001 15.979 946.42; + 2 0 0 3 0.001 15.979 946.42; + 2 0 0 3 0.001 15.979 946.42; + 2 0 0 3 0.001 14.983 606; + 2 0 0 3 0.001 18.322 3859; + 2 0 0 3 0.001 18.322 3859; + 2 0 0 3 0.001 15.749 867.75; + 2 0 0 3 0.001 15.749 867.75; + 2 0 0 3 0.001 15.749 867.75; + 2 0 0 3 0.001 16.302 1056.9; + 2 0 0 3 0.001 15.364 735.96; + 2 0 0 3 0.001 15.364 735.96; + 2 0 0 3 0.001 15.364 735.96; + 2 0 0 3 0.001 15.761 871.92; + 2 0 0 3 0.001 15.079 638.55; + 2 0 0 3 0.001 15.032 622.5; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0 0 0; + 2 0 0 3 0.001 16.984 745.02; + 2 0 0 3 0.001 16.984 745.02; + 2 0 0 3 0.001 16.984 745.02; + 2 0 0 3 0.001 16.984 745.02; + 2 0 0 3 0.001 17.452 890.05; + 2 0 0 3 0.001 15.512 786.72; + 2 0 0 3 0.001 15.512 786.72; + 2 0 0 3 0.001 15.512 786.72; + 2 0 0 3 0.001 15.512 786.72; + 2 0 0 3 0.001 17.009 752.85; + 2 0 0 3 0.002 18.671 236.13; + 2 0 0 3 0.002 18.671 1264.89; + 2 0 0 3 0.001 16.343 1070.74; + 2 0 0 3 0.001 16.343 1070.74; + 2 0 0 3 0.001 16.343 1070.74; + 2 0 0 3 0.001 16.343 1070.74; + 2 0 0 3 0.001 17.967 3859; + 2 0 0 3 0.001 17.967 3859; + 2 0 0 3 0.001 17.967 3859; + 2 0 0 3 0.001 17.967 3859; + 2 0 0 3 0.001 15.037 624.45; + 2 0 0 3 0.001 15.954 937.8; + 2 0 0 3 0.001 15.954 937.8; + 2 0 0 3 0.001 15.954 937.8; + 2 0 0 3 0.001 15.416 754.05; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.437 760.91; + 2 0 0 3 0.001 15.772 875.49; + 2 0 0 3 0.001 15.772 875.49; + 2 0 0 3 0.001 15.772 875.49; + 2 0 0 3 0.001 15.772 875.49; + 2 0 0 3 0.001 15.772 875.49; + 2 0 0 3 0.001 17.347 2926.93; + 2 0 0 3 0.001 15.282 708; + 2 0 0 3 0.001 15.282 708; + 2 0 0 3 0.001 15.282 708; + 2 0 0 3 0.001 15.282 708; + 2 0 0 3 0.001 15.598 816; + 2 0 0 3 0.001 16.924 1356.09; + 2 0 0 3 0.001 16.821 694.65; + 2 0 0 3 0.001 18.016 1065; + 2 0 0 3 0.001 17.011 753.6; + 2 0 0 3 0.001 15.353 732.3; + 2 0 0 3 0.001 15.353 732.3; + 2 0 0 3 0.001 14.996 610.2; + 2 0 0 3 0.001 15.721 858.3; + 2 0 0 3 0.001 15.721 858.3; + 2 0 0 3 0.001 15.459 768.75; + 2 0 0 3 0.001 15.459 768.75; + 2 0 0 3 0.001 15.459 768.75; + 2 0 0 3 0.001 15.459 768.75; + 2 0 0 3 0.001 15.804 886.65; + 2 0 0 3 0.001 15.721 858.3; + 2 0 0 3 0.001 15.721 858.3; + 2 0 0 3 0.001 15.721 858.3; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.536 795; + 2 0 0 3 0.001 15.536 795; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.407 750.78; + 2 0 0 3 0.001 15.295 712.5; + 2 0 0 3 0.001 15.321 721.5; + 2 0 0 3 0.001 15.017 617.55; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 19.422 952.4; + 2 0 0 3 0.002 19.422 952.4; + 2 0 0 3 0.002 19.422 952.4; + 2 0 0 3 0.002 19.422 952.4; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 19.09 859.01; + 2 0 0 3 0.002 18.671 1335.03; + 2 0 0 3 0.002 18.671 1335.03; + 2 0 0 3 0.002 18.671 1501.24; + 2 0 0 3 0.002 18.671 1501.24; + 2 0 0 3 0.001 16.202 952.35; + 2 0 0 3 0.001 16.202 952.35; + 2 0 0 3 0.001 16.202 952.35; + 2 0 0 3 0.001 16.202 952.35; + 2 0 0 3 0.002 18.671 1487.6; + 2 0 0 3 0.002 18.671 1487.6; + 2 0 0 3 0 0 0; + 2 0 0 3 0.002 21.838 236.27; + 2 0 0 3 0.002 21.838 1213.85; + 2 0 0 3 0.002 21.838 1213.85; + 2 0 0 3 0.002 16.843 1368.42; + 2 0 0 3 0.002 16.843 1368.42; + 2 0 0 3 0.002 16.843 1368.42; + 2 0 0 3 0.002 21.838 236.11; + 2 0 0 3 0.002 21.838 953.96; + 2 0 0 3 0.002 18.287 633; + 2 0 0 3 0.002 18.671 802.56; + 2 0 0 3 0.002 18.671 802.56; + 2 0 0 3 0.002 18.73 757.5; + 2 0 0 3 0.002 18.693 747.3; +]; + +%% generator unit type (see GENTYPES) +mpc.gentype = { + 'W2'; + 'W2'; + 'W2'; + 'PV'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'GT'; + 'GT'; + 'PV'; + 'PV'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'W2'; + 'ST'; + 'ST'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'HY'; + 'HY'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'PV'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'ST'; + 'ST'; + 'HY'; + 'HY'; + 'HY'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'HY'; + 'ST'; + 'ST'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'W2'; + 'NB'; + 'NB'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'HY'; + 'HY'; + 'ST'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'W2'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'HY'; + 'HY'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'ST'; + 'HY'; + 'HY'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'HY'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'NB'; + 'NB'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'PV'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'PV'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'GT'; + 'GT'; + 'GT'; + 'GT'; + 'ST'; + 'ST'; + 'PV'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'ST'; + 'GT'; + 'ST'; + 'ST'; + 'GT'; + 'GT'; +}; + +%% generator fuel type (see GENFUELS) +mpc.genfuel = { + 'wind'; + 'wind'; + 'wind'; + 'solar'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'ng'; + 'ng'; + 'solar'; + 'solar'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'wind'; + 'coal'; + 'coal'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'hydro'; + 'hydro'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'solar'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'coal'; + 'coal'; + 'hydro'; + 'hydro'; + 'hydro'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'hydro'; + 'coal'; + 'coal'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'wind'; + 'nuclear'; + 'nuclear'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'hydro'; + 'hydro'; + 'coal'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'wind'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'hydro'; + 'hydro'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'coal'; + 'hydro'; + 'hydro'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'hydro'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'nuclear'; + 'nuclear'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'solar'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'solar'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'ng'; + 'ng'; + 'ng'; + 'ng'; + 'coal'; + 'coal'; + 'solar'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'coal'; + 'ng'; + 'coal'; + 'coal'; + 'ng'; + 'ng'; +}; + +%% bus names +mpc.bus_name = { + 'ODESSA 2 0'; + 'PRESIDIO 2 0'; + 'O DONNELL 1 0'; + 'O DONNELL 1 1'; + 'BIG SPRING 5 0'; + 'BIG SPRING 5 1'; + 'VAN HORN 0'; + 'IRAAN 2 0'; + 'IRAAN 2 1'; + 'PRESIDIO 1 0'; + 'PRESIDIO 1 1'; + 'SANDERSON 0'; + 'MONAHANS 2 0'; + 'GRANDFALLS 0'; + 'MARFA 0'; + 'GARDEN CITY 0'; + 'ODESSA 4 0'; + 'NOTREES 0'; + 'MIDLAND 4 0'; + 'BIG SPRING 1 0'; + 'BIG SPRING 1 1'; + 'O DONNELL 2 0'; + 'O DONNELL 2 1'; + 'ODESSA 6 0'; + 'BIG SPRINGS 0'; + 'BIG SPRINGS 1'; + 'MIDLAND 2 0'; + 'COAHOMA 0'; + 'MIDLAND 3 0'; + 'ALPINE 0'; + 'FORT DAVIS 0'; + 'MCCAMEY 1 0'; + 'MCCAMEY 1 1'; + 'BIG SPRING 4 0'; + 'BIG SPRING 4 1'; + 'CRANE 0'; + 'ODESSA 5 0'; + 'FORT STOCKTON 1 0'; + 'FORT STOCKTON 1 1'; + 'ANDREWS 0'; + 'FORSAN 0'; + 'FORSAN 1'; + 'FORSAN 2'; + 'BIG LAKE 0'; + 'MIDLAND 5 0'; + 'OZONA 0'; + 'MONAHANS 1 0'; + 'MONAHANS 1 1'; + 'MONAHANS 1 2'; + 'MONAHANS 1 3'; + 'MONAHANS 1 4'; + 'MONAHANS 1 5'; + 'MONAHANS 1 6'; + 'STANTON 0'; + 'ODONNELL 0'; + 'LENORAH 0'; + 'LENORAH 1'; + 'IRAAN 3 0'; + 'IRAAN 3 1'; + 'IRAAN 3 2'; + 'BIG SPRING 6 0'; + 'BIG SPRING 6 1'; + 'BIG SPRING 6 2'; + 'ODESSA 3 0'; + 'BIG SPRING 3 0'; + 'BIG SPRING 3 1'; + 'BIG SPRING 7 0'; + 'MIDLAND 1 0'; + 'IRAAN 1 0'; + 'IRAAN 1 1'; + 'ODESSA 1 0'; + 'ODESSA 1 1'; + 'ODESSA 1 2'; + 'ODESSA 1 3'; + 'ODESSA 1 4'; + 'ODESSA 1 5'; + 'ODESSA 1 6'; + 'ODESSA 1 7'; + 'ODESSA 1 8'; + 'ODESSA 1 9'; + 'ODESSA 1 10'; + 'FORT STOCKTON 2 0'; + 'FORT STOCKTON 3 0'; + 'BIG SPRING 2 0'; + 'KERMIT 0'; + 'PECOS 0'; + 'SHEFFIELD 0'; + 'MCCAMEY 2 0'; + 'LAMESA 0'; + 'GOLDSMITH 0'; + 'RALLS 2 0'; + 'PARIS 3 0'; + 'SAVOY 0'; + 'SAVOY 1'; + 'SAVOY 2'; + 'SAVOY 3'; + 'SAVOY 4'; + 'HONEY GROVE 0'; + 'MEMPHIS 0'; + 'IOWA PARK 0'; + 'VERNON 2 0'; + 'PANHANDLE 2 0'; + 'PANHANDLE 2 1'; + 'PANHANDLE 2 2'; + 'CHILDRESS 0'; + 'FORESTBURG 0'; + 'SHERMAN 3 0'; + 'PANHANDLE 4 0'; + 'PANHANDLE 4 1'; + 'PANHANDLE 4 2'; + 'WICHITA FALLS 6 0'; + 'PARIS 2 0'; + 'PARIS 2 1'; + 'PARIS 2 2'; + 'PARIS 2 3'; + 'WICHITA FALLS 4 0'; + 'WHEELER 0'; + 'DEPORT 0'; + 'WICHITA FALLS 3 0'; + 'SILVERTON 0'; + 'BONHAM 0'; + 'MATADOR 0'; + 'ARTHUR CITY 0'; + 'LEONARD 0'; + 'GORDONVILLE 0'; + 'KNOX CITY 0'; + 'WICHITA FALLS 7 0'; + 'LINDSAY 0'; + 'ECTOR 0'; + 'SUNSET 0'; + 'CLARKSVILLE 0'; + 'PANHANDLE 3 0'; + 'PANHANDLE 3 1'; + 'SADLER 0'; + 'WHITESBORO 0'; + 'SHEPPARD AFB 0'; + 'POTTSBORO 0'; + 'BELLS 0'; + 'CROSBYTON 0'; + 'ELECTRA 0'; + 'PATTONVILLE 0'; + 'HENRIETTA 0'; + 'PANHANDLE 6 0'; + 'BOWIE 0'; + 'WICHITA FALLS 1 0'; + 'WICHITA FALLS 1 1'; + 'WICHITA FALLS 1 2'; + 'WICHITA FALLS 1 3'; + 'WHITE DEER 0'; + 'WHITE DEER 1'; + 'ROXTON 0'; + 'VERNON 1 0'; + 'VERNON 1 1'; + 'DENISON 2 0'; + 'SUMNER 0'; + 'GAINESVILLE 0'; + 'ASPERMONT 0'; + 'WICHITA FALLS 5 0'; + 'WINDTHORST 0'; + 'HOWE 0'; + 'ARCHER 2 0'; + 'ARCHER 2 1'; + 'COLLINSVILLE 0'; + 'JAYTON 0'; + 'JAYTON 1'; + 'JAYTON 2'; + 'JAYTON 3'; + 'MUENSTER 1 0'; + 'MUENSTER 1 1'; + 'PADUCAH 0'; + 'NOCONA 0'; + 'DODD CITY 0'; + 'WICHITA FALLS 2 0'; + 'WICHITA FALLS 2 1'; + 'WICHITA FALLS 2 2'; + 'WICHITA FALLS 2 3'; + 'MONTAGUE 0'; + 'SPUR 0'; + 'ARCHER 1 0'; + 'ARCHER 1 1'; + 'ANNONA 0'; + 'SEYMOUR 0'; + 'DENISON 1 0'; + 'PANHANDLE 5 0'; + 'PANHANDLE 5 1'; + 'PANHANDLE 5 2'; + 'RALLS 1 0'; + 'RALLS 1 1'; + 'RALLS 1 2'; + 'RALLS 1 3'; + 'RALLS 1 4'; + 'SHERMAN 1 0'; + 'SHERMAN 1 1'; + 'SHERMAN 1 2'; + 'SHERMAN 1 3'; + 'SHERMAN 1 4'; + 'WHITEWRIGHT 0'; + 'SHERMAN 2 0'; + 'ROCHESTER 0'; + 'BURKBURNETT 0'; + 'MUENSTER 2 0'; + 'ARCHER CITY 0'; + 'PETROLIA 0'; + 'PARIS 1 0'; + 'PARIS 1 1'; + 'PARIS 1 2'; + 'PARIS 1 3'; + 'PARIS 1 4'; + 'PARIS 1 5'; + 'PARIS 1 6'; + 'PARIS 1 7'; + 'BAGWELL 0'; + 'TELEPHONE 0'; + 'PANHANDLE 1 0'; + 'VAN ALSTYNE 0'; + 'TIOGA 0'; + 'VALLEY VIEW 0'; + 'MIAMI 0'; + 'MIAMI 1'; + 'TRENTON 0'; + 'HASKELL 0'; + 'HASKELL 1'; + 'HASKELL 2'; + 'SAINT JO 0'; + 'KERRVILLE 0'; + 'KERRVILLE 1'; + 'SWEETWATER 4 0'; + 'SWEETWATER 4 1'; + 'LEAKEY 0'; + 'HAMLIN 0'; + 'MERKEL 3 0'; + 'COLEMAN 0'; + 'SONORA 0'; + 'CAMP WOOD 0'; + 'LLANO 0'; + 'WILLOW CITY 0'; + 'ABILENE 4 0'; + 'KINGSLAND 0'; + 'ROSCOE 6 0'; + 'BLACKWELL 0'; + 'BLACKWELL 1'; + 'CHRISTOVAL 0'; + 'CHRISTOVAL 1'; + 'CHRISTOVAL 2'; + 'LUEDERS 0'; + 'COLORADO CITY 0'; + 'STAMFORD 0'; + 'ELDORADO 0'; + 'SAN SABA 0'; + 'ABILENE 2 0'; + 'ABILENE 2 1'; + 'ABILENE 2 2'; + 'LOMETA 0'; + 'SAN ANGELO 1 0'; + 'TUSCOLA 0'; + 'ABILENE 7 0'; + 'SNYDER 1 0'; + 'SNYDER 1 1'; + 'CHEROKEE 0'; + 'RICHLAND SPRINGS 0'; + 'ROSCOE 2 0'; + 'ROSCOE 2 1'; + 'ROSCOE 2 2'; + 'BALLINGER 0'; + 'SILVER 0'; + 'SILVER 1'; + 'SILVER 2'; + 'SILVER 3'; + 'SILVER 4'; + 'ROSCOE 5 0'; + 'ROSCOE 5 1'; + 'ROSCOE 5 2'; + 'ANSON 0'; + 'DEL RIO 0'; + 'DEL RIO 1'; + 'HUNT 0'; + 'WINGATE 0'; + 'WINGATE 1'; + 'WINGATE 2'; + 'WINGATE 3'; + 'WINGATE 4'; + 'STERLING CITY 1 0'; + 'STERLING CITY 1 1'; + 'STERLING CITY 1 2'; + 'STERLING CITY 1 3'; + 'STERLING CITY 1 4'; + 'STERLING CITY 1 5'; + 'ROSCOE 4 0'; + 'ROSCOE 4 1'; + 'BRADY 0'; + 'TRENT 1 0'; + 'TRENT 1 1'; + 'OVALO 0'; + 'NOLAN 0'; + 'NOLAN 1'; + 'MILES 0'; + 'BRACKETTVILLE 2 0'; + 'BRACKETTVILLE 2 1'; + 'MASON 0'; + 'BRACKETTVILLE 3 0'; + 'ABILENE 6 0'; + 'HERMLEIGH 0'; + 'HERMLEIGH 1'; + 'HERMLEIGH 2'; + 'HERMLEIGH 3'; + 'MERKEL 1 0'; + 'MERKEL 1 1'; + 'MERKEL 1 2'; + 'LORAINE 1 0'; + 'LORAINE 1 1'; + 'LORAINE 1 2'; + 'ABILENE 1 0'; + 'ABILENE 1 1'; + 'ABILENE 1 2'; + 'ABILENE 1 3'; + 'ABILENE 1 4'; + 'ROCKSPRINGS 0'; + 'MERKEL 2 0'; + 'MERKEL 2 1'; + 'FLUVANNA 2 0'; + 'FLUVANNA 2 1'; + 'FLUVANNA 2 2'; + 'DYESS AFB 0'; + 'HAWLEY 0'; + 'BUCHANAN DAM 2 0'; + 'ABILENE 3 0'; + 'SWEETWATER 5 0'; + 'BUCHANAN DAM 1 0'; + 'BUCHANAN DAM 1 1'; + 'BUCHANAN DAM 1 2'; + 'INGRAM 0'; + 'KEMPNER 0'; + 'FLUVANNA 1 0'; + 'FLUVANNA 1 1'; + 'STERLING CITY 2 0'; + 'STERLING CITY 2 1'; + 'STERLING CITY 2 2'; + 'SAN ANGELO 2 0'; + 'ROTAN 0'; + 'SYNDER 0'; + 'SYNDER 1'; + 'SYNDER 2'; + 'BRACKETTVILLE 1 0'; + 'BRACKETTVILLE 1 1'; + 'ROSCOE 1 0'; + 'ROSCOE 1 1'; + 'UVALDE 0'; + 'FREDERICKSBURG 0'; + 'ABILENE 5 0'; + 'SABINAL 0'; + 'SWEETWATER 2 0'; + 'LORAINE 2 0'; + 'ROSCOE 3 0'; + 'SAN ANGELO 3 0'; + 'TUSOCOLA 0'; + 'EDEN 0'; + 'SNYDER 2 0'; + 'SNYDER 2 1'; + 'SNYDER 2 2'; + 'SNYDER 2 3'; + 'SWEETWATER 1 0'; + 'MENARD 0'; + 'WINTERS 0'; + 'GOLDSBORO 0'; + 'SWEETWATER 3 0'; + 'GOODFELLOW AFB 0'; + 'SANTA ANNA 0'; + 'ROWENA 0'; + 'TRENT 2 0'; + 'JUNCTION 0'; + 'LAMPASAS 0'; + 'LAUGHLIN A F B 0'; + 'EDINBURG 3 0'; + 'LAREDO 7 0'; + 'LAREDO 7 1'; + 'BRUNI 2 0'; + 'MCALLEN 2 0'; + 'POTEET 0'; + 'SARITA 3 0'; + 'SARITA 3 1'; + 'HEBBRONVILLE 0'; + 'PROGRESO 0'; + 'EDINBURG 2 0'; + 'EAGLE PASS 0'; + 'EAGLE PASS 1'; + 'CHARLOTTE 0'; + 'CORPUS CHRISTI 4 0'; + 'WOODSBORO 0'; + 'MERCEDES 0'; + 'CORPUS CHRISTI 16 0'; + 'EDCOUCH 0'; + 'ENCINAL 0'; + 'MOORE 0'; + 'CHRISTINE 0'; + 'CHRISTINE 1'; + 'CHRISTINE 2'; + 'MCALLEN 3 0'; + 'FANNIN 0'; + 'FANNIN 1'; + 'FANNIN 2'; + 'SAN YGNACIO 0'; + 'KINGSVILLE 0'; + 'LAREDO 6 0'; + 'HIDALGO 0'; + 'CORPUS CHRISTI 18 0'; + 'CRYSTAL CITY 0'; + 'SINTON 0'; + 'BEEVILLE 0'; + 'MISSION 4 0'; + 'MISSION 4 1'; + 'SAN JUAN 0'; + 'SAN JUAN 1'; + 'FALCON HEIGHTS 2 0'; + 'FALCON HEIGHTS 1 0'; + 'FALCON HEIGHTS 1 1'; + 'FALCON HEIGHTS 1 2'; + 'FALCON HEIGHTS 1 3'; + 'LA JOYA 0'; + 'SEBASTIAN 2 0'; + 'SEBASTIAN 2 1'; + 'BISHOP 0'; + 'BISHOP 1'; + 'ARMSTRONG 2 0'; + 'SKIDMORE 0'; + 'CORPUS CHRISTI 9 0'; + 'GREGORY 0'; + 'GREGORY 1'; + 'GREGORY 2'; + 'GREGORY 3'; + 'GREGORY 4'; + 'GREGORY 5'; + 'GREGORY 6'; + 'GREGORY 7'; + 'CORPUS CHRISTI 2 0'; + 'CORPUS CHRISTI 2 1'; + 'WESLACO 0'; + 'HARLINGEN 1 0'; + 'ELSA 0'; + 'CORPUS CHRISTI 17 0'; + 'BROWNSVILLE 2 0'; + 'BROWNSVILLE 2 1'; + 'CORPUS CHRISTI 10 0'; + 'MISSION 1 0'; + 'MISSION 1 1'; + 'MISSION 1 2'; + 'MISSION 1 3'; + 'MISSION 1 4'; + 'CORPUS CHRISTI 8 0'; + 'MISSION 3 0'; + 'CORPUS CHRISTI 3 0'; + 'CORPUS CHRISTI 3 1'; + 'CORPUS CHRISTI 3 2'; + 'CORPUS CHRISTI 3 3'; + 'CORPUS CHRISTI 3 4'; + 'CORPUS CHRISTI 3 5'; + 'RIO HONDO 0'; + 'CORPUS CHRISTI 5 0'; + 'PHARR 0'; + 'SANTA ROSA 1 0'; + 'SANTA ROSA 1 1'; + 'SANTA ROSA 1 2'; + 'SANTA ROSA 1 3'; + 'SANTA ROSA 1 4'; + 'SANTA ROSA 1 5'; + 'SANTA ROSA 1 6'; + 'SANTA ROSA 1 7'; + 'SANTA ROSA 1 8'; + 'SANTA ROSA 1 9'; + 'ODEM 0'; + 'CORPUS CHRISTI 13 0'; + 'LAREDO 3 0'; + 'OLMITO 0'; + 'EDINBURG 1 0'; + 'TAFT 2 0'; + 'TAFT 2 1'; + 'PORT ISABEL 0'; + 'DONNA 0'; + 'INGLESIDE 0'; + 'CORPUS CHRISTI 11 0'; + 'LOS FRESNOS 0'; + 'HARLINGEN 2 0'; + 'RIVIERA 0'; + 'LAREDO 1 0'; + 'LAREDO 1 1'; + 'LAREDO 1 2'; + 'LAREDO 1 3'; + 'JOURDANTON 0'; + 'GEORGE WEST 0'; + 'ROMA 0'; + 'CORPUS CHRISTI 12 0'; + 'SANTA MARIA 0'; + 'MCALLEN 1 0'; + 'CORPUS CHRISTI 7 0'; + 'FALFURRIAS 0'; + 'PETTUS 0'; + 'BROWNSVILLE 3 0'; + 'ALICE 0'; + 'RIO GRANDE CITY 0'; + 'PREMONT 0'; + 'FREER 0'; + 'PEARSALL 0'; + 'PEARSALL 1'; + 'PEARSALL 2'; + 'PEARSALL 3'; + 'PEARSALL 4'; + 'PEARSALL 5'; + 'PEARSALL 6'; + 'PEARSALL 7'; + 'SANDIA 0'; + 'SARITA 1 0'; + 'SARITA 1 1'; + 'SARITA 1 2'; + 'DILLEY 0'; + 'ORANGE GROVE 0'; + 'PORTLAND 0'; + 'LAREDO 4 0'; + 'LAREDO 4 1'; + 'THREE RIVERS 0'; + 'ROCKPORT 0'; + 'CORPUS CHRISTI 15 0'; + 'ARMSTRONG 1 0'; + 'ARMSTRONG 1 1'; + 'ARMSTRONG 1 2'; + 'PENITAS 0'; + 'SULLIVAN CITY 0'; + 'CORPUS CHRISTI 6 0'; + 'MISSION 2 0'; + 'CORPUS CHRISTI 1 0'; + 'CORPUS CHRISTI 1 1'; + 'CORPUS CHRISTI 1 2'; + 'CORPUS CHRISTI 1 3'; + 'CORPUS CHRISTI 1 4'; + 'CORPUS CHRISTI 1 5'; + 'GRULLA 0'; + 'SARITA 2 0'; + 'SARITA 2 1'; + 'HARGILL 0'; + 'CORPUS CHRISTI 14 0'; + 'MATHIS 0'; + 'ARANSAS PASS 0'; + 'SAN BENITO 0'; + 'PLEASANTON 0'; + 'REFUGIO 0'; + 'LYTLE 0'; + 'LAREDO 2 0'; + 'BRUNI 1 0'; + 'BRUNI 1 1'; + 'GOLIAD 0'; + 'SAN DIEGO 0'; + 'PORT ARANSAS 0'; + 'TAFT 1 0'; + 'TAFT 1 1'; + 'SAN PERLITA 0'; + 'SAN PERLITA 1'; + 'ZAPATA 0'; + 'SANTA ROSA 2 0'; + 'COTULLA 0'; + 'QUEMADO 0'; + 'CARRIZO SPRINGS 0'; + 'LAREDO 5 0'; + 'RAYMONDVILLE 0'; + 'BROWNSVILLE 1 0'; + 'BROWNSVILLE 1 1'; + 'SEBASTIAN 1 0'; + 'OILTON 0'; + 'OILTON 1'; + 'OILTON 2'; + 'GARLAND 5 0'; + 'KERENS 0'; + 'LIPAN 0'; + 'DALLAS 24 0'; + 'DENTON 4 0'; + 'ALBANY 2 0'; + 'DALLAS 21 0'; + 'PLANO 2 0'; + 'THORNTON 0'; + 'DENTON 5 0'; + 'EARLY 0'; + 'DECATUR 0'; + 'KELLER 2 0'; + 'KELLER 2 1'; + 'PONDER 0'; + 'JACKSBORO 1 0'; + 'JACKSBORO 1 1'; + 'JACKSBORO 1 2'; + 'ALEDO 1 0'; + 'ALEDO 1 1'; + 'ALEDO 1 2'; + 'GATESVILLE 4 0'; + 'CLEBURNE 2 0'; + 'FORT WORTH 14 0'; + 'FORT WORTH 23 0'; + 'FORT WORTH 1 0'; + 'TROY 0'; + 'SPRINGTOWN 0'; + 'PRINCETON 0'; + 'DALLAS 27 0'; + 'DALLAS 1 0'; + 'DALLAS 1 1'; + 'DALLAS 1 2'; + 'DALLAS 1 3'; + 'DALLAS 1 4'; + 'DALLAS 1 5'; + 'DALLAS 1 6'; + 'DALLAS 1 7'; + 'DALLAS 1 8'; + 'DALLAS 1 9'; + 'ROYSE CITY 0'; + 'BOYD 0'; + 'STEPHENVILLE 0'; + 'STEPHENVILLE 1'; + 'MANSFIELD 0'; + 'MANSFIELD 1'; + 'GREENVILLE 1 0'; + 'GREENVILLE 1 1'; + 'GREENVILLE 1 2'; + 'GREENVILLE 1 3'; + 'PLANO 4 0'; + 'GROESBECK 0'; + 'GRAHAM 0'; + 'GRAHAM 1'; + 'GRAHAM 2'; + 'GRAHAM 3'; + 'MABANK 2 0'; + 'MABANK 2 1'; + 'MABANK 2 2'; + 'MABANK 2 3'; + 'ARLINGTON 1 0'; + 'ARLINGTON 1 1'; + 'ARLINGTON 1 2'; + 'ARLINGTON 1 3'; + 'ARLINGTON 1 4'; + 'ARLINGTON 1 5'; + 'ARLINGTON 1 6'; + 'DALLAS 41 0'; + 'WACO 3 0'; + 'DALLAS 19 0'; + 'BANGS 0'; + 'PROSPER 0'; + 'EVANT 0'; + 'TERRELL 1 0'; + 'TERRELL 1 1'; + 'AUBREY 0'; + 'WACO 4 0'; + 'LORENA 0'; + 'FORT HOOD 0'; + 'ARLINGTON 5 0'; + 'MCKINNEY 3 0'; + 'MCKINNEY 3 1'; + 'DALLAS 38 0'; + 'ARLINGTON 9 0'; + 'MILFORD 0'; + 'CLIFTON 1 0'; + 'CLIFTON 1 1'; + 'DALLAS 15 0'; + 'FROST 0'; + 'GRANDVIEW 0'; + 'HASLET 0'; + 'BARDWELL 0'; + 'LAKE DALLAS 0'; + 'PLANO 1 0'; + 'EULESS 2 0'; + 'FORT WORTH 24 0'; + 'FLOWER MOUND 2 0'; + 'DALLAS 11 0'; + 'COMANCHE 0'; + 'RICHARDSON 2 0'; + 'RICHARDSON 2 1'; + 'FORT WORTH 8 0'; + 'IRVING 1 0'; + 'IRVING 1 1'; + 'IRVING 1 2'; + 'DALLAS 44 0'; + 'LANCASTER 1 0'; + 'PALO PINTO 2 0'; + 'ADDISON 0'; + 'HICO 0'; + 'KRUM 0'; + 'KAUFMAN 0'; + 'CADDO MILLS 0'; + 'PLANO 7 0'; + 'FORT WORTH 5 0'; + 'BAIRD 0'; + 'PERRIN 0'; + 'BROWNWOOD 0'; + 'BROWNWOOD 1'; + 'DALLAS 6 0'; + 'MARLIN 0'; + 'MARLIN 1'; + 'ARLINGTON 6 0'; + 'DALLAS 8 0'; + 'JONESBORO 0'; + 'DALLAS 33 0'; + 'GOLDTHWAITE 2 0'; + 'PLANO 5 0'; + 'BELTON 0'; + 'BELTON 1'; + 'TOLAR 0'; + 'BRECKENRIDGE 0'; + 'EASTLAND 0'; + 'COOPER 0'; + 'WACO 1 0'; + 'WACO 1 1'; + 'DALLAS 42 0'; + 'GATESVILLE 1 0'; + 'ANNA 0'; + 'MOODY 0'; + 'FORT WORTH 2 0'; + 'WACO 6 0'; + 'GRAND PRAIRIE 1 0'; + 'ROWLETT 2 0'; + 'PLANO 6 0'; + 'IRVING 5 0'; + 'DALLAS 7 0'; + 'BRYSON 2 0'; + 'MORGAN 0'; + 'SACHSE 0'; + 'PARADISE 0'; + 'RIO VISTA 0'; + 'STRAWN 0'; + 'May-00'; + 'DESOTO 0'; + 'MESQUITE 2 0'; + 'ROSEBUD 0'; + 'DENTON 2 0'; + 'DALLAS 4 0'; + 'AXTELL 0'; + 'NOLANVILLE 0'; + 'DENTON 1 0'; + 'DENTON 1 1'; + 'DENTON 1 2'; + 'DENTON 1 3'; + 'DALLAS 39 0'; + 'DUBLIN 1 0'; + 'DUBLIN 1 1'; + 'MERTENS 0'; + 'WEATHERFORD 1 0'; + 'PLANO 3 0'; + 'MALONE 0'; + 'DENTON 3 0'; + 'GRAFORD 0'; + 'ARLINGTON 8 0'; + 'ROCKWALL 1 0'; + 'CORSICANA 2 0'; + 'CORSICANA 2 1'; + 'GARLAND 2 0'; + 'GATESVILLE 2 0'; + 'CARROLLTON 3 0'; + 'FORT WORTH 26 0'; + 'RHOME 0'; + 'VENUS 0'; + 'OLNEY 2 0'; + 'CARROLLTON 1 0'; + 'DALLAS 20 0'; + 'GORDON 0'; + 'MERIDIAN 0'; + 'KILLEEN 4 0'; + 'KILLEEN 4 1'; + 'DUNCANVILLE 1 0'; + 'ARGYLE 0'; + 'BRYSON 1 0'; + 'BRYSON 1 1'; + 'BRYSON 1 2'; + 'FORT WORTH 12 0'; + 'MINERAL WELLS 0'; + 'COOLIDGE 0'; + 'RICE 0'; + 'DALLAS 35 0'; + 'POOLVILLE 0'; + 'POOLVILLE 1'; + 'POOLVILLE 2'; + 'POOLVILLE 3'; + 'POOLVILLE 4'; + 'WALNUT SPRINGS 0'; + 'BEDFORD 2 0'; + 'HUBBARD 0'; + 'FERRIS 0'; + 'GARLAND 4 0'; + 'DALLAS 32 0'; + 'PILOT POINT 0'; + 'FORT WORTH 6 0'; + 'NORTH RICHLAND HILLS 2 0'; + 'JUSTIN 0'; + 'SCURRY 0'; + 'SANGER 0'; + 'KILLEEN 1 0'; + 'MABANK 1 0'; + 'MEXIA 0'; + 'CARROLLTON 2 0'; + 'NEVADA 0'; + 'ZEPHYR 0'; + 'TERRELL 2 0'; + 'DALLAS 14 0'; + 'DALLAS 13 0'; + 'DALLAS 28 0'; + 'HAMILTON 0'; + 'ARLINGTON 7 0'; + 'EULESS 1 0'; + 'FRISCO 1 0'; + 'SALADO 0'; + 'OLNEY 1 0'; + 'OLNEY 1 1'; + 'OLNEY 1 2'; + 'GOLDTHWAITE 1 0'; + 'GOLDTHWAITE 1 1'; + 'GOLDTHWAITE 1 2'; + 'GOLDTHWAITE 1 3'; + 'GOLDTHWAITE 1 4'; + 'FORT WORTH 22 0'; + 'GRAPEVINE 0'; + 'GLEN ROSE 2 0'; + 'KOPPERL 0'; + 'BEDFORD 1 0'; + 'FORT WORTH 29 0'; + 'DALLAS 5 0'; + 'GRAND PRAIRIE 2 0'; + 'DALLAS 22 0'; + 'FLOWER MOUND 1 0'; + 'ROANOKE 0'; + 'MILLSAP 0'; + 'FORRESTON 0'; + 'ITALY 0'; + 'FORNEY 0'; + 'LAVON 0'; + 'GLEN ROSE 1 0'; + 'GLEN ROSE 1 1'; + 'GLEN ROSE 1 2'; + 'GLEN ROSE 1 3'; + 'DE LEON 0'; + 'KELLER 1 0'; + 'CEDAR HILL 0'; + 'MC GREGOR 0'; + 'COMMERCE 0'; + 'MIDLOTHIAN 2 0'; + 'WEST 0'; + 'BARTLETT 0'; + 'DALLAS 16 0'; + 'COPPELL 0'; + 'WILMER 0'; + 'DAWSON 0'; + 'MART 0'; + 'LITTLE ELM 0'; + 'TEMPLE 2 0'; + 'TEMPLE 1 0'; + 'TEMPLE 1 1'; + 'TEMPLE 1 2'; + 'TEMPLE 1 3'; + 'TEMPLE 1 4'; + 'QUINLAN 0'; + 'CHICO 0'; + 'DUBLIN 2 0'; + 'ARLINGTON 2 0'; + 'WOLFE CITY 0'; + 'DALLAS 26 0'; + 'WHITNEY 0'; + 'FORT WORTH 25 0'; + 'FORT WORTH 27 0'; + 'JOSHUA 0'; + 'DALLAS 12 0'; + 'MCKINNEY 1 0'; + 'MCKINNEY 1 1'; + 'MCKINNEY 1 2'; + 'MCKINNEY 1 3'; + 'MCKINNEY 1 4'; + 'MCKINNEY 1 5'; + 'MCKINNEY 1 6'; + 'MCKINNEY 1 7'; + 'MCKINNEY 1 8'; + 'ALLEN 1 0'; + 'ALLEN 1 1'; + 'ALEDO 2 0'; + 'THE COLONY 0'; + 'SUNNYVALE 0'; + 'DALLAS 10 0'; + 'FORT WORTH 4 0'; + 'DALLAS 30 0'; + 'AZLE 0'; + 'HUTCHINS 0'; + 'VALLEY MILLS 0'; + 'DENTON 6 0'; + 'MESQUITE 3 0'; + 'GRANBURY 1 0'; + 'GRANBURY 1 1'; + 'GRANBURY 1 2'; + 'GRANBURY 1 3'; + 'GRANBURY 1 4'; + 'DALLAS 2 0'; + 'DALLAS 2 1'; + 'DALLAS 2 2'; + 'DALLAS 2 3'; + 'DALLAS 2 4'; + 'MOUNT CALM 0'; + 'RIESEL 2 0'; + 'DALLAS 17 0'; + 'ARLINGTON 4 0'; + 'CELINA 0'; + 'FORT WORTH 16 0'; + 'RED OAK 0'; + 'CLYDE 0'; + 'IRVING 2 0'; + 'ROWLETT 1 0'; + 'JACKSBORO 2 0'; + 'GRANBURY 3 0'; + 'SOUTHLAKE 0'; + 'DALLAS 29 0'; + 'LEWISVILLE 1 0'; + 'LEWISVILLE 1 1'; + 'LEWISVILLE 1 2'; + 'DALLAS 36 0'; + 'HILLSBORO 0'; + 'FORT WORTH 15 0'; + 'CISCO 0'; + 'ITASCA 0'; + 'LANCASTER 2 0'; + 'GARLAND 1 0'; + 'GARLAND 1 1'; + 'DALLAS 9 0'; + 'DUNCANVILLE 2 0'; + 'MESQUITE 1 0'; + 'MAYPEARL 0'; + 'GARLAND 3 0'; + 'ALLEN 2 0'; + 'RIESEL 1 0'; + 'RIESEL 1 1'; + 'RIESEL 1 2'; + 'BRIDGEPORT 0'; + 'BRIDGEPORT 1'; + 'BRIDGEPORT 2'; + 'BRIDGEPORT 3'; + 'BRIDGEPORT 4'; + 'BRIDGEPORT 5'; + 'BRIDGEPORT 6'; + 'BRIDGEPORT 7'; + 'BRIDGEPORT 8'; + 'LEWISVILLE 2 0'; + 'SEAGOVILLE 0'; + 'DALLAS 31 0'; + 'HALTOM CITY 0'; + 'BALCH SPRINGS 0'; + 'FORT WORTH 13 0'; + 'DALLAS 43 0'; + 'KILLEEN 2 0'; + 'WACO 5 0'; + 'FORT WORTH 9 0'; + 'ENNIS 0'; + 'ENNIS 1'; + 'ENNIS 2'; + 'ENNIS 3'; + 'DALLAS 3 0'; + 'DALLAS 3 1'; + 'RICHARDSON 1 0'; + 'FORT WORTH 21 0'; + 'WACO 2 0'; + 'WACO 2 1'; + 'ROGERS 0'; + 'ROGERS 1'; + 'ROGERS 2'; + 'CHINA SPRING 0'; + 'ALBANY 1 0'; + 'ALBANY 1 1'; + 'ALBANY 1 2'; + 'ALBANY 1 3'; + 'ALBANY 1 4'; + 'ALBANY 1 5'; + 'MCKINNEY 2 0'; + 'GRANBURY 2 0'; + 'GRANBURY 2 1'; + 'GRANBURY 2 2'; + 'GRANBURY 2 3'; + 'GRANBURY 2 4'; + 'GRANBURY 2 5'; + 'CLIFTON 2 0'; + 'FARMERSVILLE 0'; + 'ARLINGTON 10 0'; + 'KILLEEN 3 0'; + 'KILLEEN 3 1'; + 'WYLIE 0'; + 'PALO PINTO 1 0'; + 'PALO PINTO 1 1'; + 'PALO PINTO 1 2'; + 'PALO PINTO 1 3'; + 'PALO PINTO 1 4'; + 'PALO PINTO 1 5'; + 'PALO PINTO 1 6'; + 'FORT WORTH 10 0'; + 'JOSEPHINE 0'; + 'LEWSIVILLE 0'; + 'LEWSIVILLE 1'; + 'LEWSIVILLE 2'; + 'DALLAS 40 0'; + 'KEMP 0'; + 'WAXAHACHIE 2 0'; + 'HURST 0'; + 'FORT WORTH 18 0'; + 'WEATHERFORD 2 0'; + 'ROCKWALL 2 0'; + 'WEATHERFORD 3 0'; + 'FORT WORTH 3 0'; + 'NEWARK 0'; + 'SANTO 0'; + 'DALLAS 18 0'; + 'ELM MOTT 0'; + 'FORT WORTH 17 0'; + 'WAXAHACHIE 1 0'; + 'ARLINGTON 3 0'; + 'FORT WORTH 20 0'; + 'FORT WORTH 7 0'; + 'FORT WORTH 11 0'; + 'MIDLOTHIAN 1 0'; + 'MIDLOTHIAN 1 1'; + 'HEWITT 0'; + 'ARLINGTON 11 0'; + 'GRAND PRAIRIE 3 0'; + 'GRAND PRAIRIE 3 1'; + 'MELISSA 0'; + 'COPPERAS COVE 0'; + 'COPPERAS COVE 1'; + 'CLEBURNE 1 0'; + 'GREENVILLE 2 0'; + 'ALVORD 0'; + 'GORMAN 0'; + 'COLLEYVILLE 0'; + 'HOLLAND 0'; + 'HOLLAND 1'; + 'HOLLAND 2'; + 'TEMPLE 3 0'; + 'DALLAS 34 0'; + 'IRVING 4 0'; + 'FRISCO 2 0'; + 'FRISCO 2 1'; + 'GATESVILLE 3 0'; + 'DALLAS 25 0'; + 'DALLAS 37 0'; + 'FORT WORTH 19 0'; + 'WOODWAY 0'; + 'MINGUS 0'; + 'THROCKMORTON 0'; + 'NEMO 0'; + 'ABBOTT 0'; + 'ALVARADO 0'; + 'CORSICANA 1 0'; + 'HARKER HEIGHTS 0'; + 'IRVING 3 0'; + 'BURLESON 0'; + 'BURLESON 1'; + 'FORT WORTH 28 0'; + 'DALLAS 23 0'; + 'NORTH RICHLAND HILLS 1 0'; + 'CROSS PLAINS 0'; + 'BLOOMING GROVE 0'; + 'CONVERSE 0'; + 'SAN ANTONIO 46 0'; + 'BASTROP 0'; + 'BASTROP 1'; + 'BASTROP 2'; + 'BASTROP 3'; + 'BASTROP 4'; + 'BASTROP 5'; + 'BASTROP 6'; + 'BASTROP 7'; + 'MARION 2 0'; + 'PAIGE 0'; + 'SAN ANTONIO 42 0'; + 'WAELDER 0'; + 'ATASCOSA 0'; + 'SAN ANTONIO 40 0'; + 'CIBOLO 0'; + 'AUSTIN 6 0'; + 'AUSTIN 25 0'; + 'HORSESHOE BAY 0'; + 'LEANDER 1 0'; + 'LEANDER 1 1'; + 'LEANDER 1 2'; + 'AUSTIN 10 0'; + 'SAN ANTONIO 31 0'; + 'SAN ANTONIO 49 0'; + 'ELGIN 0'; + 'AUSTIN 31 0'; + 'RUNGE 0'; + 'YOAKUM 0'; + 'YOAKUM 1'; + 'AUSTIN 37 0'; + 'PFLUGERVILLE 0'; + 'PFLUGERVILLE 1'; + 'PFLUGERVILLE 2'; + 'SAN ANTONIO 12 0'; + 'SAN ANTONIO 12 1'; + 'AUSTIN 3 0'; + 'AUSTIN 3 1'; + 'AUSTIN 3 2'; + 'AUSTIN 3 3'; + 'AUSTIN 3 4'; + 'SAN ANTONIO 48 0'; + 'SAN ANTONIO 19 0'; + 'SAN ANTONIO 2 0'; + 'SAN ANTONIO 2 1'; + 'SAN ANTONIO 2 2'; + 'SAN ANTONIO 2 3'; + 'SAN ANTONIO 2 4'; + 'SAN ANTONIO 2 5'; + 'SAN ANTONIO 2 6'; + 'SAN ANTONIO 2 7'; + 'SAN ANTONIO 2 8'; + 'SAN ANTONIO 2 9'; + 'BERGHEIM 0'; + 'NEW BRAUNFELS 2 0'; + 'NEW BRAUNFELS 2 1'; + 'NEW BRAUNFELS 2 2'; + 'D HANIS 0'; + 'SAN ANTONIO 24 0'; + 'AUSTIN 7 0'; + 'BRENHAM 0'; + 'BRENHAM 1'; + 'BRENHAM 2'; + 'BERTRAM 0'; + 'MARION 1 0'; + 'MARION 1 1'; + 'MARION 1 2'; + 'MARION 1 3'; + 'MARION 1 4'; + 'MARION 1 5'; + 'MARION 1 6'; + 'MARION 1 7'; + 'MARION 1 8'; + 'LA GRANGE 0'; + 'LA GRANGE 1'; + 'LA GRANGE 2'; + 'LA GRANGE 3'; + 'LA GRANGE 4'; + 'LA GRANGE 5'; + 'MARBLE FALLS 1 0'; + 'MARBLE FALLS 1 1'; + 'MARBLE FALLS 1 2'; + 'ROUND ROCK 1 0'; + 'ROUND ROCK 1 1'; + 'ROUND ROCK 1 2'; + 'ROUND ROCK 1 3'; + 'ROUND ROCK 1 4'; + 'ROUND ROCK 1 5'; + 'ROUND ROCK 1 6'; + 'WIMBERLEY 0'; + 'GONZALES 0'; + 'SAN ANTONIO 11 0'; + 'SAN ANTONIO 14 0'; + 'HUTTO 0'; + 'LULING 0'; + 'SAN ANTONIO 21 0'; + 'AUSTIN 12 0'; + 'SAN ANTONIO 15 0'; + 'ADKINS 0'; + 'WINCHESTER 0'; + 'WINCHESTER 1'; + 'WINCHESTER 2'; + 'WINCHESTER 3'; + 'WINCHESTER 4'; + 'WINCHESTER 5'; + 'ROCKDALE 1 0'; + 'ROCKDALE 1 1'; + 'ROCKDALE 1 2'; + 'ROCKDALE 1 3'; + 'ROCKDALE 1 4'; + 'NATALIA 0'; + 'AUSTIN 20 0'; + 'SAN ANTONIO 43 0'; + 'SAN ANTONIO 5 0'; + 'TAYLOR 0'; + 'SMITHVILLE 0'; + 'CEDAR PARK 0'; + 'CEDAR PARK 1'; + 'CEDAR PARK 2'; + 'SAN ANTONIO 25 0'; + 'HALLETTSVILLE 0'; + 'AUSTIN 5 0'; + 'NEW BRAUNFELS 3 0'; + 'SUTHERLAND SPRINGS 0'; + 'AUSTIN 34 0'; + 'CAMERON 0'; + 'SAN ANTONIO 35 0'; + 'MEDINA 0'; + 'MANCHACA 0'; + 'SPRING BRANCH 0'; + 'AUSTIN 19 0'; + 'FLATONIA 0'; + 'GRANGER 0'; + 'FAYETTEVILLE 0'; + 'GEORGETOWN 2 0'; + 'AUSTIN 35 0'; + 'PIPE CREEK 0'; + 'RED ROCK 0'; + 'JARRELL 0'; + 'SAN ANTONIO 1 0'; + 'SAN ANTONIO 1 1'; + 'SAN ANTONIO 1 2'; + 'SAN ANTONIO 1 3'; + 'SAN ANTONIO 1 4'; + 'SAN ANTONIO 1 5'; + 'SAN ANTONIO 1 6'; + 'SAN ANTONIO 1 7'; + 'SAN ANTONIO 1 8'; + 'SAN ANTONIO 36 0'; + 'SCHULENBURG 0'; + 'SAN ANTONIO 22 0'; + 'SAN ANTONIO 22 1'; + 'DRIPPING SPRINGS 0'; + 'SAN ANTONIO 26 0'; + 'MARBLE FALLS 3 0'; + 'BOERNE 1 0'; + 'WASHINGTON 0'; + 'SCHERTZ 0'; + 'AUSTIN 8 0'; + 'SEGUIN 1 0'; + 'SEGUIN 1 1'; + 'SEGUIN 1 2'; + 'SEGUIN 1 3'; + 'SEGUIN 1 4'; + 'SEGUIN 1 5'; + 'SEGUIN 1 6'; + 'SAN ANTONIO 45 0'; + 'SAN ANTONIO 52 0'; + 'SAN ANTONIO 52 1'; + 'SAN ANTONIO 52 2'; + 'CUERO 2 0'; + 'CUERO 2 1'; + 'SAN ANTONIO 10 0'; + 'AUSTIN 16 0'; + 'AUSTIN 39 0'; + 'SAN ANTONIO 51 0'; + 'SAN ANTONIO 51 1'; + 'SAN ANTONIO 41 0'; + 'LA VERNIA 0'; + 'MANOR 0'; + 'SAN ANTONIO 38 0'; + 'GIDDINGS 0'; + 'AUSTIN 32 0'; + 'AUSTIN 38 0'; + 'AUSTIN 30 0'; + 'AUSTIN 28 0'; + 'COLUMBUS 0'; + 'COLUMBUS 1'; + 'SHINER 0'; + 'SAN ANTONIO 3 0'; + 'CALDWELL 0'; + 'CALDWELL 1'; + 'AUSTIN 18 0'; + 'INDUSTRY 0'; + 'DALE 0'; + 'SAN ANTONIO 37 0'; + 'SAN ANTONIO 37 1'; + 'SAN ANTONIO 37 2'; + 'SAN ANTONIO 18 0'; + 'SAN ANTONIO 33 0'; + 'MARTINDALE 0'; + 'SAN ANTONIO 17 0'; + 'SAN ANTONIO 23 0'; + 'AUSTIN 29 0'; + 'LEXINGTON 0'; + 'LEANDER 2 0'; + 'AUSTIN 15 0'; + 'MICO 0'; + 'MARBLE FALLS 2 0'; + 'MARBLE FALLS 2 1'; + 'MARBLE FALLS 2 2'; + 'MARBLE FALLS 2 3'; + 'MARBLE FALLS 2 4'; + 'MARBLE FALLS 2 5'; + 'MARBLE FALLS 2 6'; + 'AUSTIN 36 0'; + 'LOCKHART 0'; + 'AUSTIN 17 0'; + 'SAN ANTONIO 13 0'; + 'FALLS CITY 0'; + 'AUSTIN 27 0'; + 'AUSTIN 27 1'; + 'AUSTIN 23 0'; + 'SAN ANTONIO 27 0'; + 'BLANCO 0'; + 'AUSTIN 24 0'; + 'SAN MARCOS 0'; + 'SAN MARCOS 1'; + 'SAN MARCOS 2'; + 'BUDA 0'; + 'DEL VALLE 0'; + 'AUSTIN 4 0'; + 'SAN ANTONIO 50 0'; + 'SAN ANTONIO 50 1'; + 'SAN ANTONIO 50 2'; + 'BURLINGTON 0'; + 'AUSTIN 13 0'; + 'ELMENDORF 0'; + 'ELMENDORF 1'; + 'ELMENDORF 2'; + 'ELMENDORF 3'; + 'ELMENDORF 4'; + 'ELMENDORF 5'; + 'ELMENDORF 6'; + 'ELMENDORF 7'; + 'ELMENDORF 8'; + 'ELMENDORF 9'; + 'ELMENDORF 10'; + 'SAN ANTONIO 6 0'; + 'CANYON LAKE 0'; + 'JOHNSON CITY 0'; + 'YORKTOWN 0'; + 'AUSTIN 2 0'; + 'AUSTIN 2 1'; + 'AUSTIN 2 2'; + 'AUSTIN 2 3'; + 'AUSTIN 2 4'; + 'AUSTIN 2 5'; + 'AUSTIN 2 6'; + 'LACKLAND A F B 0'; + 'LIBERTY HILL 0'; + 'KENEDY 0'; + 'KENEDY 1'; + 'CUERO 1 0'; + 'CUERO 1 1'; + 'CUERO 1 2'; + 'CUERO 1 3'; + 'CUERO 1 4'; + 'CUERO 1 5'; + 'CUERO 1 6'; + 'CUERO 1 7'; + 'CUERO 1 8'; + 'CUERO 1 9'; + 'SAN ANTONIO 20 0'; + 'VON ORMY 0'; + 'KYLE 0'; + 'KYLE 1'; + 'SEGUIN 2 0'; + 'SEGUIN 2 1'; + 'UNIVERSAL CITY 0'; + 'SPICEWOOD 0'; + 'SAINT HEDWIG 0'; + 'SAN ANTONIO 16 0'; + 'BOERNE 2 0'; + 'BOERNE 2 1'; + 'SAN ANTONIO 32 0'; + 'SAN ANTONIO 32 1'; + 'AUSTIN 26 0'; + 'AUSTIN 21 0'; + 'SAN ANTONIO 44 0'; + 'CEDAR CREEK 1 0'; + 'CEDAR CREEK 1 1'; + 'CEDAR CREEK 1 2'; + 'CEDAR CREEK 1 3'; + 'CEDAR CREEK 1 4'; + 'CEDAR CREEK 1 5'; + 'NEW BRAUNFELS 1 0'; + 'NEW BRAUNFELS 1 1'; + 'NEW BRAUNFELS 1 2'; + 'NEW BRAUNFELS 1 3'; + 'NEW BRAUNFELS 1 4'; + 'NEW BRAUNFELS 1 5'; + 'NEW BRAUNFELS 1 6'; + 'NEW BRAUNFELS 1 7'; + 'AUSTIN 11 0'; + 'SAN ANTONIO 39 0'; + 'HONDO 0'; + 'HONDO 1'; + 'SAN ANTONIO 4 0'; + 'NEW ULM 0'; + 'SAN ANTONIO 8 0'; + 'AUSTIN 33 0'; + 'BULVERDE 0'; + 'GEORGETOWN 3 0'; + 'GEORGETOWN 3 1'; + 'GEORGETOWN 3 2'; + 'GEORGETOWN 3 3'; + 'GEORGETOWN 3 4'; + 'SAN ANTONIO 9 0'; + 'FLORESVILLE 0'; + 'FLORESVILLE 1'; + 'SAN ANTONIO 29 0'; + 'SAN ANTONIO 7 0'; + 'BUCKHOLTS 0'; + 'SOMERVILLE 0'; + 'WEIMAR 0'; + 'COMFORT 0'; + 'NORDHEIM 0'; + 'AUSTIN 9 0'; + 'AUSTIN 22 0'; + 'HELOTES 0'; + 'SAN ANTONIO 47 0'; + 'SAN ANTONIO 47 1'; + 'SAN ANTONIO 47 2'; + 'BANDERA 0'; + 'SAN ANTONIO 30 0'; + 'ROCKDALE 2 0'; + 'CEDAR CREEK 2 0'; + 'NIXON 0'; + 'CHAPPELL HILL 0'; + 'ROUND ROCK 3 0'; + 'ROUND ROCK 3 1'; + 'ROUND ROCK 3 2'; + 'AUSTIN 14 0'; + 'LEMING 0'; + 'AUSTIN 1 0'; + 'AUSTIN 1 1'; + 'AUSTIN 1 2'; + 'SAN ANTONIO 28 0'; + 'ROUND ROCK 2 0'; + 'ROUND ROCK 4 0'; + 'ROUND ROCK 4 1'; + 'SAN ANTONIO 34 0'; + 'DEVINE 0'; + 'GEORGETOWN 1 0'; + 'BURNET 0'; + 'BURNET 1'; + 'INEZ 0'; + 'PASADENA 2 0'; + 'PASADENA 2 1'; + 'PASADENA 2 2'; + 'PASADENA 2 3'; + 'PASADENA 2 4'; + 'PASADENA 2 5'; + 'PASADENA 2 6'; + 'PASADENA 2 7'; + 'PRAIRIE VIEW 0'; + 'CONROE 1 0'; + 'SIMONTON 0'; + 'HOUSTON 80 0'; + 'HOUSTON 1 0'; + 'HOUSTON 1 1'; + 'HOUSTON 9 0'; + 'HOUSTON 73 0'; + 'NURSERY 0'; + 'NURSERY 1'; + 'NURSERY 2'; + 'NURSERY 3'; + 'NURSERY 4'; + 'NURSERY 5'; + 'NURSERY 6'; + 'NURSERY 7'; + 'BACLIFF 0'; + 'SPRING 1 0'; + 'HOUSTON 72 0'; + 'PORT LAVACA 0'; + 'PORT LAVACA 1'; + 'PORT LAVACA 2'; + 'PORT LAVACA 3'; + 'PORT LAVACA 4'; + 'PORT LAVACA 5'; + 'CONROE 5 0'; + 'CONROE 5 1'; + 'SUGAR LAND 3 0'; + 'SUGAR LAND 3 1'; + 'SUGAR LAND 3 2'; + 'DAYTON 0'; + 'DAYTON 1'; + 'VICTORIA 2 0'; + 'VICTORIA 2 1'; + 'VICTORIA 2 2'; + 'VICTORIA 2 3'; + 'VICTORIA 2 4'; + 'KATY 1 0'; + 'KATY 1 1'; + 'KATY 1 2'; + 'MAGNOLIA 2 0'; + 'HOUSTON 29 0'; + 'MISSOURI CITY 1 0'; + 'RICHMOND 1 0'; + 'HOUSTON 11 0'; + 'HOUSTON 33 0'; + 'SPRING 8 0'; + 'SPRING 8 1'; + 'POINT COMFORT 2 0'; + 'POINT COMFORT 2 1'; + 'POINT COMFORT 2 2'; + 'POINT COMFORT 2 3'; + 'POINT COMFORT 2 4'; + 'POINT COMFORT 2 5'; + 'POINT COMFORT 2 6'; + 'POINT COMFORT 2 7'; + 'POINT COMFORT 2 8'; + 'HOUSTON 28 0'; + 'EL CAMPO 0'; + 'EL CAMPO 1'; + 'HOUSTON 12 0'; + 'PORT O CONNOR 0'; + 'DICKINSON 0'; + 'GALVESTON 1 0'; + 'GALVESTON 1 1'; + 'HOUSTON 10 0'; + 'BAYTOWN 2 0'; + 'BAYTOWN 2 1'; + 'BAYTOWN 2 2'; + 'BAYTOWN 2 3'; + 'BAYTOWN 2 4'; + 'BAYTOWN 2 5'; + 'BAYTOWN 2 6'; + 'LEAGUE CITY 0'; + 'LEAGUE CITY 1'; + 'LIVERPOOL 0'; + 'HOUSTON 16 0'; + 'SUGAR LAND 1 0'; + 'RICHMOND 2 0'; + 'HOUSTON 82 0'; + 'PINEHURST 0'; + 'PEARLAND 2 0'; + 'HOUSTON 47 0'; + 'HOUSTON 79 0'; + 'HOUSTON 49 0'; + 'WADSWORTH 0'; + 'WADSWORTH 1'; + 'WADSWORTH 2'; + 'WADSWORTH 3'; + 'WADSWORTH 4'; + 'HOUSTON 18 0'; + 'HOUSTON 88 0'; + 'TOMBALL 1 0'; + 'HOUSTON 22 0'; + 'DEER PARK 0'; + 'DEER PARK 1'; + 'DEER PARK 2'; + 'DEER PARK 3'; + 'DEER PARK 4'; + 'DEER PARK 5'; + 'DEER PARK 6'; + 'DEER PARK 7'; + 'DEER PARK 8'; + 'DEER PARK 9'; + 'DEER PARK 10'; + 'DEER PARK 11'; + 'WALLIS 0'; + 'HOUSTON 67 0'; + 'SPRING 4 0'; + 'SOUTH HOUSTON 0'; + 'HOUSTON 3 0'; + 'HOUSTON 3 1'; + 'HOUSTON 3 2'; + 'SEADRIFT 0'; + 'HOUSTON 34 0'; + 'SUGAR LAND 2 0'; + 'SUGAR LAND 2 1'; + 'SUGAR LAND 2 2'; + 'CONROE 7 0'; + 'LOLITA 0'; + 'LAPORTE 0'; + 'LAPORTE 1'; + 'LAPORTE 2'; + 'LAPORTE 3'; + 'LAPORTE 4'; + 'LAPORTE 5'; + 'LAPORTE 6'; + 'LAPORTE 7'; + 'LAPORTE 8'; + 'LAPORTE 9'; + 'LAPORTE 10'; + 'LAPORTE 11'; + 'LAPORTE 12'; + 'NEW CANEY 0'; + 'HOUSTON 14 0'; + 'HOUSTON 2 0'; + 'HOUSTON 2 1'; + 'HOUSTON 78 0'; + 'HOUSTON 40 0'; + 'BLOOMINGTON 0'; + 'WILLIS 2 0'; + 'WILLIS 2 1'; + 'HOUSTON 51 0'; + 'PALACIOS 0'; + 'CONROE 4 0'; + 'HOUSTON 52 0'; + 'SPRING 2 0'; + 'SPRING 2 1'; + 'KINGWOOD 1 0'; + 'HOUSTON 5 0'; + 'HOUSTON 5 1'; + 'HOUSTON 5 2'; + 'HOUSTON 5 3'; + 'HOUSTON 5 4'; + 'HOUSTON 5 5'; + 'HOUSTON 5 6'; + 'HOUSTON 5 7'; + 'HOUSTON 5 8'; + 'HOUSTON 5 9'; + 'HOUSTON 5 10'; + 'HOUSTON 5 11'; + 'TEXAS CITY 1 0'; + 'TEXAS CITY 1 1'; + 'KINGWOOD 2 0'; + 'HOUSTON 8 0'; + 'SPRING 7 0'; + 'SPRING 7 1'; + 'SPRING 7 2'; + 'HOUSTON 41 0'; + 'FRESNO 0'; + 'HOUSTON 48 0'; + 'HOUSTON 58 0'; + 'PATTISON 0'; + 'HOUSTON 77 0'; + 'MISSOURI CITY 2 0'; + 'MISSOURI CITY 2 1'; + 'HOUSTON 4 0'; + 'HOUSTON 4 1'; + 'HOUSTON 4 2'; + 'HOUSTON 4 3'; + 'HOUSTON 4 4'; + 'HOUSTON 4 5'; + 'HOUSTON 4 6'; + 'HOUSTON 4 7'; + 'HOUSTON 4 8'; + 'HOUSTON 4 9'; + 'HOUSTON 4 10'; + 'HOUSTON 4 11'; + 'TOMBALL 2 0'; + 'CYPRESS 1 0'; + 'CYPRESS 1 1'; + 'CYPRESS 1 2'; + 'HEMPSTEAD 0'; + 'WEST COLUMBIA 0'; + 'BAYTOWN 1 0'; + 'BAYTOWN 1 1'; + 'BAYTOWN 1 2'; + 'BAYTOWN 1 3'; + 'BAYTOWN 1 4'; + 'BAYTOWN 1 5'; + 'BAYTOWN 1 6'; + 'BAYTOWN 1 7'; + 'BAYTOWN 1 8'; + 'SANTA FE 1 0'; + 'HOUSTON 27 0'; + 'SPRING 5 0'; + 'HOUSTON 46 0'; + 'HOUSTON 23 0'; + 'MONTGOMERY 0'; + 'HUNGERFORD 0'; + 'HOUSTON 84 0'; + 'HOUSTON 83 0'; + 'HOUSTON 24 0'; + 'HOUSTON 76 0'; + 'HOUSTON 43 0'; + 'HOUSTON 81 0'; + 'HOUSTON 35 0'; + 'HOUSTON 90 0'; + 'HOUSTON 90 1'; + 'HOUSTON 90 2'; + 'BEASLEY 0'; + 'HOUSTON 7 0'; + 'LA MARQUE 0'; + 'WALLER 0'; + 'PORTER 0'; + 'CYPRESS 2 0'; + 'HOUSTON 30 0'; + 'FULSHEAR 0'; + 'LIBERTY 0'; + 'WINNIE 0'; + 'HOUSTON 63 0'; + 'HOUSTON 70 0'; + 'HOUSTON 55 0'; + 'CROSBY 0'; + 'MANVEL 0'; + 'HOUSTON 54 0'; + 'HOUSTON 89 0'; + 'DAMON 0'; + 'HOUSTON 74 0'; + 'HOUSTON 26 0'; + 'HOUSTON 32 0'; + 'HOCKLEY 0'; + 'ANGLETON 0'; + 'ANGLETON 1'; + 'CONROE 3 0'; + 'HOUSTON 39 0'; + 'HOUSTON 59 0'; + 'PEARLAND 1 0'; + 'HOUSTON 56 0'; + 'HOUSTON 13 0'; + 'CHANNELVIEW 2 0'; + 'BAY CITY 0'; + 'BAY CITY 1'; + 'PASADENA 3 0'; + 'PASADENA 3 1'; + 'PASADENA 3 2'; + 'PASADENA 3 3'; + 'PASADENA 3 4'; + 'PASADENA 3 5'; + 'PASADENA 3 6'; + 'PASADENA 3 7'; + 'BROOKSHIRE 0'; + 'HOUSTON 25 0'; + 'TEXAS CITY 2 0'; + 'VICTORIA 3 0'; + 'VICTORIA 3 1'; + 'HOUSTON 36 0'; + 'GANADO 0'; + 'MONT BELVIEU 0'; + 'MONT BELVIEU 1'; + 'MONT BELVIEU 2'; + 'MONT BELVIEU 3'; + 'BAYTOWN 3 0'; + 'BAYTOWN 3 1'; + 'BAYTOWN 3 2'; + 'BAYTOWN 3 3'; + 'BAYTOWN 3 4'; + 'BAYTOWN 3 5'; + 'BAYTOWN 3 6'; + 'BAYTOWN 3 7'; + 'SPRING 6 0'; + 'HUMBLE 2 0'; + 'HOUSTON 69 0'; + 'SANTA FE 2 0'; + 'PORT BOLIVAR 0'; + 'HOUSTON 42 0'; + 'HOUSTON 85 0'; + 'HOUSTON 50 0'; + 'HOUSTON 62 0'; + 'EAGLE LAKE 0'; + 'CONROE 2 0'; + 'WEBSTER 0'; + 'SWEENY 0'; + 'BLESSING 0'; + 'WHARTON 1 0'; + 'WHARTON 1 1'; + 'WHARTON 1 2'; + 'WHARTON 1 3'; + 'WHARTON 1 4'; + 'WHARTON 1 5'; + 'WHARTON 1 6'; + 'WHARTON 1 7'; + 'LAKE JACKSON 0'; + 'LAKE JACKSON 1'; + 'BELLVILLE 0'; + 'KATY 4 0'; + 'HOUSTON 38 0'; + 'FRIENDSWOOD 0'; + 'HOUSTON 17 0'; + 'HOUSTON 66 0'; + 'FREEPORT 1 0'; + 'FREEPORT 1 1'; + 'FREEPORT 1 2'; + 'FREEPORT 1 3'; + 'FREEPORT 1 4'; + 'FREEPORT 1 5'; + 'FREEPORT 1 6'; + 'NEWGULF 0'; + 'NEWGULF 1'; + 'NEWGULF 2'; + 'HOUSTON 60 0'; + 'PASADENA 1 0'; + 'PASADENA 1 1'; + 'PASADENA 1 2'; + 'PASADENA 1 3'; + 'PASADENA 1 4'; + 'STAFFORD 0'; + 'EDNA 0'; + 'HOUSTON 21 0'; + 'NEEDVILLE 0'; + 'SEALY 0'; + 'KATY 3 0'; + 'KATY 3 1'; + 'KATY 3 2'; + 'HOUSTON 37 0'; + 'HOUSTON 19 0'; + 'THOMPSONS 0'; + 'THOMPSONS 1'; + 'THOMPSONS 2'; + 'THOMPSONS 3'; + 'THOMPSONS 4'; + 'THOMPSONS 5'; + 'THOMPSONS 6'; + 'THOMPSONS 7'; + 'THOMPSONS 8'; + 'THOMPSONS 9'; + 'THOMPSONS 10'; + 'THOMPSONS 11'; + 'THOMPSONS 12'; + 'THOMPSONS 13'; + 'THOMPSONS 14'; + 'THOMPSONS 15'; + 'HOUSTON 61 0'; + 'GALVESTON 3 0'; + 'EAST BERNARD 0'; + 'HOUSTON 20 0'; + 'CHANNELVIEW 1 0'; + 'CHANNELVIEW 1 1'; + 'CHANNELVIEW 1 2'; + 'CHANNELVIEW 1 3'; + 'CHANNELVIEW 1 4'; + 'CHANNELVIEW 1 5'; + 'CHANNELVIEW 1 6'; + 'CHANNELVIEW 1 7'; + 'CHANNELVIEW 1 8'; + 'CHANNELVIEW 1 9'; + 'CHANNELVIEW 1 10'; + 'CHANNELVIEW 1 11'; + 'CHANNELVIEW 1 12'; + 'CHANNELVIEW 1 13'; + 'FREEPORT 3 0'; + 'HOUSTON 15 0'; + 'HOUSTON 31 0'; + 'ROSHARON 0'; + 'HOUSTON 44 0'; + 'HOUSTON 75 0'; + 'HOUSTON 71 0'; + 'HUMBLE 1 0'; + 'HOUSTON 68 0'; + 'WILLIS 1 0'; + 'WILLIS 1 1'; + 'WILLIS 1 2'; + 'BAYTOWN 4 0'; + 'VAN VLECK 0'; + 'HUFFMAN 0'; + 'HOUSTON 53 0'; + 'HOUSTON 91 0'; + 'ROSENBERG 0'; + 'PASADENA 5 0'; + 'HOUSTON 45 0'; + 'HOUSTON 6 0'; + 'HOUSTON 6 1'; + 'HOUSTON 6 2'; + 'PASADENA 4 0'; + 'HOUSTON 57 0'; + 'GALVESTON 2 0'; + 'POINT COMFORT 1 0'; + 'POINT COMFORT 1 1'; + 'POINT COMFORT 1 2'; + 'KATY 2 0'; + 'KATY 2 1'; + 'SPRING 3 0'; + 'DANBURY 0'; + 'WHARTON 2 0'; + 'VICTORIA 1 0'; + 'VICTORIA 1 1'; + 'VICTORIA 1 2'; + 'HOUSTON 64 0'; + 'HOUSTON 65 0'; + 'LA PORTE 0'; + 'MAGNOLIA 1 0'; + 'MAGNOLIA 1 1'; + 'ALVIN 0'; + 'ALVIN 1'; + 'ALVIN 2'; + 'HOUSTON 86 0'; + 'BRAZORIA 0'; + 'HOUSTON 87 0'; + 'FREEPORT 2 0'; + 'FREEPORT 2 1'; + 'FREEPORT 2 2'; + 'CONROE 6 0'; + 'MADISONVILLE 0'; + 'NORMANGEE 0'; + 'ARP 0'; + 'CENTERVILLE 0'; + 'LUFKIN 3 0'; + 'LUFKIN 3 1'; + 'FLINT 0'; + 'BULLARD 0'; + 'CHANDLER 0'; + 'PLANTERSVILLE 0'; + 'MARQUEZ 0'; + 'TENNESSEE COLONY 0'; + 'ANDERSON 0'; + 'MINEOLA 0'; + 'LOVELADY 0'; + 'HUNTINGTON 0'; + 'BRYAN 4 0'; + 'FRANKSTON 0'; + 'TYLER 4 0'; + 'TYLER 4 1'; + 'BEN WHEELER 0'; + 'GARRISON 0'; + 'ETOILE 0'; + 'LUFKIN 1 0'; + 'LUFKIN 1 1'; + 'PALESTINE 1 0'; + 'LINDALE 0'; + 'WHITEHOUSE 0'; + 'OVERTON 0'; + 'GRAND SALINE 0'; + 'SHIRO 0'; + 'SHIRO 1'; + 'SHIRO 2'; + 'SHIRO 3'; + 'SHIRO 4'; + 'SHIRO 5'; + 'SHIRO 6'; + 'MIDWAY 0'; + 'SULPHUR SPRINGS 0'; + 'VAN 0'; + 'MURCHISON 0'; + 'NACOGDOCHES 2 0'; + 'DIBOLL 0'; + 'FAIRFIELD 1 0'; + 'FAIRFIELD 1 1'; + 'FAIRFIELD 1 2'; + 'FAIRFIELD 1 3'; + 'FAIRFIELD 1 4'; + 'FAIRFIELD 1 5'; + 'FAIRFIELD 1 6'; + 'FAIRFIELD 1 7'; + 'FAIRFIELD 1 8'; + 'TYLER 8 0'; + 'ATHENS 1 0'; + 'BUFFALO 0'; + 'RUSK 0'; + 'WINONA 0'; + 'FAIRFIELD 2 0'; + 'FAIRFIELD 2 1'; + 'FAIRFIELD 2 2'; + 'FAIRFIELD 2 3'; + 'FAIRFIELD 2 4'; + 'CUSHING 2 0'; + 'NACOGDOCHES 3 0'; + 'FAIRFIELD 3 0'; + 'TRINIDAD 2 0'; + 'DIKE 0'; + 'JEWETT 1 0'; + 'JEWETT 1 1'; + 'JEWETT 1 2'; + 'JEWETT 1 3'; + 'JEWETT 1 4'; + 'PALESTINE 2 0'; + 'EMORY 0'; + 'MT. ENTERPRISE 0'; + 'MT. ENTERPRISE 1'; + 'MT. ENTERPRISE 2'; + 'MT. ENTERPRISE 3'; + 'MT. ENTERPRISE 4'; + 'MT. ENTERPRISE 5'; + 'MT. ENTERPRISE 6'; + 'TYLER 9 0'; + 'FRANKLIN 0'; + 'FRANKLIN 1'; + 'FRANKLIN 2'; + 'FRANKLIN 3'; + 'FRANKLIN 4'; + 'FRANKLIN 5'; + 'FRANKLIN 6'; + 'TYLER 3 0'; + 'ELKHART 0'; + 'WORTHAM 0'; + 'OAKWOOD 0'; + 'COOKVILLE 0'; + 'COLLEGE STATION 1 0'; + 'COLLEGE STATION 1 1'; + 'EDGEWOOD 0'; + 'CUSHING 1 0'; + 'CUSHING 1 1'; + 'CUSHING 1 2'; + 'TYLER 2 0'; + 'ALTO 0'; + 'CALVERT 0'; + 'JEWETT 2 0'; + 'NAVASOTA 0'; + 'MOUNT PLEASANT 2 0'; + 'MOUNT PLEASANT 2 1'; + 'SCROGGINS 0'; + 'WILLS POINT 0'; + 'ATHENS 2 0'; + 'POINT 0'; + 'LUFKIN 2 0'; + 'JACKSONVILLE 1 0'; + 'JACKSONVILLE 1 1'; + 'JACKSONVILLE 1 2'; + 'JACKSONVILLE 1 3'; + 'JACKSONVILLE 1 4'; + 'JACKSONVILLE 1 5'; + 'CROCKETT 0'; + 'HENDERSON 1 0'; + 'BRYAN 3 0'; + 'JACKSONVILLE 2 0'; + 'BRYAN 5 0'; + 'MALAKOFF 0'; + 'CUMBY 0'; + 'NACOGDOCHES 1 0'; + 'MOUNT PLEASANT 1 0'; + 'MOUNT PLEASANT 1 1'; + 'MOUNT PLEASANT 1 2'; + 'MOUNT PLEASANT 1 3'; + 'MOUNT PLEASANT 1 4'; + 'MOUNT PLEASANT 1 5'; + 'TEAGUE 0'; + 'TYLER 7 0'; + 'TYLER 7 1'; + 'TYLER 6 0'; + 'YANTIS 0'; + 'POLLOK 0'; + 'TYLER 1 0'; + 'COLLEGE STATION 2 0'; + 'COLLEGE STATION 2 1'; + 'HEARNE 0'; + 'MOUNT VERNON 0'; + 'IOLA 0'; + 'STREETMAN 0'; + 'COMO 0'; + 'HENDERSON 2 0'; + 'TRINIDAD 1 0'; + 'TRINIDAD 1 1'; + 'TRINIDAD 1 2'; + 'ZAVALLA 0'; + 'GRAPELAND 0'; + 'BRYAN 2 0'; + 'CANTON 0'; + 'TYLER 5 0'; + 'BREMOND 0'; + 'BREMOND 1'; + 'BREMOND 2'; + 'BRYAN 1 0'; + 'BRYAN 1 1'; + 'BRYAN 1 2'; +}; diff --git a/cases/PhasorDynamics/ACTIVSg2000/README.md b/cases/PhasorDynamics/ACTIVSg2000/README.md index 2cb2f212d6..8f8742a726 100644 --- a/cases/PhasorDynamics/ACTIVSg2000/README.md +++ b/cases/PhasorDynamics/ACTIVSg2000/README.md @@ -24,4 +24,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/ACTIVSg2000/README.md). +`ACTIVSg2000.m` is MATPOWER `case_ACTIVSg2000`[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). + [^1]: Texas A&M University, [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg2000/). +[^2]: MATPOWER, [`case_ACTIVSg2000.m`](https://github.com/MATPOWER/matpower/blob/master/data/case_ACTIVSg2000.m). diff --git a/cases/PhasorDynamics/Hawaii/Hawaii.m b/cases/PhasorDynamics/Hawaii/Hawaii.m new file mode 100644 index 0000000000..67ae07caae --- /dev/null +++ b/cases/PhasorDynamics/Hawaii/Hawaii.m @@ -0,0 +1,375 @@ +% Case saved by PowerWorld Simulator, version 23, build date August 27, 2023 +function mpc = Hawaii40_20231026 +mpc.version = '2'; +mpc.baseMVA = 100.00; + +%% bus data +mpc.bus = [ +1 1 0.00 0.00 0.00 0.00 1 0.9935453 -1.119907 138.00 1 1.100 0.900 5.22 0.00 0 0 +2 2 60.70 0.00 0.00 0.00 1 0.9912250 -3.927372 69.00 1 1.100 0.900 5.25 0.00 0 0 +3 1 59.39 0.00 0.00 0.00 1 0.9845477 -4.731145 69.00 1 1.100 0.900 5.71 -0.03 0 0 +4 1 22.47 0.00 0.00 0.00 1 0.9787999 -5.745870 69.00 1 1.100 0.900 5.42 -0.01 0 0 +5 1 0.00 0.00 0.00 0.00 1 0.9889847 -2.069792 138.00 1 1.100 0.900 5.28 0.00 0 0 +6 1 27.46 0.00 0.00 0.00 1 0.9812064 -5.528160 69.00 1 1.100 0.900 5.49 -0.00 0 0 +7 1 37.01 0.00 0.00 0.00 1 0.9805826 -5.671337 69.00 1 1.100 0.900 5.48 -0.00 0 0 +8 1 65.10 0.00 0.00 0.00 1 0.9786187 -5.702381 69.00 1 1.100 0.900 5.75 -0.03 0 0 +9 1 0.00 0.00 0.00 0.00 1 0.9867678 -2.548359 138.00 1 1.100 0.900 5.31 -0.00 0 0 +10 1 37.76 0.00 0.00 0.00 1 0.9809410 -5.651960 69.00 1 1.100 0.900 5.47 0.00 0 0 +11 1 65.55 0.00 0.00 0.00 1 0.9749115 -6.522955 69.00 1 1.100 0.900 5.50 0.00 0 0 +12 1 54.01 0.00 0.00 0.00 1 0.9773269 -6.198354 69.00 1 1.100 0.900 5.51 -0.00 0 0 +13 1 59.24 0.00 0.00 0.00 1 0.9789530 -6.094816 69.00 1 1.100 0.900 5.49 -0.00 0 0 +14 1 0.00 0.00 0.00 0.00 1 0.9837641 -3.136205 138.00 1 1.100 0.900 5.35 -0.00 0 0 +15 1 60.90 0.00 0.00 0.00 1 0.9786311 -6.029763 69.00 1 1.100 0.900 5.51 0.01 0 0 +16 1 23.83 0.00 0.00 32.00 1 0.9821866 -6.456032 69.00 1 1.100 0.900 5.56 -0.01 0 0 +17 1 12.04 0.00 0.00 0.00 1 0.9754957 -6.981904 69.00 1 1.100 0.900 5.53 -0.01 0 0 +18 1 36.32 0.00 0.00 0.00 1 0.9759604 -7.121150 69.00 1 1.100 0.900 5.55 -0.01 0 0 +19 1 48.60 0.00 0.00 0.00 1 0.9913040 -3.514221 69.00 1 1.100 0.900 5.89 -0.04 0 0 +20 1 64.95 0.00 0.00 0.00 1 0.9896603 -1.963951 69.00 1 1.100 0.900 7.07 -0.18 0 0 +21 1 48.34 0.00 0.00 0.00 1 0.9799422 -5.268157 69.00 1 1.100 0.900 5.54 -0.01 0 0 +22 1 0.00 0.00 0.00 0.00 1 0.9963974 -0.844548 138.00 1 1.100 0.900 5.19 0.00 0 0 +23 3 86.75 0.00 0.00 0.00 1 1.0000000 -2.106015 69.00 1 1.100 0.900 5.10 0.00 0 0 +24 1 46.58 0.00 0.00 0.00 1 0.9934020 -3.706851 69.00 1 1.100 0.900 4.59 -0.05 0 0 +25 1 0.00 0.00 0.00 0.00 1 0.9966141 -0.528763 138.00 1 1.100 0.900 5.20 0.00 0 0 +26 2 75.28 0.00 0.00 0.00 1 0.9951046 -3.596866 69.00 1 1.100 0.900 4.93 -0.02 0 0 +27 2 3.95 0.00 0.00 0.00 1 1.0034164 1.362694 69.00 1 1.100 0.900 7.78 -0.10 0 0 +28 2 8.82 0.00 0.00 0.00 1 1.0000000 0.234055 69.00 1 1.100 0.900 0.00 0.00 0 0 +29 1 7.70 0.00 0.00 0.00 1 0.9953834 -0.097274 69.00 1 1.100 0.900 7.84 -0.12 0 0 +30 1 49.03 0.00 0.00 0.00 1 0.9957983 -0.422344 69.00 1 1.100 0.900 8.14 -0.10 0 0 +31 1 9.62 0.00 0.00 0.00 1 0.9952150 -2.101776 69.00 1 1.100 0.900 2.58 0.08 0 0 +32 1 6.67 0.00 0.00 0.00 1 0.9912167 -1.321157 69.00 1 1.100 0.900 7.37 -0.16 0 0 +33 2 58.22 0.00 0.00 0.00 1 0.9956520 -3.050368 69.00 1 1.100 0.900 4.14 -0.01 0 0 +34 2 0.00 0.00 0.00 0.00 1 1.0000000 -2.084231 69.00 1 1.100 0.900 4.62 0.00 0 0 +35 2 0.00 0.00 0.00 0.00 1 1.0000000 0.376390 138.00 1 1.100 0.900 5.20 0.00 0 0 +36 2 0.00 0.00 0.00 0.00 1 0.9965724 -3.565242 69.00 1 1.100 0.900 4.59 -0.05 0 0 +37 2 0.00 0.00 0.00 0.00 1 1.0000000 0.251430 138.00 1 1.100 0.900 5.20 0.00 0 0 +]; + +%% generator data +mpc.gen = [ +2 2.50 0.80 0.80 -0.50 1.0000 2.80 1 2.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +2 2.50 0.80 0.80 -0.50 1.0000 2.80 1 2.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +2 2.50 0.80 0.80 -0.50 1.0000 2.80 1 2.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +2 2.50 0.80 0.80 -0.50 1.0000 2.80 1 2.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 69.27 0.04 23.30 -14.00 1.0000 85.60 1 77.80 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 39.13 0.04 13.80 -8.30 1.0000 50.50 1 45.90 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 69.27 0.04 23.30 -14.00 1.0000 85.60 1 77.80 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 47.64 0.04 15.60 -9.40 1.0000 57.10 1 51.90 23.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 47.11 0.04 15.50 -9.30 1.0000 57.00 1 51.80 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 44.53 0.04 15.40 -9.20 1.0000 56.30 1 51.20 6.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 44.53 0.04 15.40 -9.20 1.0000 56.30 1 51.20 6.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 43.61 0.04 14.30 -8.60 1.0000 52.50 1 47.70 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 43.19 0.04 14.20 -8.50 1.0000 51.90 1 47.20 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +23 12.53 0.04 4.40 -2.60 1.0000 16.20 1 14.70 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +26 20.00 6.00 6.00 -3.60 1.0000 22.00 1 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +26 10.20 3.10 3.10 -1.90 1.0000 11.20 1 10.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +27 30.00 -5.40 9.00 -5.40 1.0000 33.00 1 30.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +27 27.60 -5.00 8.30 -5.00 1.0000 30.40 1 27.60 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +28 46.30 -5.49 14.70 -8.80 1.0000 53.90 1 49.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +28 69.00 -5.49 20.70 -12.40 1.0000 75.90 1 69.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +33 27.60 8.30 8.30 -5.00 1.0000 30.40 1 27.60 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 7.22 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 6.04 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 6.04 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 6.04 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 6.01 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +34 7.22 -0.98 2.50 -1.50 1.0000 9.20 1 8.40 2.50 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 58.00 0.05 17.40 -10.40 1.0000 63.80 1 58.00 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 28.00 0.05 8.40 -5.00 1.0000 30.80 1 28.00 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 0.00 0.00 54.00 -32.40 1.0000 198.00 0 180.00 63.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 20.00 0.05 6.00 -3.60 1.0000 22.00 1 20.00 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 67.00 0.05 25.50 -15.30 1.0000 93.50 1 85.00 40.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 0.00 0.00 25.50 -15.30 1.0000 93.50 0 85.00 40.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 50.00 0.05 15.00 -9.00 1.0000 55.00 1 50.00 10.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +35 56.20 0.05 33.90 -20.30 1.0000 124.30 1 113.00 42.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +36 2.00 1.00 1.00 -0.60 1.0000 3.50 1 3.20 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +36 2.10 1.00 1.00 -0.60 1.0000 3.50 1 3.20 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +36 2.00 1.00 1.00 -0.60 1.0000 3.50 1 3.20 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +36 2.48 1.00 1.00 -0.60 1.0000 3.50 1 3.20 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 0.00 0.00 38.60 -23.20 1.0000 141.60 0 128.70 45.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 0.00 0.00 38.40 -23.00 1.0000 140.90 0 128.10 55.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 58.32 5.63 26.20 -15.70 1.0000 95.90 1 87.20 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 0.00 0.00 24.60 -14.80 1.0000 90.30 0 82.10 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 68.48 5.63 23.40 -14.00 1.0000 85.90 1 78.10 30.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +37 0.00 0.00 23.40 -14.00 1.0000 85.70 0 77.90 20.00 0.00 0.00 0.00 0.00 0.00 0.00 0 0 0 0 0.0000 0 0 0 0 +]; + +%% generator cost data +mpc.gencost = [ +2 0 0 4 0.0000 0.003 4.570 0.00 +2 0 0 4 0.0000 0.002 4.570 0.00 +2 0 0 4 0.0000 0.002 4.570 0.00 +2 0 0 4 0.0000 0.002 4.570 0.00 +2 0 0 4 0.0000 0.004 4.680 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.005 4.680 0.00 +2 0 0 4 0.0000 0.004 4.640 0.00 +2 0 0 4 0.0000 0.004 4.640 0.00 +2 0 0 4 0.0000 0.003 4.640 0.00 +2 0 0 4 0.0000 0.003 4.640 0.00 +2 0 0 4 0.0000 0.003 4.640 0.00 +2 0 0 4 0.0000 0.005 4.630 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.000 0.000 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.004 4.580 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.004 4.580 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.004 4.650 0.00 +2 0 0 4 0.0000 0.004 4.610 0.00 +2 0 0 4 0.0000 0.007 4.810 0.00 +2 0 0 4 0.0000 0.003 4.600 0.00 +2 0 0 4 0.0000 0.004 4.690 0.00 +2 0 0 4 0.0000 0.005 4.690 0.00 +2 0 0 4 0.0000 0.004 4.640 0.00 +2 0 0 4 0.0000 0.004 4.720 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.002 4.580 0.00 +2 0 0 4 0.0000 0.003 4.580 0.00 +2 0 0 4 0.0000 0.002 4.580 0.00 +2 0 0 4 0.0000 0.006 4.740 0.00 +2 0 0 4 0.0000 0.006 4.740 0.00 +2 0 0 4 0.0000 0.005 4.690 0.00 +2 0 0 4 0.0000 0.005 4.680 0.00 +2 0 0 4 0.0000 0.004 4.680 0.00 +2 0 0 4 0.0000 0.005 4.680 0.00 +]; + +%% branch data +mpc.branch = [ +1 2 0.004840 0.123766 0.00000 123.20 123.20 123.20 1.00000 0.000 1 0.00 0.00 39.02 1.29 -38.95 0.62 0 0 0 0 +1 2 0.004840 0.123766 0.00000 123.20 123.20 123.20 1.00000 0.000 1 0.00 0.00 39.02 1.29 -38.95 0.62 0 0 0 0 +1 2 0.004840 0.123766 0.00000 123.20 123.20 123.20 1.00000 0.000 1 0.00 0.00 39.02 1.29 -38.95 0.62 0 0 0 0 +1 5 0.003400 0.020913 0.00846 232.80 232.80 232.80 0.00000 0.000 1 0.00 0.00 79.42 8.98 -79.20 -8.46 0 0 0 0 +1 5 0.003400 0.020913 0.00846 232.80 232.80 232.80 0.00000 0.000 1 0.00 0.00 79.42 8.98 -79.20 -8.46 0 0 0 0 +1 22 0.003740 0.024173 0.00605 177.80 177.80 177.80 0.00000 0.000 1 0.00 0.00 -20.99 -8.73 21.01 8.25 0 0 0 0 +1 25 0.002890 0.015798 0.00771 217.00 217.00 217.00 0.00000 0.000 1 0.00 0.00 -65.93 -7.29 66.06 7.23 0 0 0 0 +1 25 0.002890 0.015798 0.00771 217.00 217.00 217.00 0.00000 0.000 1 0.00 0.00 -65.93 -7.29 66.06 7.23 0 0 0 0 +1 35 0.010800 0.041922 0.01284 281.60 281.60 281.60 0.00000 0.000 1 0.00 0.00 -61.53 0.73 61.95 -0.40 0 0 0 0 +1 35 0.010800 0.041922 0.01284 281.60 281.60 281.60 0.00000 0.000 1 0.00 0.00 -61.53 0.73 61.95 -0.40 0 0 0 0 +2 4 0.042960 0.079357 0.00257 66.80 66.80 66.80 0.00000 0.000 1 0.00 0.00 36.76 -3.89 -36.16 4.74 0 0 0 0 +2 6 0.026890 0.058600 0.00312 82.00 82.00 82.00 0.00000 0.000 1 0.00 0.00 44.97 -3.19 -44.41 4.10 0 0 0 0 +2 6 0.026890 0.058600 0.00312 82.00 82.00 82.00 0.00000 0.000 1 0.00 0.00 44.97 -3.19 -44.41 4.10 0 0 0 0 +2 7 0.027540 0.075691 0.00377 77.80 77.80 77.80 0.00000 0.000 1 0.00 0.00 39.18 0.09 -38.75 0.73 0 0 0 0 +2 21 0.036460 0.077337 0.00173 94.80 94.80 94.80 0.00000 0.000 1 0.00 0.00 29.76 0.69 -29.43 -0.16 0 0 0 0 +2 23 0.032620 0.081030 0.00180 101.30 101.30 101.30 0.00000 0.000 1 0.00 0.00 -36.96 4.68 37.42 -3.71 0 0 0 0 +2 23 0.032620 0.081030 0.00180 101.30 101.30 101.30 0.00000 0.000 1 0.00 0.00 -36.96 4.68 37.42 -3.71 0 0 0 0 +2 23 0.032620 0.081030 0.00180 101.30 101.30 101.30 0.00000 0.000 1 0.00 0.00 -36.96 4.68 37.42 -3.71 0 0 0 0 +2 26 0.030490 0.066116 0.00186 61.70 61.70 61.70 0.00000 0.000 1 0.00 0.00 -9.30 -1.59 9.33 1.47 0 0 0 0 +2 26 0.030490 0.066116 0.00186 61.70 61.70 61.70 0.00000 0.000 1 0.00 0.00 -9.30 -1.59 9.33 1.47 0 0 0 0 +3 6 0.014780 0.036690 0.00104 85.00 85.00 85.00 0.00000 0.000 1 0.00 0.00 34.71 -4.81 -34.52 5.18 0 0 0 0 +3 6 0.014780 0.036690 0.00104 85.00 85.00 85.00 0.00000 0.000 1 0.00 0.00 34.71 -4.81 -34.52 5.18 0 0 0 0 +3 16 0.023830 0.063585 0.00504 82.80 82.80 82.80 0.00000 0.000 1 0.00 0.00 41.57 -11.48 -41.11 12.21 0 0 0 0 +3 19 0.013820 0.031229 0.00541 91.60 91.60 91.60 0.00000 0.000 1 0.00 0.00 -63.13 7.08 63.70 -6.30 0 0 0 0 +3 19 0.013820 0.031229 0.00541 91.60 91.60 91.60 0.00000 0.000 1 0.00 0.00 -63.13 7.08 63.70 -6.30 0 0 0 0 +3 19 0.013820 0.031229 0.00541 91.60 91.60 91.60 0.00000 0.000 1 0.00 0.00 -63.13 7.08 63.70 -6.30 0 0 0 0 +3 21 0.024230 0.047508 0.00152 49.00 49.00 49.00 0.00000 0.000 1 0.00 0.00 19.00 -0.13 -18.91 0.16 0 0 0 0 +4 13 0.012140 0.038486 0.00170 53.20 53.20 53.20 0.00000 0.000 1 0.00 0.00 13.69 -4.74 -13.67 4.66 0 0 0 0 +5 6 0.004790 0.139559 0.00000 198.00 198.00 198.00 1.00000 0.000 1 0.00 0.00 42.13 5.33 -42.04 -2.76 0 0 0 0 +5 9 0.002290 0.012058 0.00409 170.70 170.70 170.70 0.00000 0.000 1 0.00 0.00 68.63 5.23 -68.52 -5.05 0 0 0 0 +5 14 0.005740 0.038815 0.00687 162.50 162.50 162.50 0.00000 0.000 1 0.00 0.00 47.64 6.35 -47.50 -6.10 0 0 0 0 +7 6 0.004000 0.010000 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 -22.83 3.00 22.85 -3.03 0 0 0 0 +7 6 0.004000 0.010000 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 -22.83 3.00 22.85 -3.03 0 0 0 0 +7 6 0.004000 0.010000 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 -22.83 3.00 22.85 -3.03 0 0 0 0 +6 11 0.019800 0.042395 0.00097 89.00 89.00 89.00 0.00000 0.000 1 0.00 0.00 37.88 -2.83 -37.58 3.37 0 0 0 0 +6 12 0.013640 0.033191 0.00066 58.80 58.80 58.80 0.00000 0.000 1 0.00 0.00 33.01 -1.93 -32.86 2.25 0 0 0 0 +6 12 0.013640 0.033191 0.00066 58.80 58.80 58.80 0.00000 0.000 1 0.00 0.00 33.01 -1.93 -32.86 2.25 0 0 0 0 +7 10 0.004000 0.010000 0.00096 50.00 50.00 50.00 0.00000 0.000 1 0.00 0.00 -4.02 -1.95 4.02 1.86 0 0 0 0 +7 13 0.009410 0.027706 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 24.74 -2.59 -24.68 2.67 0 0 0 0 +7 13 0.009410 0.027706 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 24.74 -2.59 -24.68 2.67 0 0 0 0 +7 13 0.009410 0.027706 0.00096 40.20 40.20 40.20 0.00000 0.000 1 0.00 0.00 24.74 -2.59 -24.68 2.67 0 0 0 0 +8 15 0.031390 0.075848 0.00197 84.90 84.90 84.90 0.00000 0.000 1 0.00 0.00 6.16 -2.64 -6.15 2.49 0 0 0 0 +8 19 0.036990 0.102463 0.00246 90.00 90.00 90.00 0.00000 0.000 1 0.00 0.00 -35.63 1.32 36.12 -0.20 0 0 0 0 +8 19 0.036990 0.102463 0.00246 90.00 90.00 90.00 0.00000 0.000 1 0.00 0.00 -35.63 1.32 36.12 -0.20 0 0 0 0 +9 10 0.004680 0.125654 0.00000 56.20 56.20 56.20 1.00000 0.000 1 0.00 0.00 41.86 4.15 -41.78 -1.86 0 0 0 0 +9 14 0.009330 0.037848 0.01017 169.30 169.30 169.30 0.00000 0.000 1 0.00 0.00 26.66 0.90 -26.59 -1.61 0 0 0 0 +11 13 0.018440 0.047771 0.00224 45.30 45.30 45.30 0.00000 0.000 1 0.00 0.00 -15.74 -2.22 15.79 2.13 0 0 0 0 +11 15 0.023280 0.069221 0.00152 48.60 48.60 48.60 0.00000 0.000 1 0.00 0.00 -12.23 -1.15 12.26 1.11 0 0 0 0 +12 15 0.015110 0.041464 0.00414 77.00 77.00 77.00 0.00000 0.000 1 0.00 0.00 -6.98 -0.72 6.99 0.34 0 0 0 0 +12 17 0.022780 0.065341 0.00282 49.90 49.90 49.90 0.00000 0.000 1 0.00 0.00 18.68 -3.77 -18.60 3.75 0 0 0 0 +13 16 0.013090 0.032547 0.00110 52.00 52.00 52.00 0.00000 0.000 1 0.00 0.00 12.68 -14.82 -12.63 14.84 0 0 0 0 +14 15 0.003250 0.131522 0.00000 85.90 85.90 85.90 1.00000 0.000 1 0.00 0.00 37.05 3.86 -37.00 -1.97 0 0 0 0 +14 15 0.003250 0.131522 0.00000 85.90 85.90 85.90 1.00000 0.000 1 0.00 0.00 37.05 3.86 -37.00 -1.97 0 0 0 0 +16 18 0.015530 0.039228 0.00191 51.70 51.70 51.70 0.00000 0.000 1 0.00 0.00 29.91 3.82 -29.77 -3.63 0 0 0 0 +17 18 0.009840 0.029754 0.00145 47.90 47.90 47.90 0.00000 0.000 1 0.00 0.00 6.56 -3.75 -6.55 3.63 0 0 0 0 +19 23 0.012580 0.030449 0.00133 100.30 100.30 100.30 0.00000 0.000 1 0.00 0.00 -77.99 4.83 78.77 -3.07 0 0 0 0 +19 23 0.012580 0.030449 0.00133 100.30 100.30 100.30 0.00000 0.000 1 0.00 0.00 -77.99 4.83 78.77 -3.07 0 0 0 0 +19 23 0.012580 0.030449 0.00133 100.30 100.30 100.30 0.00000 0.000 1 0.00 0.00 -77.99 4.83 78.77 -3.07 0 0 0 0 +19 23 0.012580 0.030449 0.00133 100.30 100.30 100.30 0.00000 0.000 1 0.00 0.00 -77.99 4.83 78.77 -3.07 0 0 0 0 +20 23 0.042660 0.074844 0.00179 85.80 85.80 85.80 0.00000 0.000 1 0.00 0.00 -3.41 -11.81 3.47 11.75 0 0 0 0 +20 30 0.027800 0.068487 0.00300 64.40 64.40 64.40 0.00000 0.000 1 0.00 0.00 -36.15 6.18 36.53 -5.53 0 0 0 0 +20 32 0.014940 0.039916 0.00335 52.00 52.00 52.00 0.00000 0.000 1 0.00 0.00 -25.40 5.64 25.50 -5.69 0 0 0 0 +22 23 0.004450 0.116580 0.00000 149.60 149.60 149.60 1.00000 0.000 1 0.00 0.00 18.68 -3.58 -18.66 4.01 0 0 0 0 +22 23 0.004450 0.116580 0.00000 149.60 149.60 149.60 1.00000 0.000 1 0.00 0.00 18.68 -3.58 -18.66 4.01 0 0 0 0 +22 23 0.004450 0.116580 0.00000 149.60 149.60 149.60 1.00000 0.000 1 0.00 0.00 18.68 -3.58 -18.66 4.01 0 0 0 0 +22 25 0.002980 0.017679 0.00775 277.00 277.00 277.00 0.00000 0.000 1 0.00 0.00 -30.29 3.58 30.32 -4.19 0 0 0 0 +22 37 0.006820 0.040841 0.01104 292.90 292.90 292.90 0.00000 0.000 1 0.00 0.00 -46.75 -1.08 46.90 0.88 0 0 0 0 +23 34 0.030140 0.091720 0.00193 74.40 74.40 74.40 0.00000 0.000 1 0.00 0.00 -0.37 0.03 0.37 -0.22 0 0 0 0 +23 34 0.030140 0.091720 0.00193 74.40 74.40 74.40 0.00000 0.000 1 0.00 0.00 -0.37 0.03 0.37 -0.22 0 0 0 0 +24 26 0.016450 0.053480 0.00135 65.60 65.60 65.60 0.00000 0.000 1 0.00 0.00 -4.13 -1.96 4.13 1.83 0 0 0 0 +24 26 0.016450 0.053480 0.00135 65.60 65.60 65.60 0.00000 0.000 1 0.00 0.00 -4.13 -1.96 4.13 1.83 0 0 0 0 +24 33 0.016900 0.033191 0.01102 69.50 69.50 69.50 0.00000 0.000 1 0.00 0.00 -29.76 8.07 29.92 -8.84 0 0 0 0 +24 36 0.018930 0.037551 0.00194 48.70 48.70 48.70 0.00000 0.000 1 0.00 0.00 -8.56 -4.16 8.58 4.00 0 0 0 0 +25 26 0.005320 0.147265 0.00000 131.70 131.70 131.70 1.00000 0.000 1 0.00 0.00 36.07 0.68 -36.00 1.25 0 0 0 0 +25 26 0.005320 0.147265 0.00000 131.70 131.70 131.70 1.00000 0.000 1 0.00 0.00 36.07 0.68 -36.00 1.25 0 0 0 0 +25 35 0.004130 0.024420 0.00685 201.40 201.40 201.40 0.00000 0.000 1 0.00 0.00 -64.87 -2.68 65.04 3.03 0 0 0 0 +25 35 0.004130 0.024420 0.00685 201.40 201.40 201.40 0.00000 0.000 1 0.00 0.00 -64.87 -2.68 65.04 3.03 0 0 0 0 +25 37 0.004890 0.026145 0.00780 224.00 224.00 224.00 0.00000 0.000 1 0.00 0.00 -52.42 -3.14 52.55 3.08 0 0 0 0 +25 37 0.004890 0.026145 0.00780 224.00 224.00 224.00 0.00000 0.000 1 0.00 0.00 -52.42 -3.14 52.55 3.08 0 0 0 0 +27 29 0.023880 0.042832 0.00128 67.50 67.50 67.50 0.00000 0.000 1 0.00 0.00 53.65 -10.40 -52.94 11.54 0 0 0 0 +28 30 0.011200 0.031396 0.00433 70.00 70.00 70.00 0.00000 0.000 1 0.00 0.00 36.53 0.34 -36.39 -0.35 0 0 0 0 +28 30 0.011200 0.031396 0.00433 70.00 70.00 70.00 0.00000 0.000 1 0.00 0.00 36.53 0.34 -36.39 -0.35 0 0 0 0 +28 31 0.051070 0.104683 0.01435 58.30 58.30 58.30 0.00000 0.000 1 0.00 0.00 33.41 -11.66 -32.78 11.52 0 0 0 0 +29 30 0.014790 0.036656 0.00188 49.30 49.30 49.30 0.00000 0.000 1 0.00 0.00 12.82 -6.35 -12.79 6.24 0 0 0 0 +29 32 0.023150 0.061347 0.00173 60.00 60.00 60.00 0.00000 0.000 1 0.00 0.00 32.42 -5.19 -32.17 5.69 0 0 0 0 +31 33 0.026960 0.057612 0.00333 38.00 38.00 38.00 0.00000 0.000 1 0.00 0.00 23.16 -11.52 -22.98 11.58 0 0 0 0 +33 34 0.035280 0.083927 0.00256 84.30 84.30 84.30 0.00000 0.000 1 0.00 0.00 -18.78 2.78 18.91 -2.73 0 0 0 0 +33 34 0.035280 0.083927 0.00256 84.30 84.30 84.30 0.00000 0.000 1 0.00 0.00 -18.78 2.78 18.91 -2.73 0 0 0 0 +35 37 0.001520 0.008374 0.00809 297.60 297.60 297.60 0.00000 0.000 1 0.00 0.00 25.22 -4.95 -25.21 4.20 0 0 0 0 +]; + +%% bus names +mpc.bus_name = { +'ALOHA138'; +'ALOHA69'; +'FLOWER69'; +'WAVE69'; +'HONOLULU138'; +'HONOLULU69'; +'SURF69'; +'KANEOHE69'; +'TURTLE138'; +'TURTLE69'; +'MAHALO69'; +'LYCHEE69'; +'COCONUT69'; +'KAILUA138'; +'KAILUA69'; +'PALM69'; +'WAIMANALO69'; +'VOLCANO69'; +'PEARL CITY69'; +'MILILANI69'; +'AIEA69'; +'WAIPAHU138'; +'WAIPAHU69'; +'KAPOLEI69'; +'EWA BEACH138'; +'EWA BEACH69'; +'KAHUKU69'; +'HALEIWA69'; +'LAIE69'; +'WAHIAWA69'; +'WAIALUA69'; +'HAUULA69'; +'WAIANAE69'; +'SCHOFIELD69'; +'KALAELOA138'; +'COGEN69'; +'KAHE138'; +}; + +%% Generator Unit Types +mpc.gentype = { +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +'UN'; +}; + +%% Generator Fuel Types +mpc.genfuel = { +'wood'; +'wood'; +'wood'; +'wood'; +'dfo'; +'solar'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'solar'; +'solar'; +'solar'; +'wind'; +'wind'; +'solar'; +'wind'; +'solar'; +'wood'; +'wood'; +'wood'; +'wood'; +'wood'; +'wood'; +'wood'; +'wood'; +'coal'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +'dfo'; +}; diff --git a/cases/PhasorDynamics/Hawaii/README.md b/cases/PhasorDynamics/Hawaii/README.md index 4ecd11c846..f6e16ac3fd 100644 --- a/cases/PhasorDynamics/Hawaii/README.md +++ b/cases/PhasorDynamics/Hawaii/README.md @@ -19,4 +19,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/Hawaii/README.md). +`Hawaii.m` is the MATPOWER export `Hawaii40_20231026.m` of the Hawaii40 case[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). + [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). +[^2]: Texas A&M University, [Hawaii40](https://electricgrids.engr.tamu.edu/hawaii40/). diff --git a/cases/PhasorDynamics/IEEE39/IEEE39.m b/cases/PhasorDynamics/IEEE39/IEEE39.m new file mode 100644 index 0000000000..5a0836cdcc --- /dev/null +++ b/cases/PhasorDynamics/IEEE39/IEEE39.m @@ -0,0 +1,205 @@ +function mpc = case39 +%CASE39 Power flow data for 39 bus New England system. +% Please see CASEFORMAT for details on the case file format. +% +% Data taken from [1] with the following modifications/additions: +% +% - renumbered gen buses consecutively (as in [2] and [4]) +% - added Pmin = 0 for all gens +% - added Qmin, Qmax for gens at 31 & 39 (copied from gen at 35) +% - added Vg based on V in bus data (missing for bus 39) +% - added Vg, Pg, Pd, Qd at bus 39 from [2] (same in [4]) +% - added Pmax at bus 39: Pmax = Pg + 100 +% - added line flow limits and area data from [4] +% - added voltage limits, Vmax = 1.06, Vmin = 0.94 +% - added identical quadratic generator costs +% - increased Pmax for gen at bus 34 from 308 to 508 +% (assumed typo in [1], makes initial solved case feasible) +% - re-solved power flow +% +% Notes: +% - Bus 39, its generator and 2 connecting lines were added +% (by authors of [1]) to represent the interconnection with +% the rest of the eastern interconnect, and did not include +% Vg, Pg, Qg, Pd, Qd, Pmin, Pmax, Qmin or Qmax. +% - As the swing bus, bus 31 did not include and Q limits. +% - The voltages, etc in [1] appear to be quite close to the +% power flow solution of the case before adding bus 39 with +% it's generator and connecting branches, though the solution +% is not exact. +% - Explicit voltage setpoints for gen buses are not given, so +% they are taken from the bus data, however this results in two +% binding Q limits at buses 34 & 37, so the corresponding +% voltages have probably deviated from their original setpoints. +% - The generator locations and types are as follows: +% 1 30 hydro +% 2 31 nuke01 +% 3 32 nuke02 +% 4 33 fossil02 +% 5 34 fossil01 +% 6 35 nuke03 +% 7 36 fossil04 +% 8 37 nuke04 +% 9 38 nuke05 +% 10 39 interconnection to rest of US/Canada +% +% This is a solved power flow case, but it includes the following +% violations: +% - Pmax violated at bus 31: Pg = 677.87, Pmax = 646 +% - Qmin violated at bus 37: Qg = -1.37, Qmin = 0 +% +% References: +% [1] G. W. Bills, et.al., "On-Line Stability Analysis Study" +% RP90-1 Report for the Edison Electric Institute, October 12, 1970, +% pp. 1-20 - 1-35. +% prepared by E. M. Gulachenski - New England Electric System +% J. M. Undrill - General Electric Co. +% "generally representative of the New England 345 KV system, but is +% not an exact or complete model of any past, present or projected +% configuration of the actual New England 345 KV system. +% [2] M. A. Pai, Energy Function Analysis for Power System Stability, +% Kluwer Academic Publishers, Boston, 1989. +% (references [3] as source of data) +% [3] Athay, T.; Podmore, R.; Virmani, S., "A Practical Method for the +% Direct Analysis of Transient Stability," IEEE Transactions on Power +% Apparatus and Systems , vol.PAS-98, no.2, pp.573-584, March 1979. +% URL: https://doi.org/10.1109/TPAS.1979.319407 +% (references [1] as source of data) +% [4] Data included with TC Calculator at http://www.pserc.cornell.edu/tcc/ +% for 39-bus system. + +% MATPOWER + +%% MATPOWER Case Format : Version 2 +mpc.version = '2'; + +%%----- Power Flow Data -----%% +%% system MVA base +mpc.baseMVA = 100; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 1 97.6 44.2 0 0 2 1.0393836 -13.536602 345 1 1.06 0.94; + 2 1 0 0 0 0 2 1.0484941 -9.7852666 345 1 1.06 0.94; + 3 1 322 2.4 0 0 2 1.0307077 -12.276384 345 1 1.06 0.94; + 4 1 500 184 0 0 1 1.00446 -12.626734 345 1 1.06 0.94; + 5 1 0 0 0 0 1 1.0060063 -11.192339 345 1 1.06 0.94; + 6 1 0 0 0 0 1 1.0082256 -10.40833 345 1 1.06 0.94; + 7 1 233.8 84 0 0 1 0.99839728 -12.755626 345 1 1.06 0.94; + 8 1 522 176.6 0 0 1 0.99787232 -13.335844 345 1 1.06 0.94; + 9 1 6.5 -66.6 0 0 1 1.038332 -14.178442 345 1 1.06 0.94; + 10 1 0 0 0 0 1 1.0178431 -8.170875 345 1 1.06 0.94; + 11 1 0 0 0 0 1 1.0133858 -8.9369663 345 1 1.06 0.94; + 12 1 8.53 88 0 0 1 1.000815 -8.9988236 345 1 1.06 0.94; + 13 1 0 0 0 0 1 1.014923 -8.9299272 345 1 1.06 0.94; + 14 1 0 0 0 0 1 1.012319 -10.715295 345 1 1.06 0.94; + 15 1 320 153 0 0 3 1.0161854 -11.345399 345 1 1.06 0.94; + 16 1 329 32.3 0 0 3 1.0325203 -10.033348 345 1 1.06 0.94; + 17 1 0 0 0 0 2 1.0342365 -11.116436 345 1 1.06 0.94; + 18 1 158 30 0 0 2 1.0315726 -11.986168 345 1 1.06 0.94; + 19 1 0 0 0 0 3 1.0501068 -5.4100729 345 1 1.06 0.94; + 20 1 680 103 0 0 3 0.99101054 -6.8211783 345 1 1.06 0.94; + 21 1 274 115 0 0 3 1.0323192 -7.6287461 345 1 1.06 0.94; + 22 1 0 0 0 0 3 1.0501427 -3.1831199 345 1 1.06 0.94; + 23 1 247.5 84.6 0 0 3 1.0451451 -3.3812763 345 1 1.06 0.94; + 24 1 308.6 -92.2 0 0 3 1.038001 -9.9137585 345 1 1.06 0.94; + 25 1 224 47.2 0 0 2 1.0576827 -8.3692354 345 1 1.06 0.94; + 26 1 139 17 0 0 2 1.0525613 -9.4387696 345 1 1.06 0.94; + 27 1 281 75.5 0 0 2 1.0383449 -11.362152 345 1 1.06 0.94; + 28 1 206 27.6 0 0 3 1.0503737 -5.9283592 345 1 1.06 0.94; + 29 1 283.5 26.9 0 0 3 1.0501149 -3.1698741 345 1 1.06 0.94; + 30 2 0 0 0 0 2 1.0499 -7.3704746 345 1 1.06 0.94; + 31 3 9.2 4.6 0 0 1 0.982 0 345 1 1.06 0.94; + 32 2 0 0 0 0 1 0.9841 -0.1884374 345 1 1.06 0.94; + 33 2 0 0 0 0 3 0.9972 -0.19317445 345 1 1.06 0.94; + 34 2 0 0 0 0 3 1.0123 -1.631119 345 1 1.06 0.94; + 35 2 0 0 0 0 3 1.0494 1.7765069 345 1 1.06 0.94; + 36 2 0 0 0 0 3 1.0636 4.4684374 345 1 1.06 0.94; + 37 2 0 0 0 0 2 1.0275 -1.5828988 345 1 1.06 0.94; + 38 2 0 0 0 0 3 1.0265 3.8928177 345 1 1.06 0.94; + 39 2 1104 250 0 0 1 1.03 -14.535256 345 1 1.06 0.94; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf +mpc.gen = [ + 30 250 161.762 400 140 1.0499 100 1 1040 0 0 0 0 0 0 0 0 0 0 0 0; + 31 677.871 221.574 300 -100 0.982 100 1 646 0 0 0 0 0 0 0 0 0 0 0 0; + 32 650 206.965 300 150 0.9841 100 1 725 0 0 0 0 0 0 0 0 0 0 0 0; + 33 632 108.293 250 0 0.9972 100 1 652 0 0 0 0 0 0 0 0 0 0 0 0; + 34 508 166.688 167 0 1.0123 100 1 508 0 0 0 0 0 0 0 0 0 0 0 0; + 35 650 210.661 300 -100 1.0494 100 1 687 0 0 0 0 0 0 0 0 0 0 0 0; + 36 560 100.165 240 0 1.0636 100 1 580 0 0 0 0 0 0 0 0 0 0 0 0; + 37 540 -1.36945 250 0 1.0275 100 1 564 0 0 0 0 0 0 0 0 0 0 0 0; + 38 830 21.7327 300 -150 1.0265 100 1 865 0 0 0 0 0 0 0 0 0 0 0 0; + 39 1000 78.4674 300 -100 1.03 100 1 1100 0 0 0 0 0 0 0 0 0 0 0 0; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax +mpc.branch = [ + 1 2 0.0035 0.0411 0.6987 600 600 600 0 0 1 -360 360; + 1 39 0.001 0.025 0.75 1000 1000 1000 0 0 1 -360 360; + 2 3 0.0013 0.0151 0.2572 500 500 500 0 0 1 -360 360; + 2 25 0.007 0.0086 0.146 500 500 500 0 0 1 -360 360; + 2 30 0 0.0181 0 900 900 2500 1.025 0 1 -360 360; + 3 4 0.0013 0.0213 0.2214 500 500 500 0 0 1 -360 360; + 3 18 0.0011 0.0133 0.2138 500 500 500 0 0 1 -360 360; + 4 5 0.0008 0.0128 0.1342 600 600 600 0 0 1 -360 360; + 4 14 0.0008 0.0129 0.1382 500 500 500 0 0 1 -360 360; + 5 6 0.0002 0.0026 0.0434 1200 1200 1200 0 0 1 -360 360; + 5 8 0.0008 0.0112 0.1476 900 900 900 0 0 1 -360 360; + 6 7 0.0006 0.0092 0.113 900 900 900 0 0 1 -360 360; + 6 11 0.0007 0.0082 0.1389 480 480 480 0 0 1 -360 360; + 6 31 0 0.025 0 1800 1800 1800 1.07 0 1 -360 360; + 7 8 0.0004 0.0046 0.078 900 900 900 0 0 1 -360 360; + 8 9 0.0023 0.0363 0.3804 900 900 900 0 0 1 -360 360; + 9 39 0.001 0.025 1.2 900 900 900 0 0 1 -360 360; + 10 11 0.0004 0.0043 0.0729 600 600 600 0 0 1 -360 360; + 10 13 0.0004 0.0043 0.0729 600 600 600 0 0 1 -360 360; + 10 32 0 0.02 0 900 900 2500 1.07 0 1 -360 360; + 12 11 0.0016 0.0435 0 500 500 500 1.006 0 1 -360 360; + 12 13 0.0016 0.0435 0 500 500 500 1.006 0 1 -360 360; + 13 14 0.0009 0.0101 0.1723 600 600 600 0 0 1 -360 360; + 14 15 0.0018 0.0217 0.366 600 600 600 0 0 1 -360 360; + 15 16 0.0009 0.0094 0.171 600 600 600 0 0 1 -360 360; + 16 17 0.0007 0.0089 0.1342 600 600 600 0 0 1 -360 360; + 16 19 0.0016 0.0195 0.304 600 600 2500 0 0 1 -360 360; + 16 21 0.0008 0.0135 0.2548 600 600 600 0 0 1 -360 360; + 16 24 0.0003 0.0059 0.068 600 600 600 0 0 1 -360 360; + 17 18 0.0007 0.0082 0.1319 600 600 600 0 0 1 -360 360; + 17 27 0.0013 0.0173 0.3216 600 600 600 0 0 1 -360 360; + 19 20 0.0007 0.0138 0 900 900 2500 1.06 0 1 -360 360; + 19 33 0.0007 0.0142 0 900 900 2500 1.07 0 1 -360 360; + 20 34 0.0009 0.018 0 900 900 2500 1.009 0 1 -360 360; + 21 22 0.0008 0.014 0.2565 900 900 900 0 0 1 -360 360; + 22 23 0.0006 0.0096 0.1846 600 600 600 0 0 1 -360 360; + 22 35 0 0.0143 0 900 900 2500 1.025 0 1 -360 360; + 23 24 0.0022 0.035 0.361 600 600 600 0 0 1 -360 360; + 23 36 0.0005 0.0272 0 900 900 2500 1 0 1 -360 360; + 25 26 0.0032 0.0323 0.531 600 600 600 0 0 1 -360 360; + 25 37 0.0006 0.0232 0 900 900 2500 1.025 0 1 -360 360; + 26 27 0.0014 0.0147 0.2396 600 600 600 0 0 1 -360 360; + 26 28 0.0043 0.0474 0.7802 600 600 600 0 0 1 -360 360; + 26 29 0.0057 0.0625 1.029 600 600 600 0 0 1 -360 360; + 28 29 0.0014 0.0151 0.249 600 600 600 0 0 1 -360 360; + 29 38 0.0008 0.0156 0 1200 1200 2500 1.025 0 1 -360 360; +]; + +%%----- OPF Data -----%% +%% generator cost data +% 1 startup shutdown n x1 y1 ... xn yn +% 2 startup shutdown n c(n-1) ... c0 +mpc.gencost = [ + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; + 2 0 0 3 0.01 0.3 0.2; +]; diff --git a/cases/PhasorDynamics/IEEE39/README.md b/cases/PhasorDynamics/IEEE39/README.md index ed71bcc0eb..72191510f4 100644 --- a/cases/PhasorDynamics/IEEE39/README.md +++ b/cases/PhasorDynamics/IEEE39/README.md @@ -14,4 +14,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/IEEE39/README.md). +`IEEE39.m` is MATPOWER `case39`[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). + [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). +[^2]: MATPOWER, [`case39.m`](https://github.com/MATPOWER/matpower/blob/master/data/case39.m). diff --git a/examples/PhasorDynamics/CMakeLists.txt b/examples/PhasorDynamics/CMakeLists.txt index 954fc8bf35..f215364ec4 100644 --- a/examples/PhasorDynamics/CMakeLists.txt +++ b/examples/PhasorDynamics/CMakeLists.txt @@ -1,3 +1,7 @@ add_subdirectory(DynamicSimulation) add_subdirectory(ContingencyAnalysis) add_subdirectory(Validation) + +if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) + add_subdirectory(OptimalDispatch) +endif() diff --git a/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json b/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json new file mode 100644 index 0000000000..490ed99f78 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json @@ -0,0 +1,8 @@ +{ + "system_model_file": "ACTIVSg2000.case.json", + "dispatch_file": "ACTIVSg2000.m", + "output_state_file": "ACTIVSg2000.state.json", + "ipopt": { + "tol": 1e-08 + } +} diff --git a/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt new file mode 100644 index 0000000000..e3e1ba1d55 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 5.1e-11 and drift 4.1e-12 +gridkit_optimal_dispatch_example(ACTIVSg2000 1e-10 8e-12) diff --git a/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt new file mode 100644 index 0000000000..036180f39a --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt @@ -0,0 +1,34 @@ +# +# gridkit_optimal_dispatch_example( ) +# +# Solve the optimal dispatch of `cases/PhasorDynamics/` with the limits +# and costs of its MATPOWER case, and check that PhasorDynamics starts in +# steady state from the solution. The tolerances bound the residual at t = 0 +# and the relative drift over 1 s. +# +function( + gridkit_optimal_dispatch_example + case + residual_tol + drift_tol) + gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.case.json) + gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.m) + gridkit_example_add_file(${case}.solver.json) + + add_test( + NAME OptimalDispatch_${case} + COMMAND OptimalDispatch ${case}.solver.json + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_tests_properties(OptimalDispatch_${case} PROPERTIES FIXTURES_SETUP ${case}_dispatch_state) + + add_test( + NAME OptimalDispatch_${case}_steady_start + COMMAND test_opf_steady_start ${case}.case.json ${case}.state.json ${residual_tol} ${drift_tol} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_tests_properties(OptimalDispatch_${case}_steady_start PROPERTIES FIXTURES_REQUIRED + ${case}_dispatch_state) +endfunction() + +add_subdirectory(IEEE39) +add_subdirectory(Hawaii) +add_subdirectory(ACTIVSg2000) diff --git a/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt new file mode 100644 index 0000000000..4be41c30f4 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 1.3e-13 and drift 2.4e-14 +gridkit_optimal_dispatch_example(Hawaii 2.5e-13 5e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json b/examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json new file mode 100644 index 0000000000..4cdb03e871 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json @@ -0,0 +1,8 @@ +{ + "system_model_file": "Hawaii.case.json", + "dispatch_file": "Hawaii.m", + "output_state_file": "Hawaii.state.json", + "ipopt": { + "tol": 1e-08 + } +} diff --git a/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt new file mode 100644 index 0000000000..dd6f036cdd --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 1.0e-13 and drift 9.3e-15 +gridkit_optimal_dispatch_example(IEEE39 2e-13 2e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json b/examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json new file mode 100644 index 0000000000..1af1737bb6 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json @@ -0,0 +1,8 @@ +{ + "system_model_file": "IEEE39.case.json", + "dispatch_file": "IEEE39.m", + "output_state_file": "IEEE39.state.json", + "ipopt": { + "tol": 1e-08 + } +} diff --git a/examples/PhasorDynamics/OptimalDispatch/README.md b/examples/PhasorDynamics/OptimalDispatch/README.md new file mode 100644 index 0000000000..af0d204b39 --- /dev/null +++ b/examples/PhasorDynamics/OptimalDispatch/README.md @@ -0,0 +1,50 @@ +# Optimal Dispatch + +Each example solves the optimal power flow of a case in `cases/PhasorDynamics/` +with the limits and costs of its MATPOWER case, writes the solution state, and +checks that PhasorDynamics starts from it in steady state. + + Case | Buses | Generators | Ipopt iterations | Cost [$/h] + --------------|-------|------------|------------------|----------- + `IEEE39` | 39 | 10 | 16 | 40086.9 + `Hawaii` | 37 | 39 | 20 | 4151.17 + `ACTIVSg2000` | 2000 | 334 | 35 | 1.22901e6 + +Run an example from its build directory, then start a dynamic study from the +solution: + +```shell +OptimalDispatch IEEE39.solver.json +``` + +```json +{ + "system_model_file": "IEEE39.case.json", + "state_file": "IEEE39.state.json", + "tmax": 10.0 +} +``` + +## Pass and fail criteria + +- `OptimalDispatch_` passes when Ipopt converges and the state is + written. +- `OptimalDispatch__steady_start` applies the state to the case and + passes when both of these hold: + - the largest PhasorDynamics residual at $t = 0$ is below its tolerance; + - the largest change of any variable over 1 s, relative to one plus its + initial magnitude, is below its tolerance, with the `DynamicSimulation` + default solver tolerances. + + Case | Residual | Tolerance | Drift | Tolerance + --------------|----------|-----------|---------|---------- + `IEEE39` | 1.0e-13 | 2e-13 | 9.3e-15 | 2e-14 + `Hawaii` | 1.3e-13 | 2.5e-13 | 2.4e-14 | 5e-14 + `ACTIVSg2000` | 5.1e-11 | 1e-10 | 4.1e-12 | 8e-12 + +## Data + +- `IEEE39`: MATPOWER `case39`. +- `Hawaii`: the MATPOWER export of the Texas A&M Hawaii40 case. +- `ACTIVSg2000`: MATPOWER `case_ACTIVSg2000`. The static generators are + `LoadZIP` devices with negative demand in the case, so they stay fixed. diff --git a/examples/PhasorDynamics/README.md b/examples/PhasorDynamics/README.md index 195283135d..7a838801d0 100644 --- a/examples/PhasorDynamics/README.md +++ b/examples/PhasorDynamics/README.md @@ -8,6 +8,7 @@ use the reusable models in `cases/PhasorDynamics/`. | [DynamicSimulation](DynamicSimulation/README.md) | Individual simulation studies. | | [ContingencyAnalysis](ContingencyAnalysis/README.md) | Bus-fault contingency studies. | | [Validation](Validation/README.md) | System studies compared against PowerWorld reference results. | +| [OptimalDispatch](OptimalDispatch/README.md) | Optimal operating points that start PhasorDynamics in steady state. | ## Running a Study diff --git a/tests/IntegrationTests/CMakeLists.txt b/tests/IntegrationTests/CMakeLists.txt index 6c0295831d..f275d69620 100644 --- a/tests/IntegrationTests/CMakeLists.txt +++ b/tests/IntegrationTests/CMakeLists.txt @@ -1 +1,7 @@ add_subdirectory(PhasorDynamics) + +if(TARGET SUNDIALS::idas + AND GRIDKIT_ENABLE_ENZYME + AND GRIDKIT_ENABLE_IPOPT) + add_subdirectory(OptimalPowerFlow) +endif() diff --git a/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt b/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt new file mode 100644 index 0000000000..b3f46e3035 --- /dev/null +++ b/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(test_opf_steady_start runSteadyStartTests.cpp) +target_link_libraries( + test_opf_steady_start + PRIVATE GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn GridKit::testing) + +install(TARGETS test_opf_steady_start) diff --git a/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp b/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp new file mode 100644 index 0000000000..72144b2339 --- /dev/null +++ b/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp @@ -0,0 +1,96 @@ +/** + * @file runSteadyStartTests.cpp + * @brief PhasorDynamics starts in steady state from an optimal power flow state. + * + * Usage: test_opf_steady_start + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ + using SystemModelT = GridKit::PhasorDynamics::SystemModel; + + /// Simulated time over which the state must hold [s] + constexpr double STEADY_TIME = 1.0; + + /// Solver tolerances of `DynamicSimulation` by default + constexpr double REL_TOL = 1.0e-7; + constexpr double ABS_TOL = 1.0e-9; + + double maxResidual(SystemModelT& system) + { + system.evaluateResidual(); + + const auto& f = system.getResidual(); + const double* values = f.getData(); + + double norm = 0.0; + for (size_t i = 0; i < f.getSize(); ++i) + { + norm = std::max(norm, std::abs(values[i])); + } + return norm; + } + + double maxDrift(const std::vector& y0, const double* y) + { + double drift = 0.0; + for (size_t i = 0; i < y0.size(); ++i) + { + drift = std::max(drift, std::abs(y[i] - y0[i]) / (1.0 + std::abs(y0[i]))); + } + return drift; + } +} // namespace + +int main(int argc, const char* argv[]) +{ + using namespace GridKit; + + if (argc != 5) + { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + const double residual_tol = std::atof(argv[3]); + const double drift_tol = std::atof(argv[4]); + + Testing::TestStatus success = "steadyStart"; + + auto data = PhasorDynamics::parseSystemModelData(std::filesystem::path(argv[1])); + PhasorDynamics::applyState(data, Model::parseStateData(std::filesystem::path(argv[2]))); + + SystemModelT system(data); + system.allocate(); + + const double residual = maxResidual(system); + std::cout << "Residual at t = 0: " << residual << "\n"; + success *= residual < residual_tol; + + const double* y = system.y().getData(); + const std::vector y0(y, y + system.size()); + + AnalysisManager::Sundials::Ida ida(&system); + ida.setTolerance(REL_TOL, ABS_TOL); + ida.configureSimulation(); + ida.initializeSimulation(0.0); + ida.runSimulation(STEADY_TIME); + + const double drift = maxDrift(y0, system.y().getData()); + std::cout << "Relative drift after " << STEADY_TIME << " s: " << drift << "\n"; + success *= drift < drift_tol; + + return success.report(); +} diff --git a/tests/UnitTests/CMakeLists.txt b/tests/UnitTests/CMakeLists.txt index ca3e3f295e..5d69032fc7 100644 --- a/tests/UnitTests/CMakeLists.txt +++ b/tests/UnitTests/CMakeLists.txt @@ -2,7 +2,11 @@ add_subdirectory(AutomaticDifferentiation) add_subdirectory(LinearAlgebra) add_subdirectory(Math) +add_subdirectory(Model) add_subdirectory(Network) +if(GRIDKIT_ENABLE_ENZYME) + add_subdirectory(OptimalPowerFlow) +endif() add_subdirectory(PhasorDynamics) add_subdirectory(PowerElectronics) add_subdirectory(Solver) diff --git a/tests/UnitTests/Model/CMakeLists.txt b/tests/UnitTests/Model/CMakeLists.txt new file mode 100644 index 0000000000..c5ca959193 --- /dev/null +++ b/tests/UnitTests/Model/CMakeLists.txt @@ -0,0 +1,8 @@ +add_executable(test_state_data runStateDataTests.cpp) +target_link_libraries( + test_state_data + PRIVATE GridKit::model_state_data GridKit::testing) + +add_test(NAME ModelStateDataTest COMMAND test_state_data) + +install(TARGETS test_state_data) diff --git a/tests/UnitTests/Model/StateDataTests.hpp b/tests/UnitTests/Model/StateDataTests.hpp new file mode 100644 index 0000000000..a2d3e8b2f0 --- /dev/null +++ b/tests/UnitTests/Model/StateDataTests.hpp @@ -0,0 +1,131 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include + +namespace GridKit +{ + namespace Testing + { + class StateDataTests + { + public: + /// Bus and current keys follow `STATE.md` + TestOutcome keys() + { + TestStatus success = true; + + success *= Model::busKey(7) == "bus_id_7"; + success *= Model::currentKeys(0, 1) == std::pair{"ir", "ii"}; + success *= Model::currentKeys(1, 2) == std::pair{"ir2", "ii2"}; + + return success.report(__func__); + } + + /// Numbers and flags are read into separate maps and survive writing + TestOutcome roundTrip() + { + TestStatus success = true; + + std::istringstream input(R"({ + "header": {"version": 1, "description": "round trip"}, + "buses": {"bus_id_2": {"vr": 0.98, "vi": -0.12}}, + "devices": { + "gen_2": {"online": true, "ir": 0.8, "ii": -0.2}, + "branch_1_2": {"open": false, "tap": 1, "phase": 0.05, "note": null} + } + })"); + const Model::StateData state = Model::parseStateData(input); + + success *= state.header.version == 1U; + success *= state.header.description == "round trip"; + success *= !state.header.created.has_value(); + success *= !state.header.time.has_value(); + + const Model::StateRecord* bus = state.bus(2); + success *= bus != nullptr; + success *= state.bus(3) == nullptr; + + const Model::StateRecord* generator = state.device("gen_2"); + success *= generator != nullptr; + success *= generator->flag("online", false); + success *= !generator->values.contains("online"); + + const Model::StateRecord* branch = state.device("branch_1_2"); + success *= branch != nullptr; + success *= !branch->flag("open", true); + success *= isEqual(branch->value("tap", 0.0), 1.0); + success *= !branch->values.contains("note"); + success *= isEqual(branch->value("missing", 0.25), 0.25); + + std::stringstream buffer; + Model::writeStateData(state, buffer); + const Model::StateData copy = Model::parseStateData(buffer); + + success *= copy.header.version == state.header.version; + success *= copy.header.description == state.header.description; + success *= !copy.header.created.has_value(); + success *= isEqual(copy.buses.at("bus_id_2").values, bus->values); + success *= isEqual(copy.devices.at("gen_2").values, generator->values); + success *= copy.devices.at("gen_2").flags == generator->flags; + success *= isEqual(copy.devices.at("branch_1_2").values, branch->values); + success *= copy.devices.at("branch_1_2").flags == branch->flags; + + return success.report(__func__); + } + + /// Entries that are neither numbers nor booleans are rejected + TestOutcome rejectsText() + { + TestStatus success = true; + + success *= throws(parseText); + + return success.report(__func__); + } + + /// Terminal current and terminal power are inverse conversions + TestOutcome terminalConversion() + { + TestStatus success = true; + + Model::StateData state; + state.buses[Model::busKey(4)].values = {{"vr", 1.02}, {"vi", -0.15}}; + state.buses[Model::busKey(5)].values = {{"vr", 0.97}, {"vi", 0.08}}; + + double p = 0.0; + double q = 0.0; + + Model::setTerminalCurrent(state, "gen_4", 4, 0, 1, 0.7, -0.25); + success *= Model::terminalPower(state, "gen_4", 4, 0, 1, p, q); + success *= isEqual(p, 0.7); + success *= isEqual(q, -0.25); + + Model::setTerminalCurrent(state, "branch_4_5", 5, 1, 2, -0.4, 0.1); + success *= state.devices.at("branch_4_5").values.contains("ir2"); + success *= state.devices.at("branch_4_5").values.contains("ii2"); + success *= Model::terminalPower(state, "branch_4_5", 5, 1, 2, p, q); + success *= isEqual(p, -0.4); + success *= isEqual(q, 0.1); + + // No current for this terminal, and no voltage for bus 6 + success *= !Model::terminalPower(state, "branch_4_5", 4, 0, 2, p, q); + success *= !Model::terminalPower(state, "gen_4", 6, 0, 1, p, q); + + return success.report(__func__); + } + + private: + static void parseText() + { + std::istringstream input(R"({"devices": {"gen_2": {"ir": "0.8"}}})"); + Model::parseStateData(input); + } + }; + } // namespace Testing +} // namespace GridKit diff --git a/tests/UnitTests/Model/runStateDataTests.cpp b/tests/UnitTests/Model/runStateDataTests.cpp new file mode 100644 index 0000000000..cd01af3e81 --- /dev/null +++ b/tests/UnitTests/Model/runStateDataTests.cpp @@ -0,0 +1,14 @@ +#include "StateDataTests.hpp" + +int main() +{ + GridKit::Testing::TestingResults result; + GridKit::Testing::StateDataTests test; + + result += test.keys(); + result += test.roundTrip(); + result += test.rejectsText(); + result += test.terminalConversion(); + + return result.summary(); +} diff --git a/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt new file mode 100644 index 0000000000..1cd8fbd86e --- /dev/null +++ b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt @@ -0,0 +1,22 @@ +add_executable(test_opf_components runComponentTests.cpp) +target_link_libraries( + test_opf_components + GridKit::optimal_power_flow_components + GridKit::optimal_power_flow_components_dependency_tracking + GridKit::phasor_dynamics_branch + GridKit::phasor_dynamics_bus + GridKit::testing) +add_test(NAME OptimalPowerFlowComponentTest COMMAND test_opf_components) +install(TARGETS test_opf_components) + +if(GRIDKIT_ENABLE_IPOPT) + add_executable(test_opf_system runSystemTests.cpp) + target_link_libraries( + test_opf_system + GridKit::optimal_power_flow_systemmodel + GridKit::optimal_power_flow_systemmodel_dependency_tracking + GridKit::solvers_opt_problem + GridKit::testing) + add_test(NAME OptimalPowerFlowSystemTest COMMAND test_opf_system) + install(TARGETS test_opf_system) +endif() diff --git a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp new file mode 100644 index 0000000000..fb7e90a36f --- /dev/null +++ b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp @@ -0,0 +1,690 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace Testing + { + namespace OPF = GridKit::OptimalPowerFlow; + namespace PD = GridKit::PhasorDynamics; + + /** + * @brief Component derivatives against dependency tracking and closed forms + */ + class ComponentTests + { + using RealT = double; + using IdxT = size_t; + using VariableT = DependencyTracking::Variable; + using DependencyMap = VariableT::DependencyMap; + using EntryMap = std::map, RealT>; + + public: + /// Power into each bus is V conj(I) with I from `PhasorDynamics::Branch` + TestOutcome branchPower() + { + TestStatus success = true; + + OPF::Branch branch(opfBranchData()); + const auto x = variables(branch, Model::StateData{}, BRANCH_X); + + std::vector g(branch.sizeConstraints()); + branch.evaluateConstraints(x.data(), g.data()); + + const RealT vr1 = BRANCH_X[0]; + const RealT vi1 = BRANCH_X[1]; + const RealT vr2 = BRANCH_X[2]; + const RealT vi2 = BRANCH_X[3]; + + RealT ir1 = 0.0; + RealT ii1 = 0.0; + RealT ir2 = 0.0; + RealT ii2 = 0.0; + pdCurrents(vr1, vi1, vr2, vi2, ir1, ii1, ir2, ii2); + + const RealT p1 = vr1 * ir1 + vi1 * ii1; + const RealT q1 = vi1 * ir1 - vr1 * ii1; + const RealT p2 = vr2 * ir2 + vi2 * ii2; + const RealT q2 = vi2 * ir2 - vr2 * ii2; + + success *= isEqual(g[0], p1 * p1 + q1 * q1, POWER_TOL); + success *= isEqual(g[1], p2 * p2 + q2 * q2, POWER_TOL); + success *= isEqual(g[2], p1, POWER_TOL); + success *= isEqual(g[3], q1, POWER_TOL); + success *= isEqual(g[4], p2, POWER_TOL); + success *= isEqual(g[5], q2, POWER_TOL); + + return success.report(__func__); + } + + /// Enzyme Jacobian entries equal the dependency-tracking derivatives + TestOutcome branchJacobian() + { + TestStatus success = true; + + OPF::Branch branch(opfBranchData()); + const auto x = variables(branch, Model::StateData{}, BRANCH_X); + branch.evaluateJacobian(x.data()); + + OPF::Branch tracked(opfBranchData()); + const auto x_tracked = variables(tracked, Model::StateData{}, BRANCH_X); + std::vector g(tracked.sizeConstraints()); + tracked.evaluateConstraints(x_tracked.data(), g.data()); + + const auto enzyme = rowsOf(branch.jacobian(), branch.sizeConstraints()); + for (IdxT i = 0; i < g.size(); ++i) + { + success *= isEqual(enzyme[i], g[i].getDependencies(), JACOBIAN_TOL); + } + success *= branch.jacobian().values.size() == BRANCH_JACOBIAN_SIZE; + + return success.report(__func__); + } + + /// Enzyme Hessian entries equal the closed-form Cartesian second derivatives + TestOutcome branchHessian() + { + TestStatus success = true; + + OPF::Branch branch(opfBranchData()); + const auto x = variables(branch, Model::StateData{}, BRANCH_X); + branch.evaluateHessian(x.data(), ONE, BRANCH_LAMBDA.data()); + + // Admittances of PhasorDynamics::Branch from unit voltages + RealT g11 = 0.0; + RealT b11 = 0.0; + RealT g12 = 0.0; + RealT b12 = 0.0; + RealT g21 = 0.0; + RealT b21 = 0.0; + RealT g22 = 0.0; + RealT b22 = 0.0; + pdCurrents(ONE, ZERO, ZERO, ZERO, g11, b11, g21, b21); + pdCurrents(ZERO, ZERO, ONE, ZERO, g12, b12, g22, b22); + + // Rows 2 to 5: P1, Q1, P2, Q2 + EntryMap expected; + addPowerHessian(expected, 0, {g11, b11, g12, b12}, BRANCH_LAMBDA[2], BRANCH_LAMBDA[3]); + addPowerHessian(expected, 1, {g21, b21, g22, b22}, BRANCH_LAMBDA[4], BRANCH_LAMBDA[5]); + + // Rows 0 and 1: |S|^2 = P^2 + Q^2 by the chain rule over tracked gradients + OPF::Branch tracked(opfBranchData()); + const auto x_tracked = variables(tracked, Model::StateData{}, BRANCH_X); + std::vector g(tracked.sizeConstraints()); + tracked.evaluateConstraints(x_tracked.data(), g.data()); + + for (IdxT terminal = 0; terminal < 2; ++terminal) + { + const RealT weight = TWO * BRANCH_LAMBDA[terminal]; + const VariableT p = g[2 + 2 * terminal]; + const VariableT q = g[3 + 2 * terminal]; + addOuterProduct(expected, p.getDependencies(), weight); + addOuterProduct(expected, q.getDependencies(), weight); + } + const RealT weight1 = TWO * BRANCH_LAMBDA[0]; + const RealT weight2 = TWO * BRANCH_LAMBDA[1]; + addPowerHessian(expected, 0, {g11, b11, g12, b12}, weight1 * g[2].getValue(), weight1 * g[3].getValue()); + addPowerHessian(expected, 1, {g21, b21, g22, b22}, weight2 * g[4].getValue(), weight2 * g[5].getValue()); + + success *= isEqual(sum(branch.hessian()), expected, HESSIAN_TOL); + success *= branch.hessian().values.size() == BRANCH_HESSIAN_SIZE; + + return success.report(__func__); + } + + /// Entry counts are structural, so an open branch at a flat start with + /// zero multipliers has the same entries + TestOutcome branchPattern() + { + TestStatus success = true; + + Model::StateData state; + state.devices[BRANCH_ID].flags["open"] = true; + + OPF::Branch branch(opfBranchData()); + const auto x = variables(branch, state, FLAT_START); + + const std::vector lambda(branch.sizeConstraints(), ZERO); + branch.evaluateJacobian(x.data()); + branch.evaluateHessian(x.data(), ONE, lambda.data()); + + success *= branch.jacobian().values.size() == BRANCH_JACOBIAN_SIZE; + success *= branch.hessian().values.size() == BRANCH_HESSIAN_SIZE; + for (const RealT value : branch.hessian().values) + { + success *= isEqual(value, ZERO); + } + + return success.report(__func__); + } + + /// Generator cost, bounds, and derivatives in closed form + TestOutcome generator() + { + TestStatus success = true; + + Model::StateData state; + state.buses[Model::busKey(1)].values = {{"vr", 1.0}, {"vi", 0.0}}; + + OPF::Generator generator(generatorData()); + std::vector x(generator.size()); + std::vector x_lower(generator.size()); + std::vector x_upper(generator.size()); + numberLocally(generator); + success *= generator.initialize(state, x.data(), x_lower.data(), x_upper.data()) == 0; + + success *= isEqual(x_lower[0], PMIN) && isEqual(x_upper[0], PMAX); + success *= isEqual(x_lower[1], QMIN) && isEqual(x_upper[1], QMAX); + + x = GENERATOR_X; + const RealT p = x[0]; + + RealT f = ZERO; + generator.evaluateObjective(x.data(), f); + success *= isEqual(f, C0 + C1 * p + C2 * p * p); + + std::vector gradient(generator.size(), ZERO); + generator.evaluateGradient(x.data(), gradient.data()); + success *= isEqual(gradient[0], C1 + TWO * C2 * p); + + generator.evaluateJacobian(x.data()); + success *= isEqual(sum(generator.jacobian()), EntryMap{{{0, 0}, ONE}, {{1, 1}, ONE}}); + + const std::vector lambda(generator.sizeConstraints(), ONE); + generator.evaluateHessian(x.data(), SIGMA, lambda.data()); + success *= isEqual(sum(generator.hessian()), EntryMap{{{0, 0}, TWO * C2 * SIGMA}}); + + return success.report(__func__); + } + + /// An offline generator is fixed at zero with no cost and the same entries + TestOutcome offlineGenerator() + { + TestStatus success = true; + + Model::StateData state; + state.devices["gen_1"].flags["online"] = false; + + OPF::Generator generator(generatorData()); + std::vector x(generator.size()); + std::vector x_lower(generator.size()); + std::vector x_upper(generator.size()); + numberLocally(generator); + generator.initialize(state, x.data(), x_lower.data(), x_upper.data()); + + success *= isEqual(x_lower[0], ZERO) && isEqual(x_upper[0], ZERO); + success *= isEqual(x_lower[1], ZERO) && isEqual(x_upper[1], ZERO); + + x = GENERATOR_X; + RealT f = ZERO; + generator.evaluateObjective(x.data(), f); + success *= isEqual(f, ZERO); + + const std::vector lambda(generator.sizeConstraints(), ZERO); + generator.evaluateJacobian(x.data()); + generator.evaluateHessian(x.data(), ONE, lambda.data()); + success *= generator.jacobian().values.size() == 2; + success *= generator.hessian().values.size() == 1; + + return success.report(__func__); + } + + /// Shunt derivatives in closed form + TestOutcome shunt() + { + TestStatus success = true; + + OPF::ShuntData data; + data.id = "shunt_1"; + data.buses[OPF::ShuntBuses::bus] = 1; + data.parameters[OPF::ShuntParameters::G] = SHUNT_G; + data.parameters[OPF::ShuntParameters::B] = SHUNT_B; + + OPF::Shunt shunt(data); + const auto x = variables(shunt, Model::StateData{}, SHUNT_X); + const RealT vr = x[0]; + const RealT vi = x[1]; + + std::vector g(shunt.sizeConstraints(), ZERO); + shunt.evaluateConstraints(x.data(), g.data()); + success *= isEqual(g[0], -SHUNT_G * (vr * vr + vi * vi)); + success *= isEqual(g[1], SHUNT_B * (vr * vr + vi * vi)); + + shunt.evaluateJacobian(x.data()); + success *= isEqual(sum(shunt.jacobian()), + EntryMap{{{0, 0}, -TWO * SHUNT_G * vr}, + {{0, 1}, -TWO * SHUNT_G * vi}, + {{1, 0}, TWO * SHUNT_B * vr}, + {{1, 1}, TWO * SHUNT_B * vi}}); + + shunt.evaluateHessian(x.data(), ONE, SHUNT_LAMBDA.data()); + const RealT hessian = TWO * (-SHUNT_G * SHUNT_LAMBDA[0] + SHUNT_B * SHUNT_LAMBDA[1]); + + success *= isEqual(sum(shunt.hessian()), EntryMap{{{0, 0}, hessian}, {{1, 1}, hessian}}); + + return success.report(__func__); + } + + /// Bus rows follow the limits and the reference and infinite settings + TestOutcome bus() + { + TestStatus success = true; + + Model::StateData state; + state.buses[Model::busKey(3)].values = {{"vr", BUS_VR}, {"vi", BUS_VI}}; + + OPF::BusData data; + data.number = 3; + data.parameters[OPF::BusParameters::Vmin] = VMIN; + data.parameters[OPF::BusParameters::Vmax] = VMAX; + + OPF::Bus bus(data); + std::vector x(bus.size()); + std::vector x_lower(bus.size()); + std::vector x_upper(bus.size()); + numberLocally(bus); + + bus.initialize(state, x.data(), x_lower.data(), x_upper.data()); + success *= isEqual(x[0], BUS_VR) && isEqual(x[1], BUS_VI); + for (IdxT j = 0; j < bus.size(); ++j) + { + success *= std::isinf(x_lower[j]) && std::isinf(x_upper[j]); + } + + const auto& lower = bus.constraintLower(); + const auto& upper = bus.constraintUpper(); + + success *= isEqual(lower[0], ZERO) && isEqual(upper[0], ZERO); + success *= isEqual(lower[1], ZERO) && isEqual(upper[1], ZERO); + success *= isEqual(lower[2], VMIN * VMIN) && isEqual(upper[2], VMAX * VMAX); + success *= std::isinf(lower[3]) && std::isinf(upper[3]); + + bus.setReference(); + success *= isEqual(lower[3], ZERO) && isEqual(upper[3], ZERO); + + x = BUS_X; + std::vector g(bus.sizeConstraints()); + bus.evaluateConstraints(x.data(), g.data()); + success *= isEqual(g[2], x[0] * x[0] + x[1] * x[1]); + success *= isEqual(g[3], BUS_VR * x[1] - BUS_VI * x[0]); + + bus.evaluateJacobian(x.data()); + success *= isEqual(sum(bus.jacobian()), + EntryMap{{{2, 0}, TWO * x[0]}, {{2, 1}, TWO * x[1]}, {{3, 0}, -BUS_VI}, {{3, 1}, BUS_VR}}); + + bus.evaluateHessian(x.data(), ONE, BUS_LAMBDA.data()); + const RealT hessian = TWO * BUS_LAMBDA[2]; + + success *= isEqual(sum(bus.hessian()), EntryMap{{{0, 0}, hessian}, {{1, 1}, hessian}}); + + data.infinite = true; + OPF::Bus infinite(data); + numberLocally(infinite); + infinite.initialize(state, x.data(), x_lower.data(), x_upper.data()); + success *= isEqual(x_lower[0], BUS_VR) && isEqual(x_upper[0], BUS_VR); + success *= isEqual(x_lower[1], BUS_VI) && isEqual(x_upper[1], BUS_VI); + for (IdxT i = 0; i < infinite.sizeConstraints(); ++i) + { + success *= std::isinf(infinite.constraintLower()[i]) && std::isinf(infinite.constraintUpper()[i]); + } + + return success.report(__func__); + } + + /// Load demand comes from the state, with no entries + TestOutcome load() + { + TestStatus success = true; + + Model::StateData state; + state.buses[Model::busKey(2)].values = {{"vr", 1.01}, {"vi", -0.05}}; + Model::setTerminalCurrent(state, "load_2", 2, 0, 1, -0.6, -0.2); + + OPF::LoadData data; + data.id = "load_2"; + data.buses[OPF::LoadBuses::bus] = 2; + + OPF::Load load(data); + std::vector x = {1.0, 0.0}; + numberLocally(load); + success *= load.initialize(state, x.data(), nullptr, nullptr) == 0; + + std::vector g(load.sizeConstraints(), ZERO); + load.evaluateConstraints(x.data(), g.data()); + success *= isEqual(g[0], -0.6) && isEqual(g[1], -0.2); + + const std::vector lambda(load.sizeConstraints(), ONE); + load.evaluateJacobian(x.data()); + load.evaluateHessian(x.data(), ONE, lambda.data()); + success *= load.jacobian().values.empty() && load.hessian().values.empty(); + + OPF::Load missing(data); + numberLocally(missing); + success *= missing.initialize(Model::StateData{}, x.data(), nullptr, nullptr) != 0; + + return success.report(__func__); + } + + private: + static constexpr const char* BRANCH_ID = "branch_1_2"; + + static constexpr RealT R = 0.02; + static constexpr RealT X = 0.15; + static constexpr RealT G = 0.01; + static constexpr RealT B = 0.3; + static constexpr RealT GMAG = 0.004; + static constexpr RealT BMAG = -0.02; + static constexpr RealT TAP = 1.05; + static constexpr RealT PHASE = 0.1; + static constexpr RealT SMAX = 1.2; + + static constexpr IdxT BRANCH_JACOBIAN_SIZE = 24; + static constexpr IdxT BRANCH_HESSIAN_SIZE = 10; + + static constexpr RealT PMIN = 0.1; + static constexpr RealT PMAX = 0.9; + static constexpr RealT QMIN = -0.4; + static constexpr RealT QMAX = 0.4; + static constexpr RealT C0 = 3.0; + static constexpr RealT C1 = 11.0; + static constexpr RealT C2 = 0.7; + static constexpr RealT SIGMA = 1.7; + + static constexpr RealT SHUNT_G = 0.05; + static constexpr RealT SHUNT_B = 0.3; + + static constexpr RealT VMIN = 0.9; + static constexpr RealT VMAX = 1.1; + static constexpr RealT BUS_VR = 0.99; + static constexpr RealT BUS_VI = 0.1; + + static inline const std::vector BRANCH_X = {1.02, 0.12, 0.96, -0.08}; + static inline const std::vector BRANCH_LAMBDA = {0.3, -0.2, 1.5, -0.7, 2.1, 0.4}; + static inline const std::vector FLAT_START = {1.0, 0.0, 1.0, 0.0}; + static inline const std::vector GENERATOR_X = {0.3, 0.1, 1.01, 0.05}; + static inline const std::vector SHUNT_X = {0.98, 0.1}; + static inline const std::vector SHUNT_LAMBDA = {1.3, -0.6}; + static inline const std::vector BUS_X = {1.02, -0.05}; + static inline const std::vector BUS_LAMBDA = {0.7, -0.4, 1.3, 0.5}; + + // Measured worst errors: power 1.5 eps, Jacobian 54.4 eps, Hessian 11.3 eps + static constexpr RealT POWER_TOL = 2 * std::numeric_limits::epsilon(); + static constexpr RealT JACOBIAN_TOL = 64 * std::numeric_limits::epsilon(); + static constexpr RealT HESSIAN_TOL = 16 * std::numeric_limits::epsilon(); + + static OPF::BranchData opfBranchData() + { + OPF::BranchData data; + data.id = BRANCH_ID; + data.buses[OPF::BranchBuses::bus1] = 1; + data.buses[OPF::BranchBuses::bus2] = 2; + data.parameters[OPF::BranchParameters::R] = R; + data.parameters[OPF::BranchParameters::X] = X; + data.parameters[OPF::BranchParameters::G] = G; + data.parameters[OPF::BranchParameters::B] = B; + data.parameters[OPF::BranchParameters::Gmag] = GMAG; + data.parameters[OPF::BranchParameters::Bmag] = BMAG; + data.parameters[OPF::BranchParameters::tap] = TAP; + data.parameters[OPF::BranchParameters::phase] = PHASE; + data.parameters[OPF::BranchParameters::Smax] = SMAX; + return data; + } + + static OPF::GeneratorData generatorData() + { + OPF::GeneratorData data; + data.id = "gen_1"; + data.buses[OPF::GeneratorBuses::bus] = 1; + data.parameters[OPF::GeneratorParameters::Pmin] = PMIN; + data.parameters[OPF::GeneratorParameters::Pmax] = PMAX; + data.parameters[OPF::GeneratorParameters::Qmin] = QMIN; + data.parameters[OPF::GeneratorParameters::Qmax] = QMAX; + data.parameters[OPF::GeneratorParameters::c0] = C0; + data.parameters[OPF::GeneratorParameters::c1] = C1; + data.parameters[OPF::GeneratorParameters::c2] = C2; + return data; + } + + /** + * @brief Currents into bus 1 and bus 2 from `PhasorDynamics::Branch` + */ + static void pdCurrents(RealT vr1, + RealT vi1, + RealT vr2, + RealT vi2, + RealT& ir1, + RealT& ii1, + RealT& ir2, + RealT& ii2) + { + PD::BranchData data; + data.parameters[PD::BranchParameters::R] = R; + data.parameters[PD::BranchParameters::X] = X; + data.parameters[PD::BranchParameters::G] = G; + data.parameters[PD::BranchParameters::B] = B; + data.parameters[PD::BranchParameters::Gmag] = GMAG; + data.parameters[PD::BranchParameters::Bmag] = BMAG; + data.parameters[PD::BranchParameters::tap] = TAP; + data.parameters[PD::BranchParameters::phase] = PHASE; + + PD::Bus bus1(vr1, vi1); + PD::Bus bus2(vr2, vi2); + bus1.allocate(); + bus1.initialize(); + bus1.evaluateResidual(); + bus2.allocate(); + bus2.initialize(); + bus2.evaluateResidual(); + + PD::Branch branch(&bus1, &bus2, data); + branch.allocate(); + branch.initialize(); + branch.evaluateResidual(); + + ir1 = bus1.Ir(); + ii1 = bus1.Ii(); + ir2 = bus2.Ir(); + ii2 = bus2.Ii(); + } + + /// Local indices are global indices + template + static void numberLocally(ComponentT& component) + { + for (IdxT j = 0; j < component.size(); ++j) + { + component.variableIndices()[j] = j; + } + for (IdxT i = 0; i < component.sizeConstraints(); ++i) + { + component.constraintIndices()[i] = i; + } + } + + /// Initialized component variables set to `values`, tracked by index + template + static std::vector variables(ComponentT& component, + const Model::StateData& state, + const std::vector& values) + { + using ScalarT = typename ComponentT::ScalarT; + + numberLocally(component); + std::vector x(values.size()); + std::vector x_lower(values.size()); + std::vector x_upper(values.size()); + component.initialize(state, x.data(), x_lower.data(), x_upper.data()); + + for (IdxT j = 0; j < values.size(); ++j) + { + x[j] = values[j]; + if constexpr (std::is_same_v) + { + x[j].setVariableNumber(j); + } + } + return x; + } + + /// Entries summed by coordinate + static EntryMap sum(const Enzyme::Sparse::CooEntries& entries) + { + EntryMap result; + for (IdxT k = 0; k < entries.values.size(); ++k) + { + result[{entries.rows[k], entries.cols[k]}] += entries.values[k]; + } + return result; + } + + /// Rows of the summed entries + static std::vector rowsOf(const Enzyme::Sparse::CooEntries& entries, IdxT count) + { + std::vector rows(count); + for (const auto& [coordinate, value] : sum(entries)) + { + rows[coordinate.first][coordinate.second] = value; + } + return rows; + } + + /// Coordinate maps with the same keys and values within `tol` + static bool isEqual(const EntryMap& actual, const EntryMap& expected, RealT tol = std::numeric_limits::epsilon()) + { + bool equal = actual.size() == expected.size(); + for (const auto& [coordinate, value] : expected) + { + const auto entry = actual.find(coordinate); + if (entry == actual.end()) + { + std::cerr << "Entry (" << coordinate.first << ", " << coordinate.second << ") is missing\n"; + equal = false; + } + else + { + equal = isEqual(entry->second, value, tol) && equal; + } + } + return equal; + } + + /// Values within `tol` relative to one plus the reference magnitude + static bool isEqual(RealT value, RealT reference, RealT tol = std::numeric_limits::epsilon()) + { + if (Testing::isEqual(value, reference, tol)) + { + return true; + } + std::cerr << std::setprecision(std::numeric_limits::max_digits10) << value << " differs from " + << reference << " by " << std::abs(value - reference) / (ONE + std::abs(reference)) / std::numeric_limits::epsilon() + << " eps\n"; + return false; + } + + /// Dependency maps with the same keys and values within `tol` + static bool isEqual(const DependencyMap& actual, const DependencyMap& expected, RealT tol) + { + bool equal = actual.size() == expected.size(); + for (const auto& [variable, value] : expected) + { + const auto entry = actual.find(variable); + if (entry == actual.end()) + { + std::cerr << "Derivative with respect to " << variable << " is missing\n"; + equal = false; + } + else + { + equal = isEqual(entry->second, value, tol) && equal; + } + } + return equal; + } + + /// Add `value` at the lower-triangle coordinate of (i, j) + static void addEntry(EntryMap& hessian, IdxT i, IdxT j, RealT value) + { + hessian[{std::max(i, j), std::min(i, j)}] += value; + } + + /// Add `weight` times the lower triangle of the outer product of `gradient` + static void addOuterProduct(EntryMap& hessian, const DependencyMap& gradient, RealT weight) + { + for (const auto& [i, di] : gradient) + { + for (const auto& [j, dj] : gradient) + { + if (i >= j) + { + hessian[{i, j}] += weight * di * dj; + } + } + } + } + + /** + * @brief Add the Hessian of \f$w_P P_k + w_Q Q_k\f$ for the current + * \f$I_k = (g_{k1} + j b_{k1}) V_1 + (g_{k2} + j b_{k2}) V_2\f$ + * + * \f$P_k + j Q_k = V_k I_k^*\f$ is bilinear in the voltages, so each + * admittance adds a constant block. Local indices \f$2m\f$ and + * \f$2m + 1\f$ hold the real and imaginary voltage of bus \f$m + 1\f$. + * + * @param[in] admittance - \f$g_{k1}, b_{k1}, g_{k2}, b_{k2}\f$ + */ + static void addPowerHessian(EntryMap& hessian, + IdxT k, + const std::array& admittance, + RealT weight_p, + RealT weight_q) + { + for (IdxT m = 0; m < 2; ++m) + { + const RealT g = admittance[2 * m]; + const RealT b = admittance[2 * m + 1]; + + // Real and imaginary parts of the weighted admittance (w_P + j w_Q)(g + j b) + const RealT re = weight_p * g - weight_q * b; + const RealT im = weight_p * b + weight_q * g; + + addProduct(hessian, 2 * k, 2 * m, re); + addProduct(hessian, 2 * k, 2 * m + 1, -im); + addProduct(hessian, 2 * k + 1, 2 * m, im); + addProduct(hessian, 2 * k + 1, 2 * m + 1, re); + } + } + + /// Add the Hessian of \f$c x_i x_j\f$ + static void addProduct(EntryMap& hessian, IdxT i, IdxT j, RealT c) + { + RealT scale = ONE; + if (i == j) + { + scale = TWO; + } + addEntry(hessian, i, j, scale * c); + } + }; + } // namespace Testing +} // namespace GridKit diff --git a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp new file mode 100644 index 0000000000..4d1edc74ae --- /dev/null +++ b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp @@ -0,0 +1,528 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace Testing + { + namespace OPF = GridKit::OptimalPowerFlow; + + /** + * @brief System assembly, derivatives, and an Ipopt solve on a three-bus + * network + * + * Generator 1 is cheaper, but the rating of branch 1-2 forces generator + * 3 to cover part of the load at bus 2. + */ + class SystemTests + { + using RealT = double; + using IdxT = size_t; + using VariableT = DependencyTracking::Variable; + using SystemT = OPF::SystemModel; + using TrackedT = OPF::SystemModel; + + public: + /// Balance and magnitude rows at every bus, one reference row, and flow rows at the rated branch only + TestOutcome allocation() + { + TestStatus success = true; + + SystemT system(data(), state()); + success *= system.allocate() == 0; + + // Three buses and two generators with two variables each + success *= system.size() == 10; + success *= system.sizeConstraints() == 12; + + const RealT* g_lower = system.gLower().getData(); + const RealT* g_upper = system.gUpper().getData(); + for (const IdxT i : BALANCE_ROWS) + { + success *= isEqual(g_lower[i], ZERO) && isEqual(g_upper[i], ZERO); + } + for (const IdxT i : MAGNITUDE_ROWS) + { + success *= isEqual(g_lower[i], VMIN * VMIN) && isEqual(g_upper[i], VMAX * VMAX); + } + success *= isEqual(g_lower[REFERENCE_ROW], ZERO) && isEqual(g_upper[REFERENCE_ROW], ZERO); + for (const IdxT i : FLOW_ROWS) + { + success *= std::isinf(g_lower[i]) && isEqual(g_upper[i], SMAX * SMAX); + } + + return success.report(__func__); + } + + /// The lowest-numbered bus keeps its state angle, and the others move + TestOutcome reference() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + success *= optimize(system); + + const RealT* x = system.x().getData(); + + success *= isEqual(x[1], ZERO, BALANCE_TOL); + success *= std::abs(x[3]) > BALANCE_TOL && std::abs(x[5]) > BALANCE_TOL; + + return success.report(__func__); + } + + /// Enzyme system Jacobian equals the dependency-tracking Jacobian + TestOutcome jacobian() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + setVariables(system); + system.evaluateJacobian(); + const auto enzyme = MapFromCsr(system.getCsrJacobian()); + + TrackedT tracked(data(), state()); + tracked.allocate(); + setVariables(tracked); + tracked.evaluateConstraints(); + tracked.evaluateJacobian(); + const auto dependencies = MapFromCsr(tracked.getCsrJacobian()); + + success *= enzyme.size() == dependencies.size(); + for (IdxT i = 0; i < enzyme.size(); ++i) + { + success *= isEqual(enzyme[i], dependencies[i], DERIVATIVE_TOL); + } + + return success.report(__func__); + } + + /// Enzyme objective gradient equals the dependency-tracking gradient + TestOutcome gradient() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + setVariables(system); + system.evaluateGradient(); + + TrackedT tracked(data(), state()); + tracked.allocate(); + setVariables(tracked); + tracked.evaluateObjective(); + tracked.evaluateGradient(); + + const RealT* enzyme = system.gradient().getData(); + const RealT* dependencies = tracked.gradient().getData(); + for (IdxT j = 0; j < system.size(); ++j) + { + success *= isEqual(enzyme[j], dependencies[j], DERIVATIVE_TOL); + } + + return success.report(__func__); + } + + /// The Hessian keeps its pattern and is linear in the factors + TestOutcome hessian() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + setVariables(system); + + const IdxT nnz = system.getCsrHessian()->getNnz(); + const std::vector zeros(system.sizeConstraints(), ZERO); + std::vector lambda(system.sizeConstraints()); + for (IdxT i = 0; i < lambda.size(); ++i) + { + lambda[i] = LAMBDA_SCALE * static_cast(i + 1); + } + + const std::vector objective = hessianValues(system, SIGMA, zeros); + const std::vector constraints = hessianValues(system, ZERO, lambda); + const std::vector lagrangian = hessianValues(system, SIGMA, lambda); + + success *= system.getCsrHessian()->getNnz() == nnz; + success *= objective.size() == nnz && constraints.size() == nnz && lagrangian.size() == nnz; + for (IdxT k = 0; k < nnz; ++k) + { + success *= isEqual(lagrangian[k], objective[k] + constraints[k], DERIVATIVE_TOL); + } + + return success.report(__func__); + } + + /// Ipopt meets the balance with the flow limit binding + TestOutcome solve() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + success *= optimize(system); + + system.evaluateConstraints(); + const RealT* g = system.g().getData(); + for (const IdxT i : BALANCE_ROWS) + { + success *= isEqual(g[i], ZERO, BALANCE_TOL); + } + success *= isEqual(g[FLOW_ROWS[0]], SMAX * SMAX, BALANCE_TOL); + + const RealT* x = system.x().getData(); + + success *= x[6] > x[8]; + success *= x[8] > ZERO; + + return success.report(__func__); + } + + /// The solution state restarts the model at the solution + TestOutcome solutionState() + { + TestStatus success = true; + + SystemT system(data(), state()); + system.allocate(); + optimize(system); + + SystemT restarted(data(), system.solutionState()); + success *= restarted.allocate() == 0; + + const RealT* x = system.x().getData(); + const RealT* x_restart = restarted.x().getData(); + for (IdxT j = 0; j < system.size(); ++j) + { + success *= isEqual(x_restart[j], x[j], STATE_TOL); + } + + return success.report(__func__); + } + + /// Rows end at `;` or the line end, and scalars, cell arrays, and comments are skipped + TestOutcome parseMatpowerData() + { + TestStatus success = true; + + const OPF::MatpowerData matpower = parse(R"(function mpc = test + mpc.baseMVA = 100.0; + mpc.bus_name = { + 'ONE'; + }; + mpc.gen = [ % 1 2 3; + 1 2.5 3; + 4 5 6 + 7 8 9]; + mpc.gencost = [2 0 0 2 1 0]; + )"); + + success *= matpower.matrices.size() == 2; + success *= matpower.matrix("gen") == OPF::MatpowerMatrix{{1.0, 2.5, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}; + success *= matpower.matrix("gencost") == OPF::MatpowerMatrix{{2.0, 0.0, 0.0, 2.0, 1.0, 0.0}}; + + success *= throws([&] + { matpower.matrix("branch"); }); + success *= throws(parse, "mpc.bus = [\n 1 Inf;\n];"); + success *= throws(parse, "mpc.bus = [\n 1 2;\n"); + + return success.report(__func__); + } + + /** + * @brief Buses match by number, in-service branches by their buses in + * order, and in-service generators in order at buses with generators + * + * Branch 2-3 is listed as 3-2, and branch 1-3 has no rating. The + * generator at bus 2 is a static injection, and the first one at bus 3 + * is out of service. + */ + TestOutcome applyMatpowerData() + { + TestStatus success = true; + + OPF::SystemModelData network = data(); + network.branch[0].parameters.erase(OPF::BranchParameters::Smax); + OPF::applyMatpowerData(network, parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, MATPOWER_GENCOST))); + + success *= isEqual(network.bus[0].parameters.at(OPF::BusParameters::Vmin), 0.94); + success *= isEqual(network.bus[0].parameters.at(OPF::BusParameters::Vmax), 1.06); + success *= isEqual(network.bus[1].parameters.at(OPF::BusParameters::Vmin), 0.95); + + success *= isEqual(network.branch[0].parameters.at(OPF::BranchParameters::Smax), 0.6); + success *= isEqual(network.branch[1].parameters.at(OPF::BranchParameters::Smax), 0.9); + success *= !network.branch[2].parameters.contains(OPF::BranchParameters::Smax); + + const auto& gen_1 = network.generator[0].parameters; + + success *= isEqual(gen_1.at(OPF::GeneratorParameters::Pmin), 0.1); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::Pmax), 1.5); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::Qmin), -0.5); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::Qmax), 0.5); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::c0), 5.0); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::c1), 1200.0); + success *= isEqual(gen_1.at(OPF::GeneratorParameters::c2), 100.0); + + const auto& gen_3 = network.generator[1].parameters; + + success *= isEqual(gen_3.at(OPF::GeneratorParameters::Pmin), 0.3); + success *= isEqual(gen_3.at(OPF::GeneratorParameters::Pmax), 1.8); + success *= isEqual(gen_3.at(OPF::GeneratorParameters::c0), 7.0); + success *= isEqual(gen_3.at(OPF::GeneratorParameters::c1), 1400.0); + success *= isEqual(gen_3.at(OPF::GeneratorParameters::c2), 200.0); + + // Extra and missing branches and generators, a piecewise-linear cost, and a cubic cost + const std::string branch_extra = MATPOWER_BRANCH + "\n1 2 0.01 0.1 0 0 0 0 0 0 1"; + const std::string branch_short = "1 2 0.01 0.1 0.02 60 0 0 0 0 1"; + const std::string gen_extra = "1 0 0 50 -50 1 100 1 150 10\n3 0 0 80 -40 1 100 1 90 0\n3 0 0 80 -40 1 100 1 180 30"; + const std::string gen_short = "1 0 0 50 -50 1 100 1 150 10"; + const std::string costs = "2 0 0 3 0.01 12 5;\n2 0 0 2 20 0;\n2 0 0 2 20 0"; + const std::string piecewise = "1 0 0 2 0 0 100 10;\n2 0 0 2 20 0;\n2 0 0 2 20 0;\n2 0 0 2 14 7"; + const std::string cubic = "2 0 0 3 0.01 12 5;\n2 0 0 2 20 0;\n2 0 0 2 20 0;\n2 0 0 4 1 0 14 7"; + + success *= throws(apply, matpowerCase(branch_extra, MATPOWER_GEN, MATPOWER_GENCOST)); + success *= throws(apply, matpowerCase(branch_short, MATPOWER_GEN, MATPOWER_GENCOST)); + success *= throws(apply, matpowerCase(MATPOWER_BRANCH, gen_extra, costs)); + success *= throws(apply, matpowerCase(MATPOWER_BRANCH, gen_short, costs)); + success *= throws(apply, matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, piecewise)); + success *= throws(apply, matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, cubic)); + + return success.report(__func__); + } + + private: + static OPF::MatpowerData parse(const std::string& text) + { + std::istringstream input(text); + return OPF::parseMatpowerData(input); + } + + static void apply(const std::string& text) + { + OPF::SystemModelData network = data(); + OPF::applyMatpowerData(network, parse(text)); + } + + /// MATPOWER case of the `data()` network with the given branch, generator, and cost rows + static std::string matpowerCase(const std::string& branch, const std::string& gen, const std::string& gencost) + { + return "mpc.bus = [\n" + "1 3 0 0 0 0 1 1 0 230 1 1.06 0.94;\n" + "2 1 120 30 0 0 1 1 0 230 1 1.05 0.95;\n" + "3 2 0 0 0 0 1 1 0 230 1 1.04 0.96;\n" + "];\n" + "mpc.branch = [\n" + + branch + "\n];\nmpc.gen = [\n" + gen + "\n];\nmpc.gencost = [\n" + gencost + "\n];\n"; + } + + static inline const std::string MATPOWER_BRANCH = "1 2 0.01 0.1 0.02 60 0 0 0 0 1\n" + "3 2 0.01 0.1 0 90 0 0 0 0 1\n" + "1 3 0.02 0.2 0 0 0 0 0 0 1\n" + "1 3 0.02 0.2 0 50 0 0 0 0 0"; + + static inline const std::string MATPOWER_GEN = "1 0 0 50 -50 1 100 1 150 10\n" + "2 20 0 0 0 1 100 1 20 20\n" + "3 0 0 80 -40 1 100 0 90 0\n" + "3 0 0 80 -40 1 100 1 180 30"; + + static inline const std::string MATPOWER_GENCOST = "2 0 0 3 0.01 12 5;\n" + "2 0 0 2 20 0;\n" + "2 0 0 3 0 0 0;\n" + "2 0 0 4 0 0.02 14 7"; + + /// Values within `tol` relative to one plus the reference magnitude + static bool isEqual(RealT value, RealT reference, RealT tol = std::numeric_limits::epsilon()) + { + if (Testing::isEqual(value, reference, tol)) + { + return true; + } + std::cerr << std::setprecision(std::numeric_limits::max_digits10) << value << " differs from " + << reference << " by " << std::abs(value - reference) / (ONE + std::abs(reference)) / std::numeric_limits::epsilon() + << " eps\n"; + return false; + } + + /// Dependency maps with the same keys and values within `tol` + static bool isEqual(const DependencyTracking::Variable::DependencyMap& actual, + const DependencyTracking::Variable::DependencyMap& expected, + RealT tol) + { + bool equal = actual.size() == expected.size(); + for (const auto& [variable, value] : expected) + { + const auto entry = actual.find(variable); + if (entry == actual.end()) + { + std::cerr << "Derivative with respect to " << variable << " is missing\n"; + equal = false; + } + else + { + equal = isEqual(entry->second, value, tol) && equal; + } + } + return equal; + } + + static constexpr RealT SMAX = 0.6; + static constexpr RealT VMIN = 0.95; + static constexpr RealT VMAX = 1.05; + static constexpr RealT LOAD_P = 1.2; + static constexpr RealT LOAD_Q = 0.3; + static constexpr RealT SIGMA = 0.7; + static constexpr RealT LAMBDA_SCALE = 0.25; + + // Measured worst errors: Jacobian 7.0 eps, gradient and Hessian exact, + // solved balance 5.4e-13, restart 0.3 eps + static constexpr RealT DERIVATIVE_TOL = 8 * std::numeric_limits::epsilon(); + static constexpr RealT BALANCE_TOL = 1.0e-12; + static constexpr RealT STATE_TOL = std::numeric_limits::epsilon(); + + /// Rows of the buses in order, then of the rated branch + static inline const std::vector BALANCE_ROWS = {0, 1, 4, 5, 7, 8}; + static inline const std::vector MAGNITUDE_ROWS = {2, 6, 9}; + static constexpr IdxT REFERENCE_ROW = 3; + static inline const std::vector FLOW_ROWS = {10, 11}; + + /// A point away from the flat start + static inline const std::vector POINT = {1.02, 0.0, 0.97, -0.07, 1.01, -0.03, 0.8, 0.2, 0.4, -0.1}; + + static OPF::SystemModelData data() + { + OPF::SystemModelData data; + + for (IdxT number = 1; number <= 3; ++number) + { + auto& bus = data.bus.emplace_back(); + bus.number = number; + bus.parameters[OPF::BusParameters::Vmin] = VMIN; + bus.parameters[OPF::BusParameters::Vmax] = VMAX; + } + + addBranch(data, "branch_1_2", 1, 2, 0.01, 0.1, 0.02); + addBranch(data, "branch_2_3", 2, 3, 0.01, 0.1, 0.0); + addBranch(data, "branch_1_3", 1, 3, 0.02, 0.2, 0.0); + data.branch[0].parameters[OPF::BranchParameters::Smax] = SMAX; + + addGenerator(data, "gen_1", 1, 10.0); + addGenerator(data, "gen_3", 3, 20.0); + + auto& load = data.load.emplace_back(); + load.id = "load_2"; + load.buses[OPF::LoadBuses::bus] = 2; + + auto& shunt = data.shunt.emplace_back(); + shunt.id = "shunt_3"; + shunt.buses[OPF::ShuntBuses::bus] = 3; + shunt.parameters[OPF::ShuntParameters::B] = 0.1; + + return data; + } + + static void addBranch(OPF::SystemModelData& data, + const char* id, + IdxT bus1, + IdxT bus2, + RealT r, + RealT x, + RealT b) + { + auto& branch = data.branch.emplace_back(); + branch.id = id; + branch.buses[OPF::BranchBuses::bus1] = bus1; + branch.buses[OPF::BranchBuses::bus2] = bus2; + branch.parameters[OPF::BranchParameters::R] = r; + branch.parameters[OPF::BranchParameters::X] = x; + branch.parameters[OPF::BranchParameters::B] = b; + } + + static void addGenerator(OPF::SystemModelData& data, const char* id, IdxT bus, RealT c1) + { + auto& generator = data.generator.emplace_back(); + generator.id = id; + generator.buses[OPF::GeneratorBuses::bus] = bus; + generator.parameters[OPF::GeneratorParameters::Pmin] = 0.0; + generator.parameters[OPF::GeneratorParameters::Pmax] = 2.0; + generator.parameters[OPF::GeneratorParameters::Qmin] = -1.0; + generator.parameters[OPF::GeneratorParameters::Qmax] = 1.0; + generator.parameters[OPF::GeneratorParameters::c1] = c1; + generator.parameters[OPF::GeneratorParameters::c2] = 0.01; + } + + /// Flat start with the load demand + static Model::StateData state() + { + Model::StateData state; + for (IdxT number = 1; number <= 3; ++number) + { + state.buses[Model::busKey(number)].values = {{"vr", ONE}, {"vi", ZERO}}; + } + Model::setTerminalCurrent(state, "load_2", 2, 0, 1, -LOAD_P, -LOAD_Q); + return state; + } + + /// Move the variables to `POINT` + template + static void setVariables(ModelT& system) + { + auto* x = system.x().getData(); + for (IdxT j = 0; j < POINT.size(); ++j) + { + x[j] = POINT[j]; + if constexpr (std::is_same_v) + { + x[j].setVariableNumber(j); + } + } + system.x().setDataUpdated(); + } + + /// Hessian values at `sigma` and `lambda`, or none if the evaluation fails + static std::vector hessianValues(SystemT& system, RealT sigma, const std::vector& lambda) + { + if (system.evaluateHessian(sigma, lambda.data()) != 0) + { + return {}; + } + auto* hessian = system.getCsrHessian(); + return std::vector(hessian->getValues(), hessian->getValues() + hessian->getNnz()); + } + + static bool optimize(SystemT& system) + { + Ipopt::SmartPtr app = IpoptApplicationFactory(); + app->Options()->SetIntegerValue("print_level", 0); + app->Options()->SetNumericValue("bound_relax_factor", 0.0); + app->Options()->SetNumericValue("tol", 1.0e-10); + if (app->Initialize() != Ipopt::Solve_Succeeded) + { + return false; + } + + Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::OptimizationProblem(&system); + return app->OptimizeTNLP(problem) == Ipopt::Solve_Succeeded; + } + }; + } // namespace Testing +} // namespace GridKit diff --git a/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp b/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp new file mode 100644 index 0000000000..c97a53d1d0 --- /dev/null +++ b/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp @@ -0,0 +1,19 @@ +#include "ComponentTests.hpp" + +int main() +{ + GridKit::Testing::TestingResults result; + GridKit::Testing::ComponentTests test; + + result += test.branchPower(); + result += test.branchJacobian(); + result += test.branchHessian(); + result += test.branchPattern(); + result += test.generator(); + result += test.offlineGenerator(); + result += test.shunt(); + result += test.bus(); + result += test.load(); + + return result.summary(); +} diff --git a/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp b/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp new file mode 100644 index 0000000000..6af059d253 --- /dev/null +++ b/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp @@ -0,0 +1,19 @@ +#include "SystemTests.hpp" + +int main() +{ + GridKit::Testing::TestingResults result; + GridKit::Testing::SystemTests test; + + result += test.allocation(); + result += test.reference(); + result += test.jacobian(); + result += test.gradient(); + result += test.hessian(); + result += test.solve(); + result += test.solutionState(); + result += test.parseMatpowerData(); + result += test.applyMatpowerData(); + + return result.summary(); +} diff --git a/tests/UnitTests/PhasorDynamics/CMakeLists.txt b/tests/UnitTests/PhasorDynamics/CMakeLists.txt index b430e75988..933ab27732 100644 --- a/tests/UnitTests/PhasorDynamics/CMakeLists.txt +++ b/tests/UnitTests/PhasorDynamics/CMakeLists.txt @@ -194,6 +194,10 @@ target_link_libraries( configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ThreeBusBasicBad.json ${CMAKE_CURRENT_BINARY_DIR}/ThreeBusBasicBad.json COPYONLY) +add_executable(test_phasor_state runStateTests.cpp) +target_link_libraries( + test_phasor_state GridKit::phasor_dynamics_systemmodel GridKit::testing) + add_executable(test_phasor_system_single_component runSystemSingleComponentTests.cpp) target_link_libraries( test_phasor_system_single_component @@ -234,6 +238,7 @@ add_test( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_test(NAME PhasorDynamicsSystemSingleComponentTest COMMAND test_phasor_system_single_component) add_test(NAME PhasorDynamicsComponentConnectionTest COMMAND test_phasor_component_connection) +add_test(NAME PhasorDynamicsStateTest COMMAND test_phasor_state) install( TARGETS test_phasor_bus @@ -258,4 +263,5 @@ install( test_phasor_system test_phasor_system_single_component test_phasor_component_connection + test_phasor_state RUNTIME DESTINATION bin) diff --git a/tests/UnitTests/PhasorDynamics/StateTests.hpp b/tests/UnitTests/PhasorDynamics/StateTests.hpp new file mode 100644 index 0000000000..1c461fb4a7 --- /dev/null +++ b/tests/UnitTests/PhasorDynamics/StateTests.hpp @@ -0,0 +1,150 @@ +#pragma once + +#include +#include +#include +#include + +#include +#include +#include + +namespace GridKit +{ + namespace Testing + { + /** + * @brief `applyState` and `extractState` on system model data + */ + class StateTests + { + using DataT = PhasorDynamics::SystemModelData; + + public: + /// Applying the extracted state keeps the case operating point + TestOutcome roundTrip() + { + TestStatus success = true; + + const DataT data = caseData(); + Model::StateData state = PhasorDynamics::extractState(data); + + DataT copy = caseData(); + copy.genrou[0].parameters[PhasorDynamics::GenrouParameters::p0] = 0.0; + copy.loadzip[0].parameters[PhasorDynamics::LoadZIPParameters::Pnom] = 0.0; + PhasorDynamics::applyState(copy, state); + + success *= isEqual(copy.bus[1].Vr0, data.bus[1].Vr0) && isEqual(copy.bus[1].Vi0, data.bus[1].Vi0); + success *= isEqual(real(copy.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::p0)), P0); + success *= isEqual(real(copy.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::q0)), Q0); + success *= isEqual(real(copy.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), PNOM); + success *= isEqual(real(copy.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), QNOM); + success *= isEqual(real(copy.branch[0].parameters.at(PhasorDynamics::BranchParameters::tap)), TAP); + + // Power of the LoadZ at its bus voltage + const Model::StateRecord* bus = state.bus(2); + const double v2 = bus->value("vr", 0.0) * bus->value("vr", 0.0) + bus->value("vi", 0.0) * bus->value("vi", 0.0); + double p = 0.0; + double q = 0.0; + success *= Model::terminalPower(state, "loadz_2", 2, 0, 1, p, q); + success *= isEqual(p, -v2 * R / (R * R + X * X)); + success *= isEqual(q, -v2 * X / (R * R + X * X)); + + return success.report(__func__); + } + + /// Open branches and offline shunt loads are removed, offline loads draw nothing + TestOutcome removals() + { + TestStatus success = true; + + DataT data = caseData(); + Model::StateData state = PhasorDynamics::extractState(data); + state.devices["branch_1_2"].flags["open"] = true; + state.devices["loadz_2"].flags["online"] = false; + state.devices["loadzip_2"].flags["online"] = false; + PhasorDynamics::applyState(data, state); + + success *= data.branch.empty(); + success *= data.loadz.empty(); + success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), 0.0); + success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), 0.0); + + return success.report(__func__); + } + + /// Machines cannot be offline yet + TestOutcome offlineMachine() + { + TestStatus success = true; + + success *= throws(applyOfflineMachine); + + return success.report(__func__); + } + + private: + static constexpr double P0 = 0.8; + static constexpr double Q0 = 0.2; + static constexpr double PNOM = 0.7; + static constexpr double QNOM = 0.1; + static constexpr double R = 1.0; + static constexpr double X = 0.5; + static constexpr double TAP = 1.02; + + static double real(const std::variant& value) + { + return std::get(value); + } + + static void applyOfflineMachine() + { + DataT data = caseData(); + Model::StateData state = PhasorDynamics::extractState(data); + state.devices["genrou_1"].flags["online"] = false; + PhasorDynamics::applyState(data, state); + } + + static DataT caseData() + { + using namespace PhasorDynamics; + + DataT data; + data.bus.resize(2); + data.bus[0].bus_id = 1; + data.bus[0].Vr0 = 1.02; + data.bus[0].Vi0 = 0.0; + data.bus[1].bus_id = 2; + data.bus[1].Vr0 = 0.98; + data.bus[1].Vi0 = -0.09; + + auto& branch = data.branch.emplace_back(); + branch.disambiguation_string = "branch_1_2"; + branch.buses[BranchBuses::bus1] = 1; + branch.buses[BranchBuses::bus2] = 2; + branch.parameters[BranchParameters::X] = 0.1; + branch.parameters[BranchParameters::tap] = TAP; + + auto& genrou = data.genrou.emplace_back(); + genrou.disambiguation_string = "genrou_1"; + genrou.buses[GenrouBuses::bus] = 1; + genrou.parameters[GenrouParameters::p0] = P0; + genrou.parameters[GenrouParameters::q0] = Q0; + + auto& loadzip = data.loadzip.emplace_back(); + loadzip.disambiguation_string = "loadzip_2"; + loadzip.buses[LoadZIPBuses::bus] = 2; + loadzip.parameters[LoadZIPParameters::Pnom] = PNOM; + loadzip.parameters[LoadZIPParameters::Qnom] = QNOM; + + auto& loadz = data.loadz.emplace_back(); + loadz.disambiguation_string = "loadz_2"; + loadz.buses[LoadZBuses::bus] = 2; + loadz.parameters[LoadZParameters::R] = R; + loadz.parameters[LoadZParameters::X] = X; + + return data; + } + }; + } // namespace Testing +} // namespace GridKit diff --git a/tests/UnitTests/PhasorDynamics/runStateTests.cpp b/tests/UnitTests/PhasorDynamics/runStateTests.cpp new file mode 100644 index 0000000000..1f8f3d55de --- /dev/null +++ b/tests/UnitTests/PhasorDynamics/runStateTests.cpp @@ -0,0 +1,13 @@ +#include "StateTests.hpp" + +int main() +{ + GridKit::Testing::TestingResults result; + GridKit::Testing::StateTests test; + + result += test.roundTrip(); + result += test.removals(); + result += test.offlineMachine(); + + return result.summary(); +} From 81ba74e6c9a93824afa1af36b0ff050eb4a284f7 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Mon, 28 Sep 2026 13:00:03 -0500 Subject: [PATCH 02/10] Minimize Churn on PhasorDynamics --- GridKit/Model/PhasorDynamics/CMakeLists.txt | 2 - .../Model/PhasorDynamics/ComponentData.hpp | 41 ---- .../Model/PhasorDynamics/SystemModelData.cpp | 188 +----------------- .../Model/PhasorDynamics/SystemModelData.hpp | 23 +-- GridKit/Model/STATE.md | 10 +- .../PhasorDynamics/AnalysisUtilities.hpp | 31 +-- application/PhasorDynamics/CMakeLists.txt | 8 +- .../PhasorDynamics/ContingencyAnalysis.cpp | 5 - .../PhasorDynamics/DynamicSimulation.cpp | 5 - .../PhasorDynamics/OptimalDispatch.cpp | 124 +++++++++--- application/PhasorDynamics/README.md | 15 +- application/PhasorDynamics/StateUtilities.hpp | 125 ++++++++++++ .../PhasorDynamics/OptimalDispatch/README.md | 3 +- .../OptimalPowerFlow/CMakeLists.txt | 8 +- .../OptimalPowerFlow/runSteadyStartTests.cpp | 2 + .../OptimalPowerFlow/ComponentTests.hpp | 4 +- tests/UnitTests/PhasorDynamics/CMakeLists.txt | 8 +- tests/UnitTests/PhasorDynamics/StateTests.hpp | 56 +++--- .../PhasorDynamics/runStateTests.cpp | 2 +- 19 files changed, 298 insertions(+), 362 deletions(-) create mode 100644 application/PhasorDynamics/StateUtilities.hpp diff --git a/GridKit/Model/PhasorDynamics/CMakeLists.txt b/GridKit/Model/PhasorDynamics/CMakeLists.txt index 7fbd1fa976..378e1e96cb 100644 --- a/GridKit/Model/PhasorDynamics/CMakeLists.txt +++ b/GridKit/Model/PhasorDynamics/CMakeLists.txt @@ -69,8 +69,6 @@ gridkit_add_library( GridKit::phasor_dynamics_core PUBLIC GridKit::phasor_dynamics_components - PUBLIC - GridKit::model_state_data INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) gridkit_add_library( diff --git a/GridKit/Model/PhasorDynamics/ComponentData.hpp b/GridKit/Model/PhasorDynamics/ComponentData.hpp index ce6a0098a3..be06bf8282 100644 --- a/GridKit/Model/PhasorDynamics/ComponentData.hpp +++ b/GridKit/Model/PhasorDynamics/ComponentData.hpp @@ -3,13 +3,10 @@ #include #include #include -#include #include #include #include -#include - namespace GridKit { namespace PhasorDynamics @@ -76,43 +73,5 @@ namespace GridKit /// Disambiguation string for this device std::string disambiguation_string; }; - - /** - * @brief Numeric parameter `key` of `data` - * - * @throws std::invalid_argument if the parameter is missing or Boolean - */ - template - typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key) - { - const std::string name = data.disambiguation_string + ": parameter " + std::string(magic_enum::enum_name(key)); - const auto entry = data.parameters.find(key); - if (entry == data.parameters.end()) - { - throw std::invalid_argument(name + " is required"); - } - if (const auto* real_value = std::get_if(&entry->second)) - { - return *real_value; - } - if (const auto* integer_value = std::get_if(&entry->second)) - { - return static_cast(*integer_value); - } - throw std::invalid_argument(name + " must be numeric"); - } - - /** - * @brief Numeric parameter `key` of `data`, or `fallback` if it is not set - */ - template - typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key, typename DataT::RealT fallback) - { - if (!data.parameters.contains(key)) - { - return fallback; - } - return realParameter(data, key); - } } // namespace PhasorDynamics } // namespace GridKit diff --git a/GridKit/Model/PhasorDynamics/SystemModelData.cpp b/GridKit/Model/PhasorDynamics/SystemModelData.cpp index 13fc106038..0dcada8a8f 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelData.cpp +++ b/GridKit/Model/PhasorDynamics/SystemModelData.cpp @@ -1,9 +1,6 @@ #include "SystemModelData.hpp" #include -#include -#include -#include #include @@ -11,78 +8,6 @@ namespace GridKit { namespace PhasorDynamics { - namespace - { - /// Whether the state sets `flag` of device `id` to `value` - bool hasFlag(const Model::StateData& state, const std::string& id, const std::string& flag, bool value) - { - const Model::StateRecord* record = state.device(id); - return record != nullptr && record->flags.contains(flag) && record->flags.at(flag) == value; - } - - /// Remove the devices whose `flag` the state sets to `value` - template - void removeDevices(std::vector& devices, - const Model::StateData& state, - const std::string& flag, - bool value) - { - std::vector kept; - for (auto& device : devices) - { - if (!hasFlag(state, device.disambiguation_string, flag, value)) - { - kept.push_back(std::move(device)); - } - } - devices = std::move(kept); - } - - /// Machine `p0` and `q0` from the power the state injects - template - void applyInjections(std::vector& machines, const Model::StateData& state) - { - using Parameters = typename MachineDataT::Parameters; - using Buses = typename MachineDataT::Buses; - - for (auto& machine : machines) - { - const auto& id = machine.disambiguation_string; - if (hasFlag(state, id, "online", false)) - { - throw std::invalid_argument("Offline machine " + id + " is not supported yet"); - } - - double p = 0.0; - double q = 0.0; - if (Model::terminalPower(state, id, machine.buses.at(Buses::bus), 0, 1, p, q)) - { - machine.parameters[Parameters::p0] = p; - machine.parameters[Parameters::q0] = q; - } - } - } - - /// Machine currents that inject `p0` and `q0` - template - void extractInjections(Model::StateData& state, const std::vector& machines) - { - using Parameters = typename MachineDataT::Parameters; - using Buses = typename MachineDataT::Buses; - - for (const auto& machine : machines) - { - Model::setTerminalCurrent(state, - machine.disambiguation_string, - machine.buses.at(Buses::bus), - 0, - 1, - realParameter(machine, Parameters::p0, 0.0), - realParameter(machine, Parameters::q0, 0.0)); - } - } - } // namespace - SystemModelData parseSystemModelData(std::istream& stream) { SystemModelData data(json::parse(stream)); @@ -107,114 +32,5 @@ namespace GridKit } return parseSystemModelData(stream); } - - void applyState(SystemModelData& data, const Model::StateData& state) - { - for (auto& bus : data.bus) - { - const Model::StateRecord* record = state.bus(bus.bus_id); - if (record != nullptr) - { - bus.Vr0 = record->value("vr", bus.Vr0); - bus.Vi0 = record->value("vi", bus.Vi0); - } - } - - applyInjections(data.genrou, state); - applyInjections(data.gensal, state); - applyInjections(data.genclassical, state); - applyInjections(data.regca, state); - - // LoadZIP anchors at its initial voltage, so it draws Pnom + jQnom at t = 0 - for (auto& load : data.loadzip) - { - const auto& id = load.disambiguation_string; - - double p = 0.0; - double q = 0.0; - bool has_power = Model::terminalPower(state, id, load.buses.at(LoadZIPBuses::bus), 0, 1, p, q); - if (hasFlag(state, id, "online", false)) - { - p = 0.0; - q = 0.0; - has_power = true; - } - - if (has_power) - { - load.parameters[LoadZIPParameters::Pnom] = -p; - load.parameters[LoadZIPParameters::Qnom] = -q; - } - } - - removeDevices(data.loadz, state, "online", false); - removeDevices(data.branch, state, "open", true); - - for (auto& branch : data.branch) - { - const Model::StateRecord* record = state.device(branch.disambiguation_string); - if (record != nullptr) - { - if (record->values.contains("tap")) - { - branch.parameters[BranchParameters::tap] = record->values.at("tap"); - } - if (record->values.contains("phase")) - { - branch.parameters[BranchParameters::phase] = record->values.at("phase"); - } - } - } - } - - Model::StateData extractState(const SystemModelData& data) - { - Model::StateData state; - - for (const auto& bus : data.bus) - { - auto& voltage = state.buses[Model::busKey(bus.bus_id)].values; - voltage["vr"] = bus.Vr0; - voltage["vi"] = bus.Vi0; - } - - extractInjections(state, data.genrou); - extractInjections(state, data.gensal); - extractInjections(state, data.genclassical); - extractInjections(state, data.regca); - - for (const auto& load : data.loadzip) - { - Model::setTerminalCurrent(state, - load.disambiguation_string, - load.buses.at(LoadZIPBuses::bus), - 0, - 1, - -realParameter(load, LoadZIPParameters::Pnom, 0.0), - -realParameter(load, LoadZIPParameters::Qnom, 0.0)); - } - - // Power into the bus is -conj(Y) V^2 with Y = 1 / (R + jX) - for (const auto& load : data.loadz) - { - const size_t number = load.buses.at(LoadZBuses::bus); - const double r = realParameter(load, LoadZParameters::R); - const double x = realParameter(load, LoadZParameters::X); - const double g = r / (r * r + x * x); - const double b = -x / (r * r + x * x); - - const auto& voltage = state.buses.at(Model::busKey(number)).values; - const double v2 = voltage.at("vr") * voltage.at("vr") + voltage.at("vi") * voltage.at("vi"); - - Model::setTerminalCurrent(state, load.disambiguation_string, number, 0, 1, -g * v2, b * v2); - } - - for (const auto& branch : data.branch) - { - auto& settings = state.devices[branch.disambiguation_string].values; - settings["tap"] = realParameter(branch, BranchParameters::tap, 1.0); - settings["phase"] = realParameter(branch, BranchParameters::phase, 0.0); - } - - return state; - } + } // namespace PhasorDynamics +} // namespace GridKit diff --git a/GridKit/Model/PhasorDynamics/SystemModelData.hpp b/GridKit/Model/PhasorDynamics/SystemModelData.hpp index 44c2aa8802..a197f082c6 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelData.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelData.hpp @@ -26,7 +26,6 @@ #include #include #include -#include #include namespace GridKit @@ -133,23 +132,5 @@ namespace GridKit SystemModelData parseSystemModelData(std::istream& stream); SystemModelData parseSystemModelData(std::istream&& stream); SystemModelData parseSystemModelData(const std::filesystem::path& filePath); - - /** - * @brief Write a state into system model data. See `STATE.md`. - * - * Sets bus `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and - * branch `tap`/`phase`. Removes open branches and offline `LoadZ` - * devices. An offline `LoadZIP` draws no power. - * - * @throws std::invalid_argument for an offline machine, which the - * machine models cannot represent yet - */ - void applyState(SystemModelData& data, const Model::StateData& state); - - /** - * @brief Operating state stored in system model data - * - * Gives bus voltages, machine and load currents, and branch `tap` and - * `phase`. - */ - Model::StateData extractState(const SystemModelData& data); + } // namespace PhasorDynamics +} // namespace GridKit diff --git a/GridKit/Model/STATE.md b/GridKit/Model/STATE.md index 438a2a7520..4d76f9fcf2 100644 --- a/GridKit/Model/STATE.md +++ b/GridKit/Model/STATE.md @@ -99,11 +99,11 @@ Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple termina `GridKit/Model/StateData.hpp` reads and writes this format. Device keys are the case `id`. Bus keys are `bus_id_` followed by the bus number. -- `PhasorDynamics::applyState` writes a state into parsed case data: bus +- The application helper `application/PhasorDynamics/StateUtilities.hpp` + applies a state to parsed PhasorDynamics case data: bus `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and branch `tap` and `phase`. Open branches and offline `LoadZ` devices are removed, and an offline `LoadZIP` draws no power. Offline machines are rejected. -- `PhasorDynamics::extractState` returns the operating point stored in a case: - bus voltages, machine and load currents, and branch `tap` and `phase`. -- `OptimalDispatch` reads a state as its starting point and writes the solved - bus voltages and device currents. +- `OptimalDispatch` builds the OPF network and initial state together. It + fills omitted bus voltages and device current pairs from the case, preserves + supplied settings and metadata, and writes solved voltages and currents. diff --git a/application/PhasorDynamics/AnalysisUtilities.hpp b/application/PhasorDynamics/AnalysisUtilities.hpp index e94fe2cac1..26503f4217 100644 --- a/application/PhasorDynamics/AnalysisUtilities.hpp +++ b/application/PhasorDynamics/AnalysisUtilities.hpp @@ -17,6 +17,8 @@ #include #include +#include "StateUtilities.hpp" + namespace GridKit { namespace PhasorDynamics @@ -85,12 +87,6 @@ namespace GridKit std::vector events; /// path to output file fs::path output_file; - /// path to the state file written at the end of the study, or empty for none - fs::path output_state_file; - /// path to the MATPOWER case with limits and costs for optimal dispatch - fs::path dispatch_file; - /// Ipopt options by name for optimal dispatch - ::nlohmann::json ipopt; /// path to reference file for validation fs::path reference_file; /// Error tolerance (between output file and reference file) @@ -122,8 +118,8 @@ namespace GridKit { j.at("state_file").get_to(c.state_file); } - c.dt_monitor = j.value("dt_monitor", 0.0); - c.tmax = j.value("tmax", 0.0); + c.dt_monitor = j.value("dt_monitor", 0.0); + j.at("tmax").get_to(c.tmax); c.rel_tol = j.value("rel_tol", DEFAULT_SOLVER_REL_TOL); c.abs_tol = j.value("abs_tol", DEFAULT_SOLVER_ABS_TOL); c.dt_fixed = j.value("dt_fixed", 0.0); @@ -149,7 +145,7 @@ namespace GridKit } } - for (auto& raw_event : j.value("events", json::array())) + for (auto& raw_event : j.at("events")) { auto& event = c.events.emplace_back(); raw_event.at("time").get_to(event.time); @@ -176,18 +172,6 @@ namespace GridKit j.at("output_file").get_to(c.output_file); } - if (j.contains("output_state_file")) - { - j.at("output_state_file").get_to(c.output_state_file); - } - - if (j.contains("dispatch_file")) - { - j.at("dispatch_file").get_to(c.dispatch_file); - } - - c.ipopt = j.value("ipopt", json::object()); - if (j.contains("reference_file")) { j.at("reference_file").get_to(c.reference_file); @@ -267,14 +251,11 @@ namespace GridKit data.reference_file = loc / data.reference_file; } } + if (!data.state_file.empty() && !data.state_file.is_absolute()) { data.state_file = loc / data.state_file; } - if (!data.dispatch_file.empty() && !data.dispatch_file.is_absolute()) - { - data.dispatch_file = loc / data.dispatch_file; - } auto csv = ::GridKit::Model::VariableMonitorFormat::CSV; data.model_data = parseSystemModelData(data.system_model_file); diff --git a/application/PhasorDynamics/CMakeLists.txt b/application/PhasorDynamics/CMakeLists.txt index a7b96dfc4b..3e0d2d348d 100644 --- a/application/PhasorDynamics/CMakeLists.txt +++ b/application/PhasorDynamics/CMakeLists.txt @@ -2,6 +2,7 @@ add_executable(DynamicSimulation DynamicSimulation.cpp) target_link_libraries( DynamicSimulation PUBLIC GridKit::phasor_dynamics_systemmodel + GridKit::model_state_data GridKit::solvers_dyn GridKit::Utilities GridKit::testing) @@ -13,6 +14,7 @@ add_executable(ContingencyAnalysis ContingencyAnalysis.cpp) target_link_libraries( ContingencyAnalysis PUBLIC GridKit::phasor_dynamics_systemmodel + GridKit::model_state_data GridKit::solvers_dyn GridKit::Utilities GridKit::testing) @@ -26,10 +28,8 @@ if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) OptimalDispatch PUBLIC GridKit::optimal_power_flow_systemmodel GridKit::phasor_dynamics_systemmodel - GridKit::solvers_opt_problem - GridKit::solvers_dyn - GridKit::Utilities - GridKit::testing) + GridKit::model_state_data + GridKit::solvers_opt_problem) target_include_directories(OptimalDispatch PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) install( diff --git a/application/PhasorDynamics/ContingencyAnalysis.cpp b/application/PhasorDynamics/ContingencyAnalysis.cpp index be8796948d..c1a5b61ee2 100644 --- a/application/PhasorDynamics/ContingencyAnalysis.cpp +++ b/application/PhasorDynamics/ContingencyAnalysis.cpp @@ -177,11 +177,6 @@ int runApplication(int argc, const char* argv[]) // Study file checkCommandLine(argc, "ContingencyAnalysis"); auto study_data = parseStudyData(argv[1]); - if (study_data.tmax <= 0.0) - { - Log::error() << "ContingencyAnalysis requires a positive tmax\n"; - return 1; - } const auto start = Clock::now(); diff --git a/application/PhasorDynamics/DynamicSimulation.cpp b/application/PhasorDynamics/DynamicSimulation.cpp index 0d16851377..351a3a1ed1 100644 --- a/application/PhasorDynamics/DynamicSimulation.cpp +++ b/application/PhasorDynamics/DynamicSimulation.cpp @@ -27,11 +27,6 @@ int runApplication(int argc, const char* argv[]) // Study file checkCommandLine(argc, "DynamicSimulation"); auto study = parseStudyData(argv[1]); - if (study.tmax <= 0.0) - { - Log::error() << "DynamicSimulation requires a positive tmax\n"; - return 1; - } using EventType = SystemEvent::Type; diff --git a/application/PhasorDynamics/OptimalDispatch.cpp b/application/PhasorDynamics/OptimalDispatch.cpp index d39ee92bca..02a129f9df 100644 --- a/application/PhasorDynamics/OptimalDispatch.cpp +++ b/application/PhasorDynamics/OptimalDispatch.cpp @@ -5,40 +5,90 @@ */ #include +#include +#include #include #include #include #include +#include #include #include +#include #include #include +#include #include #include - -#include "AnalysisUtilities.hpp" +#include namespace OPF = GridKit::OptimalPowerFlow; namespace PD = GridKit::PhasorDynamics; +namespace fs = std::filesystem; + +using json = nlohmann::json; +using Log = GridKit::Utilities::Logger; +using GridKit::Model::StateData; -using PD::json; -using PD::Log; +/// Numeric case parameter, or its model default if omitted +template +typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key, typename DataT::RealT fallback = 0.0) +{ + const auto entry = data.parameters.find(key); + if (entry == data.parameters.end()) + { + return fallback; + } + if (const auto* value = std::get_if(&entry->second)) + { + return *value; + } + if (const auto* value = std::get_if(&entry->second)) + { + return static_cast(*value); + } + throw std::invalid_argument(data.disambiguation_string + ": parameter " + std::string(magic_enum::enum_name(key)) + " must be numeric"); +} + +/// Preserve a supplied current pair, or initialize it from the case power +void initializeCurrent(StateData& state, const std::string& id, size_t bus, double p, double q) +{ + const auto* record = state.device(id); + const bool has_ir = record != nullptr && record->values.contains("ir"); + const bool has_ii = record != nullptr && record->values.contains("ii"); + if (has_ir != has_ii) + { + throw std::invalid_argument(id + ": state must supply both ir and ii"); + } + if (!has_ir) + { + GridKit::Model::setTerminalCurrent(state, id, bus, 0, 1, p, q); + } +} /** * @brief Dispatchable generators from PhasorDynamics machines */ template -void addGenerators(OPF::SystemModelData<>& data, const std::vector& machines) +void addGenerators(OPF::SystemModelData<>& data, StateData& state, const std::vector& machines) { - using Buses = typename MachineDataT::Buses; + using Buses = typename MachineDataT::Buses; + using Parameters = typename MachineDataT::Parameters; for (const auto& machine : machines) { auto& generator = data.generator.emplace_back(); generator.id = machine.disambiguation_string; generator.buses[OPF::GeneratorBuses::bus] = machine.buses.at(Buses::bus); + + const auto* record = state.device(generator.id); + if (record != nullptr && !record->flag("online", true)) + { + throw std::invalid_argument("Offline machine " + generator.id + " is not supported yet"); + } + initializeCurrent(state, generator.id, machine.buses.at(Buses::bus), realParameter(machine, Parameters::p0), realParameter(machine, Parameters::q0)); } } @@ -46,9 +96,10 @@ void addGenerators(OPF::SystemModelData<>& data, const std::vector * @brief Optimal power flow network of a PhasorDynamics case * * Machines become generators, `LoadZIP` devices fixed loads, and `LoadZ` - * devices shunts. Branches keep the PhasorDynamics parameters. + * devices shunts. Branches keep the PhasorDynamics parameters. Missing state + * voltages and current pairs are initialized from the case in the same pass. */ -OPF::SystemModelData<> network(const PD::SystemModelData<>& grid) +OPF::SystemModelData<> network(const PD::SystemModelData<>& grid, StateData& state) { using BusType = PD::SystemModelData<>::BusDataT::BusType; @@ -60,6 +111,10 @@ OPF::SystemModelData<> network(const PD::SystemModelData<>& grid) auto& record = data.bus.emplace_back(); record.number = bus.bus_id; record.infinite = bus.bus_type == BusType::SLACK; + + auto& voltage = state.buses[GridKit::Model::busKey(bus.bus_id)].values; + voltage.try_emplace("vr", bus.Vr0); + voltage.try_emplace("vi", bus.Vi0); } for (const auto& branch : grid.branch) @@ -71,27 +126,28 @@ OPF::SystemModelData<> network(const PD::SystemModelData<>& grid) for (const auto& key : std::views::keys(branch.parameters)) { const auto parameter = magic_enum::enum_cast(magic_enum::enum_name(key)); - record.parameters[parameter.value()] = PD::realParameter(branch, key); + record.parameters[parameter.value()] = realParameter(branch, key); } } - addGenerators(data, grid.genrou); - addGenerators(data, grid.gensal); - addGenerators(data, grid.genclassical); - addGenerators(data, grid.regca); + addGenerators(data, state, grid.genrou); + addGenerators(data, state, grid.gensal); + addGenerators(data, state, grid.genclassical); + addGenerators(data, state, grid.regca); for (const auto& load : grid.loadzip) { auto& record = data.load.emplace_back(); record.id = load.disambiguation_string; record.buses[OPF::LoadBuses::bus] = load.buses.at(PD::LoadZIPBuses::bus); + initializeCurrent(state, record.id, load.buses.at(PD::LoadZIPBuses::bus), -realParameter(load, PD::LoadZIPParameters::Pnom), -realParameter(load, PD::LoadZIPParameters::Qnom)); } // Y = 1 / (R + jX) for (const auto& load : grid.loadz) { - const double r = PD::realParameter(load, PD::LoadZParameters::R); - const double x = PD::realParameter(load, PD::LoadZParameters::X); + const double r = realParameter(load, PD::LoadZParameters::R, 0.1); + const double x = realParameter(load, PD::LoadZParameters::X, 0.01); auto& record = data.shunt.emplace_back(); record.id = load.disambiguation_string; @@ -133,18 +189,36 @@ void setOptions(Ipopt::IpoptApplication& app, const json& options) int runApplication(int argc, const char* argv[]) { - PD::checkCommandLine(argc, "OptimalDispatch"); - const PD::StudyData study = PD::parseStudyData(argv[1]); - if (study.dispatch_file.empty() || study.output_state_file.empty()) + if (argc < 2) { - Log::error() << "OptimalDispatch requires dispatch_file and output_state_file\n"; + std::cerr << "Usage: OptimalDispatch \n"; return 1; } - OPF::SystemModelData<> data = network(study.model_data); - OPF::applyMatpowerData(data, OPF::parseMatpowerData(study.dispatch_file)); + const fs::path file = argv[1]; + std::ifstream stream(file); + if (!stream) + { + throw std::runtime_error("Could not open dispatch study " + file.string()); + } + const json options = json::parse(stream); + const auto input = [&](const char* key) + { + const auto path = options.at(key).get(); + return path.is_absolute() ? path : file.parent_path() / path; + }; + const auto output = options.at("output_state_file").get(); + const auto grid = PD::parseSystemModelData(input("system_model_file")); + + StateData state; + if (options.contains("state_file") && !options.at("state_file").get().empty()) + { + state = GridKit::Model::parseStateData(input("state_file")); + } + auto data = network(grid, state); + OPF::applyMatpowerData(data, OPF::parseMatpowerData(input("dispatch_file"))); - OPF::SystemModel model(data, PD::extractState(study.model_data)); + OPF::SystemModel model(data, state); if (model.allocate() != 0) { return 1; @@ -153,7 +227,7 @@ int runApplication(int argc, const char* argv[]) // PhasorDynamics initialization rejects limits that relaxed bounds violate Ipopt::SmartPtr app = IpoptApplicationFactory(); app->Options()->SetNumericValue("bound_relax_factor", 0.0); - setOptions(*app, study.ipopt); + setOptions(*app, options.value("ipopt", json::object())); if (app->Initialize() != Ipopt::Solve_Succeeded) { Log::error() << "Ipopt initialization failed\n"; @@ -172,8 +246,8 @@ int runApplication(int argc, const char* argv[]) model.evaluateObjective(); std::cout << "\nOptimal cost " << model.objective() << "\n"; - GridKit::Model::writeStateData(model.solutionState(), study.output_state_file); - std::cout << "State written to " << study.output_state_file << "\n"; + GridKit::Model::writeStateData(model.solutionState(), output); + std::cout << "State written to " << output << "\n"; return 0; } diff --git a/application/PhasorDynamics/README.md b/application/PhasorDynamics/README.md index 3f081267b3..79b87f73ab 100644 --- a/application/PhasorDynamics/README.md +++ b/application/PhasorDynamics/README.md @@ -7,18 +7,15 @@ `system_model_file` | Path to the system model file[^1] `state_file` | Path to a state file[^2] that sets the initial operating point (optional) `dt_monitor` | Monitor output time interval for recorded simulation results (default: 0, no intermediate monitoring) - `tmax` | A floating-point value for max time (required by `DynamicSimulation` and `ContingencyAnalysis`) + `tmax` | A floating-point value for max time `rel_tol` | Relative solver tolerance (default: 1.0e-7) `abs_tol` | Absolute solver tolerance override (default: 1.0e-9) `dt_fixed` | Fixed solver time step size, or 0 for adaptive stepping (default: 0) `max_steps` | Maximum number of solver time steps, 0 for the IDA default, or a negative number for unlimited steps (default: 0) `max_order` | Maximum IDA integration method order from 1 to 5 (default: 5; fixed stepping is capped at 2) `consistent_ic_type` | IDA consistent initial condition calculation type; one of { "y", "ya_ydp" } (default: "ya_ydp") - `events` | An array of event groups (see [Events](#events) below, default: none) + `events` | An array of event groups (see [Events](#events) below) `output_file` | Path to output (CSV) file (optional) - `output_state_file` | Path to the state file[^2] the study writes (required by `OptimalDispatch`) - `dispatch_file` | Path to the MATPOWER case[^3] with limits and costs (required by `OptimalDispatch`) - `ipopt` | Ipopt options by name (optional, `OptimalDispatch` only) `reference_file` | A string containing the name of the case (optional) `error_type` | One of { "relative" (default), "absolute" } `error_tolerance` | A floating-point value for highest allowable total error (default: 1.0e-4) @@ -26,7 +23,6 @@ [^1]: See system model [case format](../../GridKit/Model/PhasorDynamics/INPUT_FORMAT.md) [^2]: See the [state format](../../GridKit/Model/STATE.md) -[^3]: See the optimal power flow [data](../../GridKit/Model/OptimalPowerFlow/README.md#data) ## Events @@ -47,6 +43,13 @@ Each event group describes a system event that occurs at a given time point and costs of its MATPOWER case and writes the solution to `output_state_file`. `DynamicSimulation` starts from that state through `state_file`. +Dispatch requires `system_model_file`, `dispatch_file`, and `output_state_file`; +`state_file` and `ipopt` are optional. See the +[IEEE39 input](../../examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json). +Input paths are relative to the solver file; output is relative to the working +directory. Missing state values use the case operating point; supplied currents +must include both `ir` and `ii`. + ```shell OptimalDispatch IEEE39.solver.json ``` diff --git a/application/PhasorDynamics/StateUtilities.hpp b/application/PhasorDynamics/StateUtilities.hpp new file mode 100644 index 0000000000..8514790229 --- /dev/null +++ b/application/PhasorDynamics/StateUtilities.hpp @@ -0,0 +1,125 @@ +/** + * @file StateUtilities.hpp + * @brief Apply operating states to case data in PhasorDynamics applications. + */ + +#pragma once + +#include +#include +#include + +#include +#include + +namespace GridKit +{ + namespace PhasorDynamics + { + namespace detail + { + inline bool hasFlag(const Model::StateData& state, const std::string& id, const std::string& flag, bool value) + { + const Model::StateRecord* record = state.device(id); + return record != nullptr && record->flags.contains(flag) && record->flags.at(flag) == value; + } + + template + void removeDevices(std::vector& devices, + const Model::StateData& state, + const std::string& flag, + bool value) + { + std::erase_if(devices, [&](const auto& device) + { return hasFlag(state, device.disambiguation_string, flag, value); }); + } + + /// Machine `p0` and `q0` from the power the state injects + template + void applyInjections(std::vector& machines, const Model::StateData& state) + { + using Parameters = typename MachineDataT::Parameters; + using Buses = typename MachineDataT::Buses; + + for (auto& machine : machines) + { + const auto& id = machine.disambiguation_string; + if (hasFlag(state, id, "online", false)) + { + throw std::invalid_argument("Offline machine " + id + " is not supported yet"); + } + + double p = 0.0; + double q = 0.0; + if (Model::terminalPower(state, id, machine.buses.at(Buses::bus), 0, 1, p, q)) + { + machine.parameters[Parameters::p0] = p; + machine.parameters[Parameters::q0] = q; + } + } + } + } // namespace detail + + /** + * @brief Apply voltages, terminal injections, and device settings to a case + */ + inline void applyState(SystemModelData& data, const Model::StateData& state) + { + for (auto& bus : data.bus) + { + const Model::StateRecord* record = state.bus(bus.bus_id); + if (record != nullptr) + { + bus.Vr0 = record->value("vr", bus.Vr0); + bus.Vi0 = record->value("vi", bus.Vi0); + } + } + + detail::applyInjections(data.genrou, state); + detail::applyInjections(data.gensal, state); + detail::applyInjections(data.genclassical, state); + detail::applyInjections(data.regca, state); + + // LoadZIP anchors at its initial voltage, so it draws Pnom + jQnom at t = 0 + for (auto& load : data.loadzip) + { + const auto& id = load.disambiguation_string; + + double p = 0.0; + double q = 0.0; + bool has_power = Model::terminalPower(state, id, load.buses.at(LoadZIPBuses::bus), 0, 1, p, q); + if (detail::hasFlag(state, id, "online", false)) + { + p = 0.0; + q = 0.0; + has_power = true; + } + + if (has_power) + { + load.parameters[LoadZIPParameters::Pnom] = -p; + load.parameters[LoadZIPParameters::Qnom] = -q; + } + } + + detail::removeDevices(data.loadz, state, "online", false); + detail::removeDevices(data.branch, state, "open", true); + + for (auto& branch : data.branch) + { + const Model::StateRecord* record = state.device(branch.disambiguation_string); + if (record != nullptr) + { + if (record->values.contains("tap")) + { + branch.parameters[BranchParameters::tap] = record->values.at("tap"); + } + if (record->values.contains("phase")) + { + branch.parameters[BranchParameters::phase] = record->values.at("phase"); + } + } + } + } + } // namespace PhasorDynamics +} // namespace GridKit diff --git a/examples/PhasorDynamics/OptimalDispatch/README.md b/examples/PhasorDynamics/OptimalDispatch/README.md index af0d204b39..de5da2afe3 100644 --- a/examples/PhasorDynamics/OptimalDispatch/README.md +++ b/examples/PhasorDynamics/OptimalDispatch/README.md @@ -21,7 +21,8 @@ OptimalDispatch IEEE39.solver.json { "system_model_file": "IEEE39.case.json", "state_file": "IEEE39.state.json", - "tmax": 10.0 + "tmax": 10.0, + "events": [] } ``` diff --git a/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt b/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt index b3f46e3035..70dcfb1c70 100644 --- a/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt +++ b/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt @@ -1,6 +1,12 @@ add_executable(test_opf_steady_start runSteadyStartTests.cpp) target_link_libraries( test_opf_steady_start - PRIVATE GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn GridKit::testing) + PRIVATE GridKit::phasor_dynamics_systemmodel + GridKit::model_state_data + GridKit::solvers_dyn + GridKit::testing) +target_include_directories( + test_opf_steady_start + PRIVATE ${CMAKE_SOURCE_DIR}/application/PhasorDynamics) install(TARGETS test_opf_steady_start) diff --git a/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp b/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp index 72144b2339..313ba25117 100644 --- a/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp +++ b/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp @@ -17,6 +17,8 @@ #include #include +#include "StateUtilities.hpp" + namespace { using SystemModelT = GridKit::PhasorDynamics::SystemModel; diff --git a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp index fb7e90a36f..67199bfab7 100644 --- a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp @@ -428,10 +428,10 @@ namespace GridKit static inline const std::vector BUS_X = {1.02, -0.05}; static inline const std::vector BUS_LAMBDA = {0.7, -0.4, 1.3, 0.5}; - // Measured worst errors: power 1.5 eps, Jacobian 54.4 eps, Hessian 11.3 eps + // Allow roundoff in the independent power and derivative references. static constexpr RealT POWER_TOL = 2 * std::numeric_limits::epsilon(); static constexpr RealT JACOBIAN_TOL = 64 * std::numeric_limits::epsilon(); - static constexpr RealT HESSIAN_TOL = 16 * std::numeric_limits::epsilon(); + static constexpr RealT HESSIAN_TOL = 64 * std::numeric_limits::epsilon(); static OPF::BranchData opfBranchData() { diff --git a/tests/UnitTests/PhasorDynamics/CMakeLists.txt b/tests/UnitTests/PhasorDynamics/CMakeLists.txt index 933ab27732..5c77a126ac 100644 --- a/tests/UnitTests/PhasorDynamics/CMakeLists.txt +++ b/tests/UnitTests/PhasorDynamics/CMakeLists.txt @@ -196,7 +196,13 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ThreeBusBasicBad.json add_executable(test_phasor_state runStateTests.cpp) target_link_libraries( - test_phasor_state GridKit::phasor_dynamics_systemmodel GridKit::testing) + test_phasor_state + GridKit::phasor_dynamics_systemmodel + GridKit::model_state_data + GridKit::testing) +target_include_directories( + test_phasor_state + PRIVATE ${CMAKE_SOURCE_DIR}/application/PhasorDynamics) add_executable(test_phasor_system_single_component runSystemSingleComponentTests.cpp) target_link_libraries( diff --git a/tests/UnitTests/PhasorDynamics/StateTests.hpp b/tests/UnitTests/PhasorDynamics/StateTests.hpp index 1c461fb4a7..1d93de424b 100644 --- a/tests/UnitTests/PhasorDynamics/StateTests.hpp +++ b/tests/UnitTests/PhasorDynamics/StateTests.hpp @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -9,46 +8,41 @@ #include #include +#include "StateUtilities.hpp" + namespace GridKit { namespace Testing { /** - * @brief `applyState` and `extractState` on system model data + * @brief Application state initialization of PhasorDynamics case data */ class StateTests { using DataT = PhasorDynamics::SystemModelData; public: - /// Applying the extracted state keeps the case operating point - TestOutcome roundTrip() + /// Supplied voltage, current, and tap values set the case operating point + TestOutcome applyState() { TestStatus success = true; - const DataT data = caseData(); - Model::StateData state = PhasorDynamics::extractState(data); - - DataT copy = caseData(); - copy.genrou[0].parameters[PhasorDynamics::GenrouParameters::p0] = 0.0; - copy.loadzip[0].parameters[PhasorDynamics::LoadZIPParameters::Pnom] = 0.0; - PhasorDynamics::applyState(copy, state); - - success *= isEqual(copy.bus[1].Vr0, data.bus[1].Vr0) && isEqual(copy.bus[1].Vi0, data.bus[1].Vi0); - success *= isEqual(real(copy.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::p0)), P0); - success *= isEqual(real(copy.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::q0)), Q0); - success *= isEqual(real(copy.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), PNOM); - success *= isEqual(real(copy.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), QNOM); - success *= isEqual(real(copy.branch[0].parameters.at(PhasorDynamics::BranchParameters::tap)), TAP); - - // Power of the LoadZ at its bus voltage - const Model::StateRecord* bus = state.bus(2); - const double v2 = bus->value("vr", 0.0) * bus->value("vr", 0.0) + bus->value("vi", 0.0) * bus->value("vi", 0.0); - double p = 0.0; - double q = 0.0; - success *= Model::terminalPower(state, "loadz_2", 2, 0, 1, p, q); - success *= isEqual(p, -v2 * R / (R * R + X * X)); - success *= isEqual(q, -v2 * X / (R * R + X * X)); + DataT data = caseData(); + Model::StateData state; + state.buses[Model::busKey(1)].values = {{"vr", 1.0}, {"vi", 0.0}}; + state.buses[Model::busKey(2)].values = {{"vr", 1.0}, {"vi", -0.1}}; + state.devices["genrou_1"].values = {{"ir", 0.8}, {"ii", -0.2}}; + state.devices["loadzip_2"].values = {{"ir", -0.7}, {"ii", 0.1}}; + state.devices["branch_1_2"].values = {{"tap", 1.05}, {"phase", 0.02}}; + PhasorDynamics::applyState(data, state); + + success *= isEqual(data.bus[1].Vr0, 1.0) && isEqual(data.bus[1].Vi0, -0.1); + success *= isEqual(real(data.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::p0)), 0.8); + success *= isEqual(real(data.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::q0)), 0.2); + success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), 0.71); + success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), 0.03); + success *= isEqual(real(data.branch[0].parameters.at(PhasorDynamics::BranchParameters::tap)), 1.05); + success *= isEqual(real(data.branch[0].parameters.at(PhasorDynamics::BranchParameters::phase)), 0.02); return success.report(__func__); } @@ -58,8 +52,8 @@ namespace GridKit { TestStatus success = true; - DataT data = caseData(); - Model::StateData state = PhasorDynamics::extractState(data); + DataT data = caseData(); + Model::StateData state; state.devices["branch_1_2"].flags["open"] = true; state.devices["loadz_2"].flags["online"] = false; state.devices["loadzip_2"].flags["online"] = false; @@ -99,8 +93,8 @@ namespace GridKit static void applyOfflineMachine() { - DataT data = caseData(); - Model::StateData state = PhasorDynamics::extractState(data); + DataT data = caseData(); + Model::StateData state; state.devices["genrou_1"].flags["online"] = false; PhasorDynamics::applyState(data, state); } diff --git a/tests/UnitTests/PhasorDynamics/runStateTests.cpp b/tests/UnitTests/PhasorDynamics/runStateTests.cpp index 1f8f3d55de..c172eaff43 100644 --- a/tests/UnitTests/PhasorDynamics/runStateTests.cpp +++ b/tests/UnitTests/PhasorDynamics/runStateTests.cpp @@ -5,7 +5,7 @@ int main() GridKit::Testing::TestingResults result; GridKit::Testing::StateTests test; - result += test.roundTrip(); + result += test.applyState(); result += test.removals(); result += test.offlineMachine(); From dd18dcda381067d5f2ec013156fe671b97c53241 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Mon, 28 Sep 2026 14:42:58 -0500 Subject: [PATCH 03/10] clenaup matpower for both models --- .../Model/OptimalPowerFlow/MatpowerData.cpp | 43 ++------ GridKit/Model/OptimalPowerFlow/README.md | 3 +- .../OptimalPowerFlow/SystemModelData.cpp | 7 +- GridKit/Model/PowerFlow/MatpowerParser.hpp | 101 +++++++++++------- .../MatPowerTesting/test_parse_matpower.cpp | 22 ++-- .../OptimalPowerFlow/SystemTests.hpp | 18 +++- 6 files changed, 103 insertions(+), 91 deletions(-) diff --git a/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp b/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp index c081b3f975..797887dc59 100644 --- a/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp +++ b/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp @@ -3,7 +3,6 @@ * @brief MATPOWER case file input. */ -#include #include #include #include @@ -11,6 +10,7 @@ #include #include +#include namespace GridKit { @@ -30,52 +30,25 @@ namespace GridKit { static const std::regex matrix_start(R"(\s*mpc\.(\w+)\s*=\s*\[(.*))"); - MatpowerData data; - MatpowerMatrix* matrix = nullptr; + MatpowerData data; for (std::string line; std::getline(stream, line);) { - std::string text = line.substr(0, line.find('%')); - std::smatch match; - if (matrix == nullptr) + if (!std::regex_match(line, match, matrix_start)) { - if (!std::regex_match(text, match, matrix_start)) - { - continue; - } - matrix = &data.matrices[match[1]]; - text = match[2]; + continue; } - // Rows end at `;` or at the end of the line, and `]` ends the matrix - const size_t end = text.find(']'); - text = text.substr(0, end); - std::replace(text.begin(), text.end(), ';', '\n'); - - std::istringstream rows(text); - for (std::string row; std::getline(rows, row);) - { + auto& matrix = data.matrices[match[1]]; + GridKit::readMatPowerMatrix(stream, line, [&](const std::string& row) + { std::istringstream values(row); std::vector numbers{std::istream_iterator(values), std::istream_iterator()}; if (!values.eof()) { throw std::invalid_argument("MATPOWER matrix row is not numeric: " + row); } - if (!numbers.empty()) - { - matrix->push_back(std::move(numbers)); - } - } - - if (end != std::string::npos) - { - matrix = nullptr; - } - } - - if (matrix != nullptr) - { - throw std::invalid_argument("MATPOWER matrix is not closed by ]"); + matrix.push_back(std::move(numbers)); }); } return data; } diff --git a/GridKit/Model/OptimalPowerFlow/README.md b/GridKit/Model/OptimalPowerFlow/README.md index 2d6ea3f860..668767c3ed 100644 --- a/GridKit/Model/OptimalPowerFlow/README.md +++ b/GridKit/Model/OptimalPowerFlow/README.md @@ -76,7 +76,8 @@ of the same network: - Values in MW, Mvar, and MVA and costs in P [MW] become system base values. `parseMatpowerData` reads every numeric `mpc.` matrix. Rows end at `;` or -at the end of a line, so both MATPOWER and PowerWorld exports read. +at the end of a line, so both MATPOWER and PowerWorld exports read. Matrix +scanning is shared with the PowerFlow reader. ## State diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp index 7f7265365d..8c047fe7ca 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp @@ -54,10 +54,11 @@ namespace GridKit const auto bus = buses.find(number); if (bus == buses.end()) { - throw std::invalid_argument("MATPOWER bus " + std::to_string(number) + " is not in the case"); + throw std::invalid_argument("MATPOWER bus " + std::to_string(number) + " is unknown or repeated"); } bus->second->parameters[BusParameters::Vmin] = row.at(Column::VMIN); bus->second->parameters[BusParameters::Vmax] = row.at(Column::VMAX); + buses.erase(bus); } if (rows.size() != data.bus.size()) @@ -97,6 +98,10 @@ namespace GridKit { branch.parameters[BranchParameters::Smax] = row.at(Column::RATE_A) / mva_base; } + else + { + branch.parameters.erase(BranchParameters::Smax); + } } for (const auto& [buses, list] : branches) diff --git a/GridKit/Model/PowerFlow/MatpowerParser.hpp b/GridKit/Model/PowerFlow/MatpowerParser.hpp index 26c0b79a8e..5ce5e19de5 100644 --- a/GridKit/Model/PowerFlow/MatpowerParser.hpp +++ b/GridKit/Model/PowerFlow/MatpowerParser.hpp @@ -7,6 +7,7 @@ */ #pragma once +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include #include @@ -30,7 +32,7 @@ namespace GridKit "`mpc.version = '2'`." "\n\tOpen brace ('[') must be on the same line as the field for matrix " "initialization." - "\n\tEach row of a matrix must be terminated by a semicolon."}; + "\n\tMatrix rows end at a semicolon or newline."}; /// @endcond @@ -60,7 +62,42 @@ namespace GridKit inline void trim_matlab_comments(std::string& s) { const std::string nothing = ""; - s = std::regex_replace(s, std::regex("%.+"), nothing); + s = std::regex_replace(s, std::regex("%.*"), nothing); + } + + /// Read nonempty rows from a matrix assignment through its closing bracket. + template + void readMatPowerMatrix(std::istream& is, std::string line, ReadRow read_row) + { + const auto start = line.find('['); + if (start == std::string::npos) + { + throw std::invalid_argument(matlab_syntax_error); + } + line.erase(0, start + 1); + + do + { + trim_matlab_comments(line); + const auto end = line.find(']'); + line = line.substr(0, end); + std::replace(line.begin(), line.end(), ';', '\n'); + + std::istringstream rows(line); + for (std::string row; std::getline(rows, row);) + { + if (row.find_first_not_of(" \t\r") != std::string::npos) + { + read_row(row); + } + } + if (end != std::string::npos) + { + return; + } + } while (std::getline(is, line)); + + throw std::invalid_argument("MATPOWER matrix is not closed by ]"); } // Retrieve MATPOWER component from assignment line. @@ -70,7 +107,7 @@ namespace GridKit inline std::string getMatPowerComponent(const std::string& line) { logs() << "Getting matpower component from line\n"; - std::regex pat("mpc.([a-zA-Z]+)\\s*=.+"); + std::regex pat(R"(mpc\.(\w+)\s*=.*)"); std::smatch matches; std::string component; if (std::regex_match(line, matches, pat)) @@ -235,49 +272,41 @@ namespace GridKit // First, parse matrix components if (component == "bus") { - while (std::getline(is, line)) - { - if (line.find("];") != std::string::npos) - break; - BusDataT br; - LoadDataT lr; - readMatPowerBusRow(line, br, lr); + readMatPowerMatrix(is, line, [&](std::string row) + { + row += ';'; + BusDataT br{}; + LoadDataT lr{}; + readMatPowerBusRow(row, br, lr); mp.bus.push_back(std::move(br)); - mp.load.push_back(std::move(lr)); - } + mp.load.push_back(std::move(lr)); }); } else if (component == "gen") { - while (std::getline(is, line)) - { - if (line.find("];") != std::string::npos) - break; - GenDataT gr; - readMatPowerGenRow(gr, line); - mp.gen.push_back(gr); - } + readMatPowerMatrix(is, line, [&](std::string row) + { + row += ';'; + GenDataT gr{}; + readMatPowerGenRow(gr, row); + mp.gen.push_back(gr); }); } else if (component == "branch") { - while (std::getline(is, line)) - { - if (line.find("];") != std::string::npos) - break; - BranchDataT br; - readMatPowerBranchRow(br, line); - mp.branch.push_back(br); - } + readMatPowerMatrix(is, line, [&](std::string row) + { + row += ';'; + BranchDataT br{}; + readMatPowerBranchRow(br, row); + mp.branch.push_back(br); }); } else if (component == "gencost") { - while (std::getline(is, line)) - { - if (line.find("];") != std::string::npos) - break; - GenCostDataT gcr; - readMatPowerGenCostRow(gcr, line); - mp.gencost.push_back(gcr); - } + readMatPowerMatrix(is, line, [&](std::string row) + { + row += ';'; + GenCostDataT gcr{}; + readMatPowerGenCostRow(gcr, row); + mp.gencost.push_back(gcr); }); } // Next, parse scalar components diff --git a/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp b/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp index 659c1cf336..8e7e675c1d 100644 --- a/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp +++ b/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp @@ -39,19 +39,18 @@ mpc.baseMVA = 100; %% bus data % bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin -mpc.bus = [ - 1 2 0 0 0 0 1 1 0 230 1 1.1 0.0; +mpc.bus = [1 2 0 0 0 0 1 1 0 230 1 1.1 0.0; % ] belongs to the comment +% + 2 1 300 98.61 0 0 1 1 0 230 1 1.1 0.0; 3 2 300 98.61 0 0 1 1 0 230 1 1.1 0.0; 4 3 400 131.47 0 0 1 1 0 230 1 1.1 0.0; - 5 2 0 0 0 0 1 1 0 230 1 1.1 0.9; -]; + 5 2 0 0 0 0 1 1 0 230 1 1.1 0.9]; %% generator data % bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf -mpc.gen = [ - 1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0; - 1 170 0 127.5 -127.5 1 100 1 170 0 0 0 0 0 0 0 0 0 0 0 0; +mpc.gen = [1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0; + 1 170 0 127.5 -127.5 1 100 1 170 0 0 0 0 0 0 0 0 0 0 0 0 3 323.49 0 390 -390 1 100 1 520 0 0 0 0 0 0 0 0 0 0 0 0; 4 0 0 150 -150 1 100 1 200 0 0 0 0 0 0 0 0 0 0 0 0; 5 466.51 0 450 -450 1 100 1 600 0 0 0 0 0 0 0 0 0 0 0 0; @@ -59,8 +58,7 @@ mpc.gen = [ %% branch data % fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax -mpc.branch = [ - 1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360; +mpc.branch = [1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360; 1 4 0.00304 0.0304 0.00658 0 0 0 0 0 1 -360 360; 1 5 0.00064 0.0064 0.03126 0 0 0 0 0 1 -360 360; 2 3 0.00108 0.0108 0.01852 0 0 0 0 0 1 -360 360; @@ -72,10 +70,8 @@ mpc.branch = [ %% generator cost data % 1 startup shutdown n x1 y1 ... xn yn % 2 startup shutdown n c(n-1) ... c0 -mpc.gencost = [ - 2 0 0 3 0 14 0; - 2 0 0 3 0 15 0; - 2 0 0 3 0 30 0; +mpc.gencost = [2 0 0 3 0 14 0; + 2 0 0 3 0 15 0; 2 0 0 3 0 30 0; 2 0 0 3 0 40 0; 2 0 0 3 0 10 0; ]; diff --git a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp index 4d1edc74ae..b020248536 100644 --- a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp @@ -230,16 +230,16 @@ namespace GridKit mpc.bus_name = { 'ONE'; }; - mpc.gen = [ % 1 2 3; + mpc.gen = [ % ] 1 2 3; + % 1 2.5 3; - 4 5 6 - 7 8 9]; - mpc.gencost = [2 0 0 2 1 0]; + 4 5 6; 7 8 9]; + mpc.gencost = [2 0.5 0.25 2 1 0]; )"); success *= matpower.matrices.size() == 2; success *= matpower.matrix("gen") == OPF::MatpowerMatrix{{1.0, 2.5, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}; - success *= matpower.matrix("gencost") == OPF::MatpowerMatrix{{2.0, 0.0, 0.0, 2.0, 1.0, 0.0}}; + success *= matpower.matrix("gencost") == OPF::MatpowerMatrix{{2.0, 0.5, 0.25, 2.0, 1.0, 0.0}}; success *= throws([&] { matpower.matrix("branch"); }); @@ -263,6 +263,7 @@ namespace GridKit OPF::SystemModelData network = data(); network.branch[0].parameters.erase(OPF::BranchParameters::Smax); + network.branch[2].parameters[OPF::BranchParameters::Smax] = 0.25; OPF::applyMatpowerData(network, parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, MATPOWER_GENCOST))); success *= isEqual(network.bus[0].parameters.at(OPF::BusParameters::Vmin), 0.94); @@ -291,6 +292,13 @@ namespace GridKit success *= isEqual(gen_3.at(OPF::GeneratorParameters::c1), 1400.0); success *= isEqual(gen_3.at(OPF::GeneratorParameters::c2), 200.0); + auto duplicate = parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, MATPOWER_GENCOST)); + duplicate.matrices.at("bus")[1] = duplicate.matrices.at("bus")[0]; + success *= throws([&]() + { + auto invalid = data(); + OPF::applyMatpowerData(invalid, duplicate); }); + // Extra and missing branches and generators, a piecewise-linear cost, and a cubic cost const std::string branch_extra = MATPOWER_BRANCH + "\n1 2 0.01 0.1 0 0 0 0 0 0 1"; const std::string branch_short = "1 2 0.01 0.1 0.02 60 0 0 0 0 1"; From 51996adf4fb6af77ee578148674daa255d62d0e6 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Mon, 28 Sep 2026 15:00:52 -0500 Subject: [PATCH 04/10] rename to EconomicDispatch and downgrade to an example app --- CHANGELOG.md | 2 +- .../OptimalPowerFlow/Generator/README.md | 2 +- GridKit/Model/OptimalPowerFlow/Load/README.md | 2 +- GridKit/Model/OptimalPowerFlow/README.md | 2 +- .../Model/OptimalPowerFlow/Shunt/README.md | 2 +- GridKit/Model/STATE.md | 2 +- GridKit/Solver/Optimization/CMakeLists.txt | 6 +- .../Optimization/OptimizationProblem.cpp | 230 ------------------ GridKit/Solver/Optimization/SteadyState.cpp | 230 ++++++++++++++++++ ...ptimizationProblem.hpp => SteadyState.hpp} | 6 +- application/PhasorDynamics/CMakeLists.txt | 16 -- application/PhasorDynamics/README.md | 33 --- cases/PhasorDynamics/ACTIVSg2000/README.md | 2 +- cases/PhasorDynamics/Hawaii/README.md | 2 +- cases/PhasorDynamics/IEEE39/README.md | 2 +- examples/CMakeLists.txt | 6 + .../ACTIVSg2000/ACTIVSg2000.solver.json | 0 .../ACTIVSg2000/CMakeLists.txt | 2 + examples/EconomicDispatch/CMakeLists.txt | 49 ++++ .../EconomicDispatch/EconomicDispatch.cpp | 12 +- .../EconomicDispatch/Hawaii/CMakeLists.txt | 2 + .../Hawaii/Hawaii.solver.json | 0 .../EconomicDispatch/IEEE39/CMakeLists.txt | 2 + .../IEEE39/IEEE39.solver.json | 0 examples/EconomicDispatch/README.md | 79 ++++++ examples/PhasorDynamics/CMakeLists.txt | 4 - .../ACTIVSg2000/CMakeLists.txt | 2 - .../OptimalDispatch/CMakeLists.txt | 34 --- .../OptimalDispatch/Hawaii/CMakeLists.txt | 2 - .../OptimalDispatch/IEEE39/CMakeLists.txt | 2 - .../PhasorDynamics/OptimalDispatch/README.md | 51 ---- examples/PhasorDynamics/README.md | 1 - examples/README.md | 2 + .../UnitTests/OptimalPowerFlow/CMakeLists.txt | 2 +- .../OptimalPowerFlow/SystemTests.hpp | 4 +- 35 files changed, 396 insertions(+), 399 deletions(-) delete mode 100644 GridKit/Solver/Optimization/OptimizationProblem.cpp create mode 100644 GridKit/Solver/Optimization/SteadyState.cpp rename GridKit/Solver/Optimization/{OptimizationProblem.hpp => SteadyState.hpp} (96%) rename examples/{PhasorDynamics/OptimalDispatch => EconomicDispatch}/ACTIVSg2000/ACTIVSg2000.solver.json (100%) create mode 100644 examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt create mode 100644 examples/EconomicDispatch/CMakeLists.txt rename application/PhasorDynamics/OptimalDispatch.cpp => examples/EconomicDispatch/EconomicDispatch.cpp (95%) create mode 100644 examples/EconomicDispatch/Hawaii/CMakeLists.txt rename examples/{PhasorDynamics/OptimalDispatch => EconomicDispatch}/Hawaii/Hawaii.solver.json (100%) create mode 100644 examples/EconomicDispatch/IEEE39/CMakeLists.txt rename examples/{PhasorDynamics/OptimalDispatch => EconomicDispatch}/IEEE39/IEEE39.solver.json (100%) create mode 100644 examples/EconomicDispatch/README.md delete mode 100644 examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt delete mode 100644 examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt delete mode 100644 examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt delete mode 100644 examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt delete mode 100644 examples/PhasorDynamics/OptimalDispatch/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc35affe3..5fb6d13d16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,7 +100,7 @@ - Added `Logger::raiseVerbosity()`, which raises the verbosity without lowering a higher level. - Changed most of the core library code outputs to use the Logger instead of `std::cout`/`std::cerr`. - Added the `StateData` reader and writer for the state file format, with `applyState` and `extractState` for PhasorDynamics and a `state_file` option in phasor dynamics solver JSON files. -- Added the `OptimalPowerFlow` model family and the `OptimalDispatch` application, with sparse Enzyme Jacobians and Hessians and an Ipopt interface, to initialize PhasorDynamics at an optimal operating point with the limits and costs of a MATPOWER case. +- Added the `OptimalPowerFlow` model family and the `EconomicDispatch` application, with sparse Enzyme Jacobians and Hessians and an Ipopt interface, to initialize PhasorDynamics at an optimal operating point with the limits and costs of a MATPOWER case. ## v0.1 diff --git a/GridKit/Model/OptimalPowerFlow/Generator/README.md b/GridKit/Model/OptimalPowerFlow/Generator/README.md index 2c23071623..118ee38b6b 100644 --- a/GridKit/Model/OptimalPowerFlow/Generator/README.md +++ b/GridKit/Model/OptimalPowerFlow/Generator/README.md @@ -1,7 +1,7 @@ # Generator Dispatchable active and reactive power injection with a quadratic cost. The -`OptimalDispatch` application makes one for every GENROU, GENSAL, +`EconomicDispatch` application makes one for every GENROU, GENSAL, GenClassical, and REGCA device in the case, with limits and costs from the MATPOWER case on the system base. diff --git a/GridKit/Model/OptimalPowerFlow/Load/README.md b/GridKit/Model/OptimalPowerFlow/Load/README.md index 9eb95f6c2f..697dd5cbb6 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/README.md +++ b/GridKit/Model/OptimalPowerFlow/Load/README.md @@ -1,6 +1,6 @@ # Load -Fixed power demand given by the state. The `OptimalDispatch` application makes +Fixed power demand given by the state. The `EconomicDispatch` application makes one for every LoadZIP device in the case. ## Model Parameters diff --git a/GridKit/Model/OptimalPowerFlow/README.md b/GridKit/Model/OptimalPowerFlow/README.md index 668767c3ed..a0d4bb86d3 100644 --- a/GridKit/Model/OptimalPowerFlow/README.md +++ b/GridKit/Model/OptimalPowerFlow/README.md @@ -61,7 +61,7 @@ objective gradient from dependencies. Tests compare the two. ## Data -`SystemModelData` holds the network. The `OptimalDispatch` application builds +`SystemModelData` holds the network. The `EconomicDispatch` application builds it from a PhasorDynamics case, and `applyMatpowerData` adds limits and costs from a [MATPOWER case](https://matpower.org/docs/ref/matpower/caseformat.html) of the same network: diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/README.md b/GridKit/Model/OptimalPowerFlow/Shunt/README.md index 4d145bed01..46bf6dbc42 100644 --- a/GridKit/Model/OptimalPowerFlow/Shunt/README.md +++ b/GridKit/Model/OptimalPowerFlow/Shunt/README.md @@ -1,6 +1,6 @@ # Shunt -Constant admittance $Y = G + jB$ to ground. The `OptimalDispatch` application +Constant admittance $Y = G + jB$ to ground. The `EconomicDispatch` application makes one for every LoadZ device in the case. ## Model Parameters diff --git a/GridKit/Model/STATE.md b/GridKit/Model/STATE.md index 4d76f9fcf2..1e52d24f6e 100644 --- a/GridKit/Model/STATE.md +++ b/GridKit/Model/STATE.md @@ -104,6 +104,6 @@ case `id`. Bus keys are `bus_id_` followed by the bus number. `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and branch `tap` and `phase`. Open branches and offline `LoadZ` devices are removed, and an offline `LoadZIP` draws no power. Offline machines are rejected. -- `OptimalDispatch` builds the OPF network and initial state together. It +- `EconomicDispatch` builds the OPF network and initial state together. It fills omitted bus voltages and device current pairs from the case, preserves supplied settings and metadata, and writes solved voltages and currents. diff --git a/GridKit/Solver/Optimization/CMakeLists.txt b/GridKit/Solver/Optimization/CMakeLists.txt index 382561ec08..e0cd40c630 100644 --- a/GridKit/Solver/Optimization/CMakeLists.txt +++ b/GridKit/Solver/Optimization/CMakeLists.txt @@ -18,9 +18,9 @@ if(TARGET SUNDIALS::idas) endif() gridkit_add_library( - solvers_opt_problem - SOURCES OptimizationProblem.cpp - HEADERS OptimizationProblem.hpp + solvers_opt_steady + SOURCES SteadyState.cpp + HEADERS SteadyState.hpp LINK_LIBRARIES PUBLIC IPOPT diff --git a/GridKit/Solver/Optimization/OptimizationProblem.cpp b/GridKit/Solver/Optimization/OptimizationProblem.cpp deleted file mode 100644 index 4b1bd1d60c..0000000000 --- a/GridKit/Solver/Optimization/OptimizationProblem.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/** - * @file OptimizationProblem.cpp - * @brief Ipopt problem over a `Model::OptimizationEvaluator`. - */ - -#include "OptimizationProblem.hpp" - -#include - -namespace AnalysisManager -{ - namespace IpoptInterface - { - template - OptimizationProblem::OptimizationProblem(ModelT* model) - : model_(model) - { - } - - template - bool OptimizationProblem::get_nlp_info(Index& n, - Index& m, - Index& nnz_jac_g, - Index& nnz_h_lag, - IndexStyleEnum& index_style) - { - n = static_cast(model_->size()); - m = static_cast(model_->sizeConstraints()); - nnz_jac_g = static_cast(model_->getCsrJacobian()->getNnz()); - nnz_h_lag = static_cast(model_->getCsrHessian()->getNnz()); - index_style = C_STYLE; - - return true; - } - - template - bool OptimizationProblem::get_bounds_info(Index n, - Number* x_l, - Number* x_u, - Index m, - Number* g_l, - Number* g_u) - { - std::copy_n(model_->xLower().getData(), n, x_l); - std::copy_n(model_->xUpper().getData(), n, x_u); - std::copy_n(model_->gLower().getData(), m, g_l); - std::copy_n(model_->gUpper().getData(), m, g_u); - - return true; - } - - template - bool OptimizationProblem::get_starting_point(Index n, - bool init_x, - Number* x, - bool init_z, - [[maybe_unused]] Number* z_L, - [[maybe_unused]] Number* z_U, - [[maybe_unused]] Index m, - bool init_lambda, - [[maybe_unused]] Number* lambda) - { - // Only the variables have a starting point - if (!init_x || init_z || init_lambda) - { - return false; - } - - std::copy_n(model_->x().getData(), n, x); - - return true; - } - - template - bool OptimizationProblem::eval_f([[maybe_unused]] Index n, - const Number* x, - [[maybe_unused]] bool new_x, - Number& obj_value) - { - setVariables(x); - if (model_->evaluateObjective() != 0) - { - return false; - } - - obj_value = model_->objective(); - - return true; - } - - template - bool OptimizationProblem::eval_grad_f(Index n, - const Number* x, - [[maybe_unused]] bool new_x, - Number* grad_f) - { - setVariables(x); - if (model_->evaluateGradient() != 0) - { - return false; - } - - std::copy_n(model_->gradient().getData(), n, grad_f); - - return true; - } - - template - bool OptimizationProblem::eval_g([[maybe_unused]] Index n, - const Number* x, - [[maybe_unused]] bool new_x, - Index m, - Number* g) - { - setVariables(x); - if (model_->evaluateConstraints() != 0) - { - return false; - } - - std::copy_n(model_->g().getData(), m, g); - - return true; - } - - template - bool OptimizationProblem::eval_jac_g([[maybe_unused]] Index n, - const Number* x, - [[maybe_unused]] bool new_x, - [[maybe_unused]] Index m, - Index nele_jac, - Index* iRow, - Index* jCol, - Number* values) - { - if (values == nullptr) - { - structure(*model_->getCsrJacobian(), iRow, jCol); - return true; - } - - setVariables(x); - if (model_->evaluateJacobian() != 0) - { - return false; - } - - std::copy_n(model_->getCsrJacobian()->getValues(), nele_jac, values); - - return true; - } - - template - bool OptimizationProblem::eval_h([[maybe_unused]] Index n, - const Number* x, - [[maybe_unused]] bool new_x, - Number obj_factor, - [[maybe_unused]] Index m, - const Number* lambda, - [[maybe_unused]] bool new_lambda, - Index nele_hess, - Index* iRow, - Index* jCol, - Number* values) - { - if (values == nullptr) - { - structure(*model_->getCsrHessian(), iRow, jCol); - return true; - } - - setVariables(x); - if (model_->evaluateHessian(obj_factor, lambda) != 0) - { - return false; - } - - std::copy_n(model_->getCsrHessian()->getValues(), nele_hess, values); - - return true; - } - - /** - * @brief Leave the final point in the model - */ - template - void OptimizationProblem::finalize_solution([[maybe_unused]] SolverReturn status, - [[maybe_unused]] Index n, - const Number* x, - [[maybe_unused]] const Number* z_L, - [[maybe_unused]] const Number* z_U, - [[maybe_unused]] Index m, - [[maybe_unused]] const Number* g, - [[maybe_unused]] const Number* lambda, - [[maybe_unused]] Number obj_value, - [[maybe_unused]] const IpoptData* ip_data, - [[maybe_unused]] IpoptCalculatedQuantities* ip_cq) - { - setVariables(x); - } - - template - void OptimizationProblem::setVariables(const Number* x) - { - std::copy_n(x, model_->size(), model_->x().getData()); - model_->x().setDataUpdated(); - } - - /** - * @brief Coordinates of the CSR entries in storage order - */ - template - void OptimizationProblem::structure(CsrMatrixT& matrix, Index* iRow, Index* jCol) - { - const IdxT* row_ptrs = matrix.getRowData(); - const IdxT* cols = matrix.getColData(); - for (IdxT row = 0; row < matrix.getNumRows(); ++row) - { - for (IdxT k = row_ptrs[row]; k < row_ptrs[row + 1]; ++k) - { - iRow[k] = static_cast(row); - jCol[k] = static_cast(cols[k]); - } - } - } - - // Available template instantiations - template class OptimizationProblem; - } // namespace IpoptInterface -} // namespace AnalysisManager diff --git a/GridKit/Solver/Optimization/SteadyState.cpp b/GridKit/Solver/Optimization/SteadyState.cpp new file mode 100644 index 0000000000..022516adcf --- /dev/null +++ b/GridKit/Solver/Optimization/SteadyState.cpp @@ -0,0 +1,230 @@ +/** + * @file SteadyState.cpp + * @brief Ipopt problem over a `Model::OptimizationEvaluator`. + */ + +#include "SteadyState.hpp" + +#include + +namespace AnalysisManager +{ + namespace IpoptInterface + { + template + SteadyState::SteadyState(ModelT* model) + : model_(model) + { + } + + template + bool SteadyState::get_nlp_info(Index& n, + Index& m, + Index& nnz_jac_g, + Index& nnz_h_lag, + IndexStyleEnum& index_style) + { + n = static_cast(model_->size()); + m = static_cast(model_->sizeConstraints()); + nnz_jac_g = static_cast(model_->getCsrJacobian()->getNnz()); + nnz_h_lag = static_cast(model_->getCsrHessian()->getNnz()); + index_style = C_STYLE; + + return true; + } + + template + bool SteadyState::get_bounds_info(Index n, + Number* x_l, + Number* x_u, + Index m, + Number* g_l, + Number* g_u) + { + std::copy_n(model_->xLower().getData(), n, x_l); + std::copy_n(model_->xUpper().getData(), n, x_u); + std::copy_n(model_->gLower().getData(), m, g_l); + std::copy_n(model_->gUpper().getData(), m, g_u); + + return true; + } + + template + bool SteadyState::get_starting_point(Index n, + bool init_x, + Number* x, + bool init_z, + [[maybe_unused]] Number* z_L, + [[maybe_unused]] Number* z_U, + [[maybe_unused]] Index m, + bool init_lambda, + [[maybe_unused]] Number* lambda) + { + // Only the variables have a starting point + if (!init_x || init_z || init_lambda) + { + return false; + } + + std::copy_n(model_->x().getData(), n, x); + + return true; + } + + template + bool SteadyState::eval_f([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number& obj_value) + { + setVariables(x); + if (model_->evaluateObjective() != 0) + { + return false; + } + + obj_value = model_->objective(); + + return true; + } + + template + bool SteadyState::eval_grad_f(Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number* grad_f) + { + setVariables(x); + if (model_->evaluateGradient() != 0) + { + return false; + } + + std::copy_n(model_->gradient().getData(), n, grad_f); + + return true; + } + + template + bool SteadyState::eval_g([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Index m, + Number* g) + { + setVariables(x); + if (model_->evaluateConstraints() != 0) + { + return false; + } + + std::copy_n(model_->g().getData(), m, g); + + return true; + } + + template + bool SteadyState::eval_jac_g([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + [[maybe_unused]] Index m, + Index nele_jac, + Index* iRow, + Index* jCol, + Number* values) + { + if (values == nullptr) + { + structure(*model_->getCsrJacobian(), iRow, jCol); + return true; + } + + setVariables(x); + if (model_->evaluateJacobian() != 0) + { + return false; + } + + std::copy_n(model_->getCsrJacobian()->getValues(), nele_jac, values); + + return true; + } + + template + bool SteadyState::eval_h([[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] bool new_x, + Number obj_factor, + [[maybe_unused]] Index m, + const Number* lambda, + [[maybe_unused]] bool new_lambda, + Index nele_hess, + Index* iRow, + Index* jCol, + Number* values) + { + if (values == nullptr) + { + structure(*model_->getCsrHessian(), iRow, jCol); + return true; + } + + setVariables(x); + if (model_->evaluateHessian(obj_factor, lambda) != 0) + { + return false; + } + + std::copy_n(model_->getCsrHessian()->getValues(), nele_hess, values); + + return true; + } + + /** + * @brief Leave the final point in the model + */ + template + void SteadyState::finalize_solution([[maybe_unused]] SolverReturn status, + [[maybe_unused]] Index n, + const Number* x, + [[maybe_unused]] const Number* z_L, + [[maybe_unused]] const Number* z_U, + [[maybe_unused]] Index m, + [[maybe_unused]] const Number* g, + [[maybe_unused]] const Number* lambda, + [[maybe_unused]] Number obj_value, + [[maybe_unused]] const IpoptData* ip_data, + [[maybe_unused]] IpoptCalculatedQuantities* ip_cq) + { + setVariables(x); + } + + template + void SteadyState::setVariables(const Number* x) + { + std::copy_n(x, model_->size(), model_->x().getData()); + model_->x().setDataUpdated(); + } + + /** + * @brief Coordinates of the CSR entries in storage order + */ + template + void SteadyState::structure(CsrMatrixT& matrix, Index* iRow, Index* jCol) + { + const IdxT* row_ptrs = matrix.getRowData(); + const IdxT* cols = matrix.getColData(); + for (IdxT row = 0; row < matrix.getNumRows(); ++row) + { + for (IdxT k = row_ptrs[row]; k < row_ptrs[row + 1]; ++k) + { + iRow[k] = static_cast(row); + jCol[k] = static_cast(cols[k]); + } + } + } + + // Available template instantiations + template class SteadyState; + } // namespace IpoptInterface +} // namespace AnalysisManager diff --git a/GridKit/Solver/Optimization/OptimizationProblem.hpp b/GridKit/Solver/Optimization/SteadyState.hpp similarity index 96% rename from GridKit/Solver/Optimization/OptimizationProblem.hpp rename to GridKit/Solver/Optimization/SteadyState.hpp index d0fad4a87e..257988a84c 100644 --- a/GridKit/Solver/Optimization/OptimizationProblem.hpp +++ b/GridKit/Solver/Optimization/SteadyState.hpp @@ -1,5 +1,5 @@ /** - * @file OptimizationProblem.hpp + * @file SteadyState.hpp * @brief Ipopt problem over a `Model::OptimizationEvaluator`. */ @@ -22,7 +22,7 @@ namespace AnalysisManager * model's `allocate()`. */ template - class OptimizationProblem : public Ipopt::TNLP + class SteadyState : public Ipopt::TNLP { public: using ScalarT = scalar_type; @@ -41,7 +41,7 @@ namespace AnalysisManager * @param[in] model - Allocated model, which holds the solution after * the solve */ - explicit OptimizationProblem(ModelT* model); + explicit SteadyState(ModelT* model); bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style) override; diff --git a/application/PhasorDynamics/CMakeLists.txt b/application/PhasorDynamics/CMakeLists.txt index 3e0d2d348d..54f5a542d1 100644 --- a/application/PhasorDynamics/CMakeLists.txt +++ b/application/PhasorDynamics/CMakeLists.txt @@ -22,22 +22,6 @@ target_include_directories( ContingencyAnalysis PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) -if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) - add_executable(OptimalDispatch OptimalDispatch.cpp) - target_link_libraries( - OptimalDispatch - PUBLIC GridKit::optimal_power_flow_systemmodel - GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data - GridKit::solvers_opt_problem) - target_include_directories(OptimalDispatch - PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) - install( - TARGETS OptimalDispatch - EXPORT gridkit-targets - RUNTIME) -endif() - if(GRIDKIT_ENABLE_OPENMP) target_link_libraries(ContingencyAnalysis PUBLIC OpenMP::OpenMP_CXX) endif() diff --git a/application/PhasorDynamics/README.md b/application/PhasorDynamics/README.md index 79b87f73ab..fac0594315 100644 --- a/application/PhasorDynamics/README.md +++ b/application/PhasorDynamics/README.md @@ -36,36 +36,3 @@ Each event group describes a system event that occurs at a given time point `R` | Fault resistance in per unit (required for "fault_on") `X` | Fault reactance in per unit (required for "fault_on") `device` | `id` of the branch to put in service ("in_service") or take out of service ("out_of_service") - -## Optimal dispatch - -`OptimalDispatch` solves the AC optimal power flow of the case with the limits -and costs of its MATPOWER case and writes the solution to `output_state_file`. -`DynamicSimulation` starts from that state through `state_file`. - -Dispatch requires `system_model_file`, `dispatch_file`, and `output_state_file`; -`state_file` and `ipopt` are optional. See the -[IEEE39 input](../../examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json). -Input paths are relative to the solver file; output is relative to the working -directory. Missing state values use the case operating point; supplied currents -must include both `ir` and `ii`. - -```shell -OptimalDispatch IEEE39.solver.json -``` - - Case device | Optimal power flow component - ---------------------------------------------|----------------------------- - `Bus`, `BusInfinite` | `Bus`, infinite for `BusInfinite` - `Branch` | `Branch` with the same parameters - `Genrou`, `Gensal`, `GenClassical`, `Regca` | `Generator` - `LoadZIP` | `Load` with its demand from the state - `LoadZ` | `Shunt` with $G + jB = 1 / (R + jX)$ - -Controllers, exciters, governors, stabilizers, and faults do not enter the -optimal power flow. PhasorDynamics initialization checks the dispatch against -their limits. - -Ipopt uses exact sparse derivatives. The application sets `bound_relax_factor` -to 0, because PhasorDynamics initialization rejects limits that relaxed bounds -violate. Options under `ipopt` are applied after it. diff --git a/cases/PhasorDynamics/ACTIVSg2000/README.md b/cases/PhasorDynamics/ACTIVSg2000/README.md index 8f8742a726..4eb8ccc5cd 100644 --- a/cases/PhasorDynamics/ACTIVSg2000/README.md +++ b/cases/PhasorDynamics/ACTIVSg2000/README.md @@ -24,7 +24,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/ACTIVSg2000/README.md). -`ACTIVSg2000.m` is MATPOWER `case_ACTIVSg2000`[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). +`ACTIVSg2000.m` is MATPOWER `case_ACTIVSg2000`[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). [^1]: Texas A&M University, [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg2000/). [^2]: MATPOWER, [`case_ACTIVSg2000.m`](https://github.com/MATPOWER/matpower/blob/master/data/case_ACTIVSg2000.m). diff --git a/cases/PhasorDynamics/Hawaii/README.md b/cases/PhasorDynamics/Hawaii/README.md index f6e16ac3fd..2b666d878b 100644 --- a/cases/PhasorDynamics/Hawaii/README.md +++ b/cases/PhasorDynamics/Hawaii/README.md @@ -19,7 +19,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/Hawaii/README.md). -`Hawaii.m` is the MATPOWER export `Hawaii40_20231026.m` of the Hawaii40 case[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). +`Hawaii.m` is the MATPOWER export `Hawaii40_20231026.m` of the Hawaii40 case[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). [^2]: Texas A&M University, [Hawaii40](https://electricgrids.engr.tamu.edu/hawaii40/). diff --git a/cases/PhasorDynamics/IEEE39/README.md b/cases/PhasorDynamics/IEEE39/README.md index 72191510f4..e2172caa61 100644 --- a/cases/PhasorDynamics/IEEE39/README.md +++ b/cases/PhasorDynamics/IEEE39/README.md @@ -14,7 +14,7 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/IEEE39/README.md). -`IEEE39.m` is MATPOWER `case39`[^2], with the limits and costs for [optimal dispatch](../../../examples/PhasorDynamics/OptimalDispatch/README.md). +`IEEE39.m` is MATPOWER `case39`[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). [^2]: MATPOWER, [`case39.m`](https://github.com/MATPOWER/matpower/blob/master/data/case39.m). diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7ad5538710..555ed60fbe 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -59,4 +59,10 @@ if(TARGET SUNDIALS::idas) add_subdirectory(Network) endif() +if(TARGET SUNDIALS::idas + AND GRIDKIT_ENABLE_ENZYME + AND GRIDKIT_ENABLE_IPOPT) + add_subdirectory(EconomicDispatch) +endif() + add_subdirectory(Consumer) diff --git a/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json b/examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json similarity index 100% rename from examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/ACTIVSg2000.solver.json rename to examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json diff --git a/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt b/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt new file mode 100644 index 0000000000..36fa2e198e --- /dev/null +++ b/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 5.1e-11 and drift 4.1e-12 +gridkit_economic_dispatch_example(ACTIVSg2000 1e-10 8e-12) diff --git a/examples/EconomicDispatch/CMakeLists.txt b/examples/EconomicDispatch/CMakeLists.txt new file mode 100644 index 0000000000..854ec80f36 --- /dev/null +++ b/examples/EconomicDispatch/CMakeLists.txt @@ -0,0 +1,49 @@ +add_executable(EconomicDispatch EconomicDispatch.cpp) +target_link_libraries( + EconomicDispatch + PUBLIC GridKit::optimal_power_flow_systemmodel + GridKit::phasor_dynamics_systemmodel + GridKit::model_state_data + GridKit::solvers_opt_steady) +target_include_directories( + EconomicDispatch + PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) +install( + TARGETS EconomicDispatch + EXPORT gridkit-targets + RUNTIME) + +# +# gridkit_economic_dispatch_example( ) +# +# Solve the economic dispatch of `cases/PhasorDynamics/` with the limits +# and costs of its MATPOWER case, and check that PhasorDynamics starts in +# steady state from the solution. The tolerances bound the residual at t = 0 +# and the relative drift over 1 s. +# +function( + gridkit_economic_dispatch_example + case + residual_tol + drift_tol) + gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.case.json) + gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.m) + gridkit_example_add_file(${case}.solver.json) + + add_test( + NAME EconomicDispatch_${case} + COMMAND EconomicDispatch ${case}.solver.json + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_tests_properties(EconomicDispatch_${case} PROPERTIES FIXTURES_SETUP ${case}_dispatch_state) + + add_test( + NAME EconomicDispatch_${case}_steady_start + COMMAND test_opf_steady_start ${case}.case.json ${case}.state.json ${residual_tol} ${drift_tol} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set_tests_properties(EconomicDispatch_${case}_steady_start PROPERTIES FIXTURES_REQUIRED + ${case}_dispatch_state) +endfunction() + +add_subdirectory(IEEE39) +add_subdirectory(Hawaii) +add_subdirectory(ACTIVSg2000) diff --git a/application/PhasorDynamics/OptimalDispatch.cpp b/examples/EconomicDispatch/EconomicDispatch.cpp similarity index 95% rename from application/PhasorDynamics/OptimalDispatch.cpp rename to examples/EconomicDispatch/EconomicDispatch.cpp index 02a129f9df..0f5d4aab0e 100644 --- a/application/PhasorDynamics/OptimalDispatch.cpp +++ b/examples/EconomicDispatch/EconomicDispatch.cpp @@ -1,6 +1,6 @@ /** - * @file OptimalDispatch.cpp - * @brief Optimal dispatch of a PhasorDynamics case, written as its initial + * @file EconomicDispatch.cpp + * @brief Economic dispatch of a PhasorDynamics case, written as its initial * state. */ @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include namespace OPF = GridKit::OptimalPowerFlow; @@ -191,7 +191,7 @@ int runApplication(int argc, const char* argv[]) { if (argc < 2) { - std::cerr << "Usage: OptimalDispatch \n"; + std::cerr << "Usage: EconomicDispatch \n"; return 1; } @@ -234,7 +234,7 @@ int runApplication(int argc, const char* argv[]) return 1; } - Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::OptimizationProblem(&model); + Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::SteadyState(&model); const Ipopt::ApplicationReturnStatus status = app->OptimizeTNLP(problem); if (status != Ipopt::Solve_Succeeded && status != Ipopt::Solved_To_Acceptable_Level) @@ -260,7 +260,7 @@ int main(int argc, const char* argv[]) } catch (const std::exception& error) { - Log::error() << "OptimalDispatch failed: " << error.what() << '\n'; + Log::error() << "EconomicDispatch failed: " << error.what() << '\n'; } return 1; diff --git a/examples/EconomicDispatch/Hawaii/CMakeLists.txt b/examples/EconomicDispatch/Hawaii/CMakeLists.txt new file mode 100644 index 0000000000..287bfd8d8c --- /dev/null +++ b/examples/EconomicDispatch/Hawaii/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 1.3e-13 and drift 2.4e-14 +gridkit_economic_dispatch_example(Hawaii 2.5e-13 5e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json b/examples/EconomicDispatch/Hawaii/Hawaii.solver.json similarity index 100% rename from examples/PhasorDynamics/OptimalDispatch/Hawaii/Hawaii.solver.json rename to examples/EconomicDispatch/Hawaii/Hawaii.solver.json diff --git a/examples/EconomicDispatch/IEEE39/CMakeLists.txt b/examples/EconomicDispatch/IEEE39/CMakeLists.txt new file mode 100644 index 0000000000..f39dd19a85 --- /dev/null +++ b/examples/EconomicDispatch/IEEE39/CMakeLists.txt @@ -0,0 +1,2 @@ +# Measured residual 1.0e-13 and drift 9.3e-15 +gridkit_economic_dispatch_example(IEEE39 2e-13 2e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json b/examples/EconomicDispatch/IEEE39/IEEE39.solver.json similarity index 100% rename from examples/PhasorDynamics/OptimalDispatch/IEEE39/IEEE39.solver.json rename to examples/EconomicDispatch/IEEE39/IEEE39.solver.json diff --git a/examples/EconomicDispatch/README.md b/examples/EconomicDispatch/README.md new file mode 100644 index 0000000000..cf28ddaa24 --- /dev/null +++ b/examples/EconomicDispatch/README.md @@ -0,0 +1,79 @@ +# Economic Dispatch + +Each example solves the optimal power flow of a case in `cases/PhasorDynamics/` +with the limits and costs of its MATPOWER case, writes the solution state, and +checks that PhasorDynamics starts from it in steady state. + + Case | Buses | Generators | Ipopt iterations | Cost [$/h] + --------------|-------|------------|------------------|----------- + `IEEE39` | 39 | 10 | 16 | 40086.9 + `Hawaii` | 37 | 39 | 20 | 4151.17 + `ACTIVSg2000` | 2000 | 334 | 35 | 1.22901e6 + +Build and run the IEEE39 example from the repository root: + +```shell +cmake --build build --target EconomicDispatch -j 10 +cd build/examples/EconomicDispatch/IEEE39 +../EconomicDispatch IEEE39.solver.json +``` + +Use the written state in a dynamics study: + +```json +{ + "system_model_file": "IEEE39.case.json", + "state_file": "IEEE39.state.json", + "tmax": 10.0, + "events": [] +} +``` + +## Input + +Dispatch requires `system_model_file`, `dispatch_file`, and `output_state_file`; +`state_file` and `ipopt` are optional. See the +[IEEE39 input](IEEE39/IEEE39.solver.json). +Input paths are relative to the solver file; output is relative to the working +directory. Missing state values use the case operating point; supplied currents +must include both `ir` and `ii`. + + Case device | Optimal power flow component + ---------------------------------------------|----------------------------- + `Bus`, `BusInfinite` | `Bus`, infinite for `BusInfinite` + `Branch` | `Branch` with the same parameters + `Genrou`, `Gensal`, `GenClassical`, `Regca` | `Generator` + `LoadZIP` | `Load` with its demand from the state + `LoadZ` | `Shunt` with $G + jB = 1 / (R + jX)$ + +Controllers, exciters, governors, stabilizers, and faults do not enter the +optimal power flow. PhasorDynamics initialization checks the dispatch against +their limits. + +Ipopt uses exact sparse derivatives. The application sets `bound_relax_factor` +to 0, because PhasorDynamics initialization rejects limits that relaxed bounds +violate. Options under `ipopt` are applied after it. + +## Pass and fail criteria + +- `EconomicDispatch_` passes when Ipopt converges and the state is + written. +- `EconomicDispatch__steady_start` applies the state to the case and + passes when both of these hold: + - the largest PhasorDynamics residual at $t = 0$ is below its tolerance; + - the largest change of any variable over 1 s, relative to one plus its + initial magnitude, is below its tolerance, with the `DynamicSimulation` + default solver tolerances. + + Case | Residual | Tolerance | Drift | Tolerance + --------------|----------|-----------|---------|---------- + `IEEE39` | 1.0e-13 | 2e-13 | 9.3e-15 | 2e-14 + `Hawaii` | 1.3e-13 | 2.5e-13 | 2.4e-14 | 5e-14 + `ACTIVSg2000` | 5.1e-11 | 1e-10 | 4.1e-12 | 8e-12 + +## Data + +- `IEEE39`: MATPOWER `case39`. +- `Hawaii`: the MATPOWER export of the Texas A&M Hawaii40 case. +- `ACTIVSg2000`: MATPOWER `case_ACTIVSg2000`. The static generators are + `LoadZIP` devices with negative demand in the case, so they stay fixed. diff --git a/examples/PhasorDynamics/CMakeLists.txt b/examples/PhasorDynamics/CMakeLists.txt index f215364ec4..954fc8bf35 100644 --- a/examples/PhasorDynamics/CMakeLists.txt +++ b/examples/PhasorDynamics/CMakeLists.txt @@ -1,7 +1,3 @@ add_subdirectory(DynamicSimulation) add_subdirectory(ContingencyAnalysis) add_subdirectory(Validation) - -if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) - add_subdirectory(OptimalDispatch) -endif() diff --git a/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt deleted file mode 100644 index e3e1ba1d55..0000000000 --- a/examples/PhasorDynamics/OptimalDispatch/ACTIVSg2000/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Measured residual 5.1e-11 and drift 4.1e-12 -gridkit_optimal_dispatch_example(ACTIVSg2000 1e-10 8e-12) diff --git a/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt deleted file mode 100644 index 036180f39a..0000000000 --- a/examples/PhasorDynamics/OptimalDispatch/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# gridkit_optimal_dispatch_example( ) -# -# Solve the optimal dispatch of `cases/PhasorDynamics/` with the limits -# and costs of its MATPOWER case, and check that PhasorDynamics starts in -# steady state from the solution. The tolerances bound the residual at t = 0 -# and the relative drift over 1 s. -# -function( - gridkit_optimal_dispatch_example - case - residual_tol - drift_tol) - gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.case.json) - gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.m) - gridkit_example_add_file(${case}.solver.json) - - add_test( - NAME OptimalDispatch_${case} - COMMAND OptimalDispatch ${case}.solver.json - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - set_tests_properties(OptimalDispatch_${case} PROPERTIES FIXTURES_SETUP ${case}_dispatch_state) - - add_test( - NAME OptimalDispatch_${case}_steady_start - COMMAND test_opf_steady_start ${case}.case.json ${case}.state.json ${residual_tol} ${drift_tol} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - set_tests_properties(OptimalDispatch_${case}_steady_start PROPERTIES FIXTURES_REQUIRED - ${case}_dispatch_state) -endfunction() - -add_subdirectory(IEEE39) -add_subdirectory(Hawaii) -add_subdirectory(ACTIVSg2000) diff --git a/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt deleted file mode 100644 index 4be41c30f4..0000000000 --- a/examples/PhasorDynamics/OptimalDispatch/Hawaii/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Measured residual 1.3e-13 and drift 2.4e-14 -gridkit_optimal_dispatch_example(Hawaii 2.5e-13 5e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt b/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt deleted file mode 100644 index dd6f036cdd..0000000000 --- a/examples/PhasorDynamics/OptimalDispatch/IEEE39/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -# Measured residual 1.0e-13 and drift 9.3e-15 -gridkit_optimal_dispatch_example(IEEE39 2e-13 2e-14) diff --git a/examples/PhasorDynamics/OptimalDispatch/README.md b/examples/PhasorDynamics/OptimalDispatch/README.md deleted file mode 100644 index de5da2afe3..0000000000 --- a/examples/PhasorDynamics/OptimalDispatch/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Optimal Dispatch - -Each example solves the optimal power flow of a case in `cases/PhasorDynamics/` -with the limits and costs of its MATPOWER case, writes the solution state, and -checks that PhasorDynamics starts from it in steady state. - - Case | Buses | Generators | Ipopt iterations | Cost [$/h] - --------------|-------|------------|------------------|----------- - `IEEE39` | 39 | 10 | 16 | 40086.9 - `Hawaii` | 37 | 39 | 20 | 4151.17 - `ACTIVSg2000` | 2000 | 334 | 35 | 1.22901e6 - -Run an example from its build directory, then start a dynamic study from the -solution: - -```shell -OptimalDispatch IEEE39.solver.json -``` - -```json -{ - "system_model_file": "IEEE39.case.json", - "state_file": "IEEE39.state.json", - "tmax": 10.0, - "events": [] -} -``` - -## Pass and fail criteria - -- `OptimalDispatch_` passes when Ipopt converges and the state is - written. -- `OptimalDispatch__steady_start` applies the state to the case and - passes when both of these hold: - - the largest PhasorDynamics residual at $t = 0$ is below its tolerance; - - the largest change of any variable over 1 s, relative to one plus its - initial magnitude, is below its tolerance, with the `DynamicSimulation` - default solver tolerances. - - Case | Residual | Tolerance | Drift | Tolerance - --------------|----------|-----------|---------|---------- - `IEEE39` | 1.0e-13 | 2e-13 | 9.3e-15 | 2e-14 - `Hawaii` | 1.3e-13 | 2.5e-13 | 2.4e-14 | 5e-14 - `ACTIVSg2000` | 5.1e-11 | 1e-10 | 4.1e-12 | 8e-12 - -## Data - -- `IEEE39`: MATPOWER `case39`. -- `Hawaii`: the MATPOWER export of the Texas A&M Hawaii40 case. -- `ACTIVSg2000`: MATPOWER `case_ACTIVSg2000`. The static generators are - `LoadZIP` devices with negative demand in the case, so they stay fixed. diff --git a/examples/PhasorDynamics/README.md b/examples/PhasorDynamics/README.md index 7a838801d0..195283135d 100644 --- a/examples/PhasorDynamics/README.md +++ b/examples/PhasorDynamics/README.md @@ -8,7 +8,6 @@ use the reusable models in `cases/PhasorDynamics/`. | [DynamicSimulation](DynamicSimulation/README.md) | Individual simulation studies. | | [ContingencyAnalysis](ContingencyAnalysis/README.md) | Bus-fault contingency studies. | | [Validation](Validation/README.md) | System studies compared against PowerWorld reference results. | -| [OptimalDispatch](OptimalDispatch/README.md) | Optimal operating points that start PhasorDynamics in steady state. | ## Running a Study diff --git a/examples/README.md b/examples/README.md index 7fd15a9e0d..91033e50d3 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,6 +2,8 @@ GridKit™ usage examples are organized as follows: +- [EconomicDispatch](EconomicDispatch/README.md) solves AC optimal power flow +and writes operating states for PhasorDynamics. - [EMT](EMT/README.md) contains architecture skeletons for future EMT examples. - `Enzyme` directory contains Enzyme automatic differentiation examples. - `Experimental` directory contains examples of dynamic-constrained diff --git a/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt index 1cd8fbd86e..d68abb804b 100644 --- a/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt +++ b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt @@ -15,7 +15,7 @@ if(GRIDKIT_ENABLE_IPOPT) test_opf_system GridKit::optimal_power_flow_systemmodel GridKit::optimal_power_flow_systemmodel_dependency_tracking - GridKit::solvers_opt_problem + GridKit::solvers_opt_steady GridKit::testing) add_test(NAME OptimalPowerFlowSystemTest COMMAND test_opf_system) install(TARGETS test_opf_system) diff --git a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp index b020248536..a2449cc908 100644 --- a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include @@ -528,7 +528,7 @@ namespace GridKit return false; } - Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::OptimizationProblem(&system); + Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::SteadyState(&system); return app->OptimizeTNLP(problem) == Ipopt::Solve_Succeeded; } }; From 2b40e6bd897d1ce918b56296540bdd95963ed2c2 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Mon, 28 Sep 2026 15:27:33 -0500 Subject: [PATCH 05/10] ipopt cmake settings --- CMakeLists.txt | 7 +++-- cmake/Config.cmake.in | 10 +++++-- cmake/FindIpopt.cmake | 26 +++++-------------- examples/Consumer/CMakeLists.txt | 6 +++++ .../GridKitConsumer/CMakeLists.txt.in | 12 +++++++++ examples/EconomicDispatch/README.md | 2 ++ 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 98978ce4b0..1244dfc436 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ endif("${isSystemDir}" STREQUAL "-1") option(BUILD_SHARED_LIBS "Build shared libraries" ON) if(GRIDKIT_ENABLE_IPOPT) - include(FindIpopt) + find_package(Ipopt REQUIRED) enable_language(Fortran) # Needed for linking to HSL endif() @@ -217,7 +217,10 @@ configure_package_config_file( INSTALL_DESTINATION share/cmake/gridkit NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) +# Make the dependency finder available beside the generated package config. +configure_file(cmake/FindIpopt.cmake ${CMAKE_CURRENT_BINARY_DIR}/FindIpopt.cmake COPYONLY) + # Install configuration file install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GridKitConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/GridKitConfigVersion.cmake - DESTINATION share/cmake/gridkit) + ${CMAKE_CURRENT_BINARY_DIR}/FindIpopt.cmake DESTINATION share/cmake/gridkit) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index 3ecd9cb5e6..8b76200944 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -5,8 +5,6 @@ @PACKAGE_INIT@ -include ( "${CMAKE_CURRENT_LIST_DIR}/GridKitTargets.cmake" ) - include(CMakeFindDependencyMacro) set(GridKit_ENABLE_SUNDIALS @GRIDKIT_ENABLE_SUNDIALS@) if(GridKit_ENABLE_SUNDIALS) @@ -14,3 +12,11 @@ if(GridKit_ENABLE_SUNDIALS) enable_language(C) find_dependency(SUNDIALS) endif() + +set(GridKit_ENABLE_IPOPT @GRIDKIT_ENABLE_IPOPT@) +if(GridKit_ENABLE_IPOPT AND NOT TARGET IPOPT) + list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") + find_dependency(Ipopt MODULE) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/GridKitTargets.cmake") diff --git a/cmake/FindIpopt.cmake b/cmake/FindIpopt.cmake index 5dcb63fe58..3763c91461 100644 --- a/cmake/FindIpopt.cmake +++ b/cmake/FindIpopt.cmake @@ -1,7 +1,7 @@ # #[[ -Finds Ipopt include directory and libraries and exports target `Ipopt` +Finds Ipopt include directory and libraries and exports target `IPOPT` User may set: - IPOPT_ROOT_DIR @@ -26,7 +26,6 @@ find_library( if(IPOPT_LIBRARY) set(IPOPT_LIBRARY CACHE FILEPATH "Path to Ipopt library") - message(STATUS "Found Ipopt library: " ${IPOPT_LIBRARY}) get_filename_component( IPOPT_LIBRARY_DIR ${IPOPT_LIBRARY} @@ -56,25 +55,12 @@ find_path( include/coin-or include/coinor) -if(IPOPT_LIBRARY) - message(STATUS "Found Ipopt include: ${IPOPT_INCLUDE_DIR}") - mark_as_advanced(IPOPT_INCLUDE_DIR) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Ipopt REQUIRED_VARS IPOPT_LIBRARY IPOPT_INCLUDE_DIR) +mark_as_advanced(IPOPT_LIBRARY IPOPT_INCLUDE_DIR) + +if(Ipopt_FOUND AND NOT TARGET IPOPT) add_library(IPOPT INTERFACE IMPORTED) target_link_libraries(IPOPT INTERFACE ${IPOPT_LIBRARY}) target_include_directories(IPOPT INTERFACE ${IPOPT_INCLUDE_DIR}) -else() - if(NOT IPOPT_ROOT_DIR) - message(STATUS "Ipopt dir not found! Please provide correct filepath.") - set(IPOPT_DIR - ${IPOPT_DIR} - CACHE PATH "Path to Ipopt installation root.") - unset(IPOPT_INCLUDE_DIR CACHE) - unset(IPOPT_LIBRARY CACHE) - unset(IPOPT_LIBRARY_DIR CACHE) - elseif(NOT IPOPT_LIB) - message(STATUS "Ipopt library not found! Please provide correct filepath.") - endif() - if(IPOPT_ROOT_DIR AND NOT IPOPT_INCLUDE_DIR) - message(STATUS "Ipopt include directory not found! Please provide correct path.") - endif() endif() diff --git a/examples/Consumer/CMakeLists.txt b/examples/Consumer/CMakeLists.txt index f83582258d..2f836d3608 100644 --- a/examples/Consumer/CMakeLists.txt +++ b/examples/Consumer/CMakeLists.txt @@ -36,6 +36,12 @@ else() GridKit::power_elec_microload) endif() +if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) + install(FILES ${CMAKE_SOURCE_DIR}/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp + ${CMAKE_SOURCE_DIR}/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp + DESTINATION ${_rel_consumer_path}/OptimalPowerFlow) +endif() + # Install CMakeLists.txt for example project configure_file(${CMAKE_CURRENT_SOURCE_DIR}/GridKitConsumer/CMakeLists.txt.in ${CMAKE_CURRENT_BINARY_DIR}/GridKitConsumer/CMakeLists.txt @ONLY) diff --git a/examples/Consumer/GridKitConsumer/CMakeLists.txt.in b/examples/Consumer/GridKitConsumer/CMakeLists.txt.in index 647b9cff67..322f17127b 100644 --- a/examples/Consumer/GridKitConsumer/CMakeLists.txt.in +++ b/examples/Consumer/GridKitConsumer/CMakeLists.txt.in @@ -28,3 +28,15 @@ include(CTest) add_test(NAME GridKitConsumer COMMAND consumer WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + +if(TARGET GridKit::optimal_power_flow_systemmodel_dependency_tracking + AND TARGET GridKit::solvers_opt_steady) + add_executable(opf_consumer OptimalPowerFlow/runSystemTests.cpp) + target_link_libraries( + opf_consumer + GridKit::optimal_power_flow_systemmodel + GridKit::optimal_power_flow_systemmodel_dependency_tracking + GridKit::solvers_opt_steady + GridKit::testing) + add_test(NAME GridKitOPFConsumer COMMAND opf_consumer) +endif() diff --git a/examples/EconomicDispatch/README.md b/examples/EconomicDispatch/README.md index cf28ddaa24..9acb00e54c 100644 --- a/examples/EconomicDispatch/README.md +++ b/examples/EconomicDispatch/README.md @@ -38,6 +38,8 @@ Input paths are relative to the solver file; output is relative to the working directory. Missing state values use the case operating point; supplied currents must include both `ir` and `ii`. +Machines marked `online: false` in the input state are currently rejected. + Case device | Optimal power flow component ---------------------------------------------|----------------------------- `Bus`, `BusInfinite` | `Bus`, infinite for `BusInfinite` From 583d1af2fb4cc1ded9f608fa6cb08a46c5aa3c70 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Wed, 14 Oct 2026 20:26:19 -0500 Subject: [PATCH 06/10] remove integration with PhasorDynamics Apps --- .../PhasorDynamics/AnalysisUtilities.hpp | 17 ----------------- application/PhasorDynamics/CMakeLists.txt | 2 -- application/PhasorDynamics/README.md | 2 -- cases/PhasorDynamics/ACTIVSg2000/README.md | 3 --- cases/PhasorDynamics/Hawaii/README.md | 3 --- cases/PhasorDynamics/IEEE39/README.md | 3 --- examples/CMakeLists.txt | 6 ------ examples/README.md | 2 -- tests/IntegrationTests/CMakeLists.txt | 6 ------ tests/UnitTests/PhasorDynamics/CMakeLists.txt | 12 ------------ 10 files changed, 56 deletions(-) diff --git a/application/PhasorDynamics/AnalysisUtilities.hpp b/application/PhasorDynamics/AnalysisUtilities.hpp index 26503f4217..85ed86c188 100644 --- a/application/PhasorDynamics/AnalysisUtilities.hpp +++ b/application/PhasorDynamics/AnalysisUtilities.hpp @@ -17,8 +17,6 @@ #include #include -#include "StateUtilities.hpp" - namespace GridKit { namespace PhasorDynamics @@ -65,8 +63,6 @@ namespace GridKit { /// path to system model JSON file fs::path system_model_file; - /// path to state JSON file, or empty to use the case operating point - fs::path state_file; /// monitor output time step size, or 0 for no intermediate monitoring double dt_monitor; /// max time @@ -114,10 +110,6 @@ namespace GridKit using namespace magic_enum; j.at("system_model_file").get_to(c.system_model_file); - if (j.contains("state_file")) - { - j.at("state_file").get_to(c.state_file); - } c.dt_monitor = j.value("dt_monitor", 0.0); j.at("tmax").get_to(c.tmax); c.rel_tol = j.value("rel_tol", DEFAULT_SOLVER_REL_TOL); @@ -252,17 +244,8 @@ namespace GridKit } } - if (!data.state_file.empty() && !data.state_file.is_absolute()) - { - data.state_file = loc / data.state_file; - } - auto csv = ::GridKit::Model::VariableMonitorFormat::CSV; data.model_data = parseSystemModelData(data.system_model_file); - if (!data.state_file.empty()) - { - applyState(data.model_data, Model::parseStateData(data.state_file)); - } std::string model_output_file; // Find output file (CSV) specified in model input file for (const auto& sink : data.model_data.monitor_sink) diff --git a/application/PhasorDynamics/CMakeLists.txt b/application/PhasorDynamics/CMakeLists.txt index 54f5a542d1..fbe1471b90 100644 --- a/application/PhasorDynamics/CMakeLists.txt +++ b/application/PhasorDynamics/CMakeLists.txt @@ -2,7 +2,6 @@ add_executable(DynamicSimulation DynamicSimulation.cpp) target_link_libraries( DynamicSimulation PUBLIC GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data GridKit::solvers_dyn GridKit::Utilities GridKit::testing) @@ -14,7 +13,6 @@ add_executable(ContingencyAnalysis ContingencyAnalysis.cpp) target_link_libraries( ContingencyAnalysis PUBLIC GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data GridKit::solvers_dyn GridKit::Utilities GridKit::testing) diff --git a/application/PhasorDynamics/README.md b/application/PhasorDynamics/README.md index fac0594315..a14c5fe7ed 100644 --- a/application/PhasorDynamics/README.md +++ b/application/PhasorDynamics/README.md @@ -5,7 +5,6 @@ Name | Value ----------------------|------------------------------------------------------- `system_model_file` | Path to the system model file[^1] - `state_file` | Path to a state file[^2] that sets the initial operating point (optional) `dt_monitor` | Monitor output time interval for recorded simulation results (default: 0, no intermediate monitoring) `tmax` | A floating-point value for max time `rel_tol` | Relative solver tolerance (default: 1.0e-7) @@ -22,7 +21,6 @@ `abs_err_threshold` | A floating-point value for the smallest value at which to scale relative error (default: machine epsilon for double-precision) [^1]: See system model [case format](../../GridKit/Model/PhasorDynamics/INPUT_FORMAT.md) -[^2]: See the [state format](../../GridKit/Model/STATE.md) ## Events diff --git a/cases/PhasorDynamics/ACTIVSg2000/README.md b/cases/PhasorDynamics/ACTIVSg2000/README.md index 4eb8ccc5cd..2cb2f212d6 100644 --- a/cases/PhasorDynamics/ACTIVSg2000/README.md +++ b/cases/PhasorDynamics/ACTIVSg2000/README.md @@ -24,7 +24,4 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/ACTIVSg2000/README.md). -`ACTIVSg2000.m` is MATPOWER `case_ACTIVSg2000`[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). - [^1]: Texas A&M University, [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg2000/). -[^2]: MATPOWER, [`case_ACTIVSg2000.m`](https://github.com/MATPOWER/matpower/blob/master/data/case_ACTIVSg2000.m). diff --git a/cases/PhasorDynamics/Hawaii/README.md b/cases/PhasorDynamics/Hawaii/README.md index 2b666d878b..4ecd11c846 100644 --- a/cases/PhasorDynamics/Hawaii/README.md +++ b/cases/PhasorDynamics/Hawaii/README.md @@ -19,7 +19,4 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/Hawaii/README.md). -`Hawaii.m` is the MATPOWER export `Hawaii40_20231026.m` of the Hawaii40 case[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). - [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). -[^2]: Texas A&M University, [Hawaii40](https://electricgrids.engr.tamu.edu/hawaii40/). diff --git a/cases/PhasorDynamics/IEEE39/README.md b/cases/PhasorDynamics/IEEE39/README.md index e2172caa61..ed71bcc0eb 100644 --- a/cases/PhasorDynamics/IEEE39/README.md +++ b/cases/PhasorDynamics/IEEE39/README.md @@ -14,7 +14,4 @@ Unimplemented models: This case was validated against PowerWorld. The comparison results are provided [here](../../../examples/PhasorDynamics/Validation/IEEE39/README.md). -`IEEE39.m` is MATPOWER `case39`[^2], with the limits and costs for [optimal dispatch](../../../examples/EconomicDispatch/README.md). - [^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). -[^2]: MATPOWER, [`case39.m`](https://github.com/MATPOWER/matpower/blob/master/data/case39.m). diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 555ed60fbe..7ad5538710 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -59,10 +59,4 @@ if(TARGET SUNDIALS::idas) add_subdirectory(Network) endif() -if(TARGET SUNDIALS::idas - AND GRIDKIT_ENABLE_ENZYME - AND GRIDKIT_ENABLE_IPOPT) - add_subdirectory(EconomicDispatch) -endif() - add_subdirectory(Consumer) diff --git a/examples/README.md b/examples/README.md index 91033e50d3..7fd15a9e0d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,8 +2,6 @@ GridKit™ usage examples are organized as follows: -- [EconomicDispatch](EconomicDispatch/README.md) solves AC optimal power flow -and writes operating states for PhasorDynamics. - [EMT](EMT/README.md) contains architecture skeletons for future EMT examples. - `Enzyme` directory contains Enzyme automatic differentiation examples. - `Experimental` directory contains examples of dynamic-constrained diff --git a/tests/IntegrationTests/CMakeLists.txt b/tests/IntegrationTests/CMakeLists.txt index f275d69620..6c0295831d 100644 --- a/tests/IntegrationTests/CMakeLists.txt +++ b/tests/IntegrationTests/CMakeLists.txt @@ -1,7 +1 @@ add_subdirectory(PhasorDynamics) - -if(TARGET SUNDIALS::idas - AND GRIDKIT_ENABLE_ENZYME - AND GRIDKIT_ENABLE_IPOPT) - add_subdirectory(OptimalPowerFlow) -endif() diff --git a/tests/UnitTests/PhasorDynamics/CMakeLists.txt b/tests/UnitTests/PhasorDynamics/CMakeLists.txt index 5c77a126ac..b430e75988 100644 --- a/tests/UnitTests/PhasorDynamics/CMakeLists.txt +++ b/tests/UnitTests/PhasorDynamics/CMakeLists.txt @@ -194,16 +194,6 @@ target_link_libraries( configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ThreeBusBasicBad.json ${CMAKE_CURRENT_BINARY_DIR}/ThreeBusBasicBad.json COPYONLY) -add_executable(test_phasor_state runStateTests.cpp) -target_link_libraries( - test_phasor_state - GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data - GridKit::testing) -target_include_directories( - test_phasor_state - PRIVATE ${CMAKE_SOURCE_DIR}/application/PhasorDynamics) - add_executable(test_phasor_system_single_component runSystemSingleComponentTests.cpp) target_link_libraries( test_phasor_system_single_component @@ -244,7 +234,6 @@ add_test( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_test(NAME PhasorDynamicsSystemSingleComponentTest COMMAND test_phasor_system_single_component) add_test(NAME PhasorDynamicsComponentConnectionTest COMMAND test_phasor_component_connection) -add_test(NAME PhasorDynamicsStateTest COMMAND test_phasor_state) install( TARGETS test_phasor_bus @@ -269,5 +258,4 @@ install( test_phasor_system test_phasor_system_single_component test_phasor_component_connection - test_phasor_state RUNTIME DESTINATION bin) From d4285934559b34e12e07d36d4cd7ec701079123d Mon Sep 17 00:00:00 2001 From: lukelowry Date: Wed, 14 Oct 2026 20:34:41 -0500 Subject: [PATCH 07/10] cleanup uncessary tests --- CHANGELOG.md | 4 +- .../OptimalPowerFlow/Generator/README.md | 2 +- GridKit/Model/OptimalPowerFlow/Load/README.md | 2 +- GridKit/Model/OptimalPowerFlow/README.md | 8 +- .../Model/OptimalPowerFlow/Shunt/README.md | 2 +- GridKit/Model/STATE.md | 17 +-- application/PhasorDynamics/StateUtilities.hpp | 125 --------------- .../ACTIVSg2000/CMakeLists.txt | 3 +- examples/EconomicDispatch/CMakeLists.txt | 20 +-- .../EconomicDispatch/EconomicDispatch.cpp | 4 +- .../EconomicDispatch/Hawaii/CMakeLists.txt | 3 +- .../EconomicDispatch/IEEE39/CMakeLists.txt | 3 +- examples/EconomicDispatch/README.md | 52 ++----- .../OptimalPowerFlow/CMakeLists.txt | 12 -- .../OptimalPowerFlow/runSteadyStartTests.cpp | 98 ------------ tests/UnitTests/PhasorDynamics/StateTests.hpp | 144 ------------------ .../PhasorDynamics/runStateTests.cpp | 13 -- 17 files changed, 34 insertions(+), 478 deletions(-) delete mode 100644 application/PhasorDynamics/StateUtilities.hpp delete mode 100644 tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt delete mode 100644 tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp delete mode 100644 tests/UnitTests/PhasorDynamics/StateTests.hpp delete mode 100644 tests/UnitTests/PhasorDynamics/runStateTests.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fb6d13d16..d509128290 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,8 +99,8 @@ - Added `GridKit_ENABLE_DEVELOPER_MODE` CMake option; in developer mode the Logger defaults to `EVERYTHING` verbosity. - Added `Logger::raiseVerbosity()`, which raises the verbosity without lowering a higher level. - Changed most of the core library code outputs to use the Logger instead of `std::cout`/`std::cerr`. -- Added the `StateData` reader and writer for the state file format, with `applyState` and `extractState` for PhasorDynamics and a `state_file` option in phasor dynamics solver JSON files. -- Added the `OptimalPowerFlow` model family and the `EconomicDispatch` application, with sparse Enzyme Jacobians and Hessians and an Ipopt interface, to initialize PhasorDynamics at an optimal operating point with the limits and costs of a MATPOWER case. +- Added the `StateData` reader and writer for OPF operating states. +- Added the `OptimalPowerFlow` model family, with sparse Enzyme Jacobians and Hessians and a steady-state Ipopt interface. ## v0.1 diff --git a/GridKit/Model/OptimalPowerFlow/Generator/README.md b/GridKit/Model/OptimalPowerFlow/Generator/README.md index 118ee38b6b..f0597753a4 100644 --- a/GridKit/Model/OptimalPowerFlow/Generator/README.md +++ b/GridKit/Model/OptimalPowerFlow/Generator/README.md @@ -1,7 +1,7 @@ # Generator Dispatchable active and reactive power injection with a quadratic cost. The -`EconomicDispatch` application makes one for every GENROU, GENSAL, +`EconomicDispatch` example makes one for every GENROU, GENSAL, GenClassical, and REGCA device in the case, with limits and costs from the MATPOWER case on the system base. diff --git a/GridKit/Model/OptimalPowerFlow/Load/README.md b/GridKit/Model/OptimalPowerFlow/Load/README.md index 697dd5cbb6..968fbb86d5 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/README.md +++ b/GridKit/Model/OptimalPowerFlow/Load/README.md @@ -1,6 +1,6 @@ # Load -Fixed power demand given by the state. The `EconomicDispatch` application makes +Fixed power demand given by the state. The `EconomicDispatch` example makes one for every LoadZIP device in the case. ## Model Parameters diff --git a/GridKit/Model/OptimalPowerFlow/README.md b/GridKit/Model/OptimalPowerFlow/README.md index a0d4bb86d3..66f1608732 100644 --- a/GridKit/Model/OptimalPowerFlow/README.md +++ b/GridKit/Model/OptimalPowerFlow/README.md @@ -1,8 +1,8 @@ # Optimal Power Flow AC optimal power flow in Cartesian coordinates. It finds the least-cost -operating point within the component limits and writes it as a -[state](../STATE.md) that PhasorDynamics starts from. +operating point within the component limits and returns the solution as an +operating [state](../STATE.md). PhasorDynamics initialization is deferred. ## Formulation @@ -61,8 +61,8 @@ objective gradient from dependencies. Tests compare the two. ## Data -`SystemModelData` holds the network. The `EconomicDispatch` application builds -it from a PhasorDynamics case, and `applyMatpowerData` adds limits and costs +`SystemModelData` holds the network supplied by the caller. +`applyMatpowerData` adds limits and costs from a [MATPOWER case](https://matpower.org/docs/ref/matpower/caseformat.html) of the same network: diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/README.md b/GridKit/Model/OptimalPowerFlow/Shunt/README.md index 46bf6dbc42..15cfb7a070 100644 --- a/GridKit/Model/OptimalPowerFlow/Shunt/README.md +++ b/GridKit/Model/OptimalPowerFlow/Shunt/README.md @@ -1,6 +1,6 @@ # Shunt -Constant admittance $Y = G + jB$ to ground. The `EconomicDispatch` application +Constant admittance $Y = G + jB$ to ground. The `EconomicDispatch` example makes one for every LoadZ device in the case. ## Model Parameters diff --git a/GridKit/Model/STATE.md b/GridKit/Model/STATE.md index 1e52d24f6e..221a12ab1f 100644 --- a/GridKit/Model/STATE.md +++ b/GridKit/Model/STATE.md @@ -24,7 +24,7 @@ For example `texas-summer2025.state.json` might be structured as: Each entry gives initial outputs and operating settings. Models use these values and connected inputs to initialize their own state. -Buses own their voltage and shunt outputs. Devices own their terminal current outputs. These values support initialization across PowerFlow, OPF, PhasorDynamics, and EMT. +Buses store their voltages. Devices store their terminal currents and operating settings. ## Bus @@ -41,7 +41,7 @@ RMS voltages use real and imaginary parts: ### ABC State (EMT) -EMT bus entries give instantaneous phase voltages. Device entries give currents. Each model defines any other initial states or history it needs. +Future EMT bus entries would give instantaneous phase voltages and device entries would give currents. Each model would define any other initial states or history it needs. ```json "bus_id_2533":{ @@ -55,7 +55,7 @@ EMT bus entries give instantaneous phase voltages. Device entries give currents. Device entries give initial outputs and settings such as `online`, `open`, `tap`, and `phase`. -Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple terminals. Numbers follow the model's terminal numbering. Currents are positive into each connected bus. Phasor currents use the system base. EMT uses the model's phase output names and units. +Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple terminals. Numbers follow the model's terminal numbering. Currents are positive into each connected bus and use the system base. > At nonzero voltage, convert terminal power to initial current with `I = conj((P + jQ) / V)`. @@ -99,11 +99,6 @@ Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple termina `GridKit/Model/StateData.hpp` reads and writes this format. Device keys are the case `id`. Bus keys are `bus_id_` followed by the bus number. -- The application helper `application/PhasorDynamics/StateUtilities.hpp` - applies a state to parsed PhasorDynamics case data: bus - `Vr0`/`Vi0`, machine `p0`/`q0`, `LoadZIP` `Pnom`/`Qnom`, and branch `tap` - and `phase`. Open branches and offline `LoadZ` devices are removed, and an - offline `LoadZIP` draws no power. Offline machines are rejected. -- `EconomicDispatch` builds the OPF network and initial state together. It - fills omitted bus voltages and device current pairs from the case, preserves - supplied settings and metadata, and writes solved voltages and currents. +`OptimalPowerFlow::SystemModel` reads the starting point, load demand, and +device settings from the state. `solutionState()` returns the state with +solved bus voltages and device terminal currents. diff --git a/application/PhasorDynamics/StateUtilities.hpp b/application/PhasorDynamics/StateUtilities.hpp deleted file mode 100644 index 8514790229..0000000000 --- a/application/PhasorDynamics/StateUtilities.hpp +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @file StateUtilities.hpp - * @brief Apply operating states to case data in PhasorDynamics applications. - */ - -#pragma once - -#include -#include -#include - -#include -#include - -namespace GridKit -{ - namespace PhasorDynamics - { - namespace detail - { - inline bool hasFlag(const Model::StateData& state, const std::string& id, const std::string& flag, bool value) - { - const Model::StateRecord* record = state.device(id); - return record != nullptr && record->flags.contains(flag) && record->flags.at(flag) == value; - } - - template - void removeDevices(std::vector& devices, - const Model::StateData& state, - const std::string& flag, - bool value) - { - std::erase_if(devices, [&](const auto& device) - { return hasFlag(state, device.disambiguation_string, flag, value); }); - } - - /// Machine `p0` and `q0` from the power the state injects - template - void applyInjections(std::vector& machines, const Model::StateData& state) - { - using Parameters = typename MachineDataT::Parameters; - using Buses = typename MachineDataT::Buses; - - for (auto& machine : machines) - { - const auto& id = machine.disambiguation_string; - if (hasFlag(state, id, "online", false)) - { - throw std::invalid_argument("Offline machine " + id + " is not supported yet"); - } - - double p = 0.0; - double q = 0.0; - if (Model::terminalPower(state, id, machine.buses.at(Buses::bus), 0, 1, p, q)) - { - machine.parameters[Parameters::p0] = p; - machine.parameters[Parameters::q0] = q; - } - } - } - } // namespace detail - - /** - * @brief Apply voltages, terminal injections, and device settings to a case - */ - inline void applyState(SystemModelData& data, const Model::StateData& state) - { - for (auto& bus : data.bus) - { - const Model::StateRecord* record = state.bus(bus.bus_id); - if (record != nullptr) - { - bus.Vr0 = record->value("vr", bus.Vr0); - bus.Vi0 = record->value("vi", bus.Vi0); - } - } - - detail::applyInjections(data.genrou, state); - detail::applyInjections(data.gensal, state); - detail::applyInjections(data.genclassical, state); - detail::applyInjections(data.regca, state); - - // LoadZIP anchors at its initial voltage, so it draws Pnom + jQnom at t = 0 - for (auto& load : data.loadzip) - { - const auto& id = load.disambiguation_string; - - double p = 0.0; - double q = 0.0; - bool has_power = Model::terminalPower(state, id, load.buses.at(LoadZIPBuses::bus), 0, 1, p, q); - if (detail::hasFlag(state, id, "online", false)) - { - p = 0.0; - q = 0.0; - has_power = true; - } - - if (has_power) - { - load.parameters[LoadZIPParameters::Pnom] = -p; - load.parameters[LoadZIPParameters::Qnom] = -q; - } - } - - detail::removeDevices(data.loadz, state, "online", false); - detail::removeDevices(data.branch, state, "open", true); - - for (auto& branch : data.branch) - { - const Model::StateRecord* record = state.device(branch.disambiguation_string); - if (record != nullptr) - { - if (record->values.contains("tap")) - { - branch.parameters[BranchParameters::tap] = record->values.at("tap"); - } - if (record->values.contains("phase")) - { - branch.parameters[BranchParameters::phase] = record->values.at("phase"); - } - } - } - } - } // namespace PhasorDynamics -} // namespace GridKit diff --git a/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt b/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt index 36fa2e198e..d4fa645e50 100644 --- a/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt +++ b/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt @@ -1,2 +1 @@ -# Measured residual 5.1e-11 and drift 4.1e-12 -gridkit_economic_dispatch_example(ACTIVSg2000 1e-10 8e-12) +gridkit_economic_dispatch_example(ACTIVSg2000) diff --git a/examples/EconomicDispatch/CMakeLists.txt b/examples/EconomicDispatch/CMakeLists.txt index 854ec80f36..c1d6a7b218 100644 --- a/examples/EconomicDispatch/CMakeLists.txt +++ b/examples/EconomicDispatch/CMakeLists.txt @@ -14,18 +14,12 @@ install( RUNTIME) # -# gridkit_economic_dispatch_example( ) +# gridkit_economic_dispatch_example() # # Solve the economic dispatch of `cases/PhasorDynamics/` with the limits -# and costs of its MATPOWER case, and check that PhasorDynamics starts in -# steady state from the solution. The tolerances bound the residual at t = 0 -# and the relative drift over 1 s. +# and costs of its MATPOWER case, and write the solution state. # -function( - gridkit_economic_dispatch_example - case - residual_tol - drift_tol) +function(gridkit_economic_dispatch_example case) gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.case.json) gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.m) gridkit_example_add_file(${case}.solver.json) @@ -34,14 +28,6 @@ function( NAME EconomicDispatch_${case} COMMAND EconomicDispatch ${case}.solver.json WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - set_tests_properties(EconomicDispatch_${case} PROPERTIES FIXTURES_SETUP ${case}_dispatch_state) - - add_test( - NAME EconomicDispatch_${case}_steady_start - COMMAND test_opf_steady_start ${case}.case.json ${case}.state.json ${residual_tol} ${drift_tol} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - set_tests_properties(EconomicDispatch_${case}_steady_start PROPERTIES FIXTURES_REQUIRED - ${case}_dispatch_state) endfunction() add_subdirectory(IEEE39) diff --git a/examples/EconomicDispatch/EconomicDispatch.cpp b/examples/EconomicDispatch/EconomicDispatch.cpp index 0f5d4aab0e..1af36ef896 100644 --- a/examples/EconomicDispatch/EconomicDispatch.cpp +++ b/examples/EconomicDispatch/EconomicDispatch.cpp @@ -1,6 +1,6 @@ /** * @file EconomicDispatch.cpp - * @brief Economic dispatch of a PhasorDynamics case, written as its initial + * @brief Economic dispatch of a PhasorDynamics case, written as an operating * state. */ @@ -224,7 +224,7 @@ int runApplication(int argc, const char* argv[]) return 1; } - // PhasorDynamics initialization rejects limits that relaxed bounds violate + // Enforce the original bounds Ipopt::SmartPtr app = IpoptApplicationFactory(); app->Options()->SetNumericValue("bound_relax_factor", 0.0); setOptions(*app, options.value("ipopt", json::object())); diff --git a/examples/EconomicDispatch/Hawaii/CMakeLists.txt b/examples/EconomicDispatch/Hawaii/CMakeLists.txt index 287bfd8d8c..2127842f85 100644 --- a/examples/EconomicDispatch/Hawaii/CMakeLists.txt +++ b/examples/EconomicDispatch/Hawaii/CMakeLists.txt @@ -1,2 +1 @@ -# Measured residual 1.3e-13 and drift 2.4e-14 -gridkit_economic_dispatch_example(Hawaii 2.5e-13 5e-14) +gridkit_economic_dispatch_example(Hawaii) diff --git a/examples/EconomicDispatch/IEEE39/CMakeLists.txt b/examples/EconomicDispatch/IEEE39/CMakeLists.txt index f39dd19a85..9497c81e0c 100644 --- a/examples/EconomicDispatch/IEEE39/CMakeLists.txt +++ b/examples/EconomicDispatch/IEEE39/CMakeLists.txt @@ -1,2 +1 @@ -# Measured residual 1.0e-13 and drift 9.3e-15 -gridkit_economic_dispatch_example(IEEE39 2e-13 2e-14) +gridkit_economic_dispatch_example(IEEE39) diff --git a/examples/EconomicDispatch/README.md b/examples/EconomicDispatch/README.md index 9acb00e54c..9adad7e673 100644 --- a/examples/EconomicDispatch/README.md +++ b/examples/EconomicDispatch/README.md @@ -1,8 +1,11 @@ # Economic Dispatch -Each example solves the optimal power flow of a case in `cases/PhasorDynamics/` -with the limits and costs of its MATPOWER case, writes the solution state, and -checks that PhasorDynamics starts from it in steady state. +This example source is retained but is not built, installed, or registered +with CTest. PhasorDynamics initialization from an OPF state is deferred. + +The source solves the optimal power flow of a case in `cases/PhasorDynamics/` +with the limits and costs of its MATPOWER case and writes the solution state. +Previously recorded OPF results: Case | Buses | Generators | Ipopt iterations | Cost [$/h] --------------|-------|------------|------------------|----------- @@ -10,25 +13,6 @@ checks that PhasorDynamics starts from it in steady state. `Hawaii` | 37 | 39 | 20 | 4151.17 `ACTIVSg2000` | 2000 | 334 | 35 | 1.22901e6 -Build and run the IEEE39 example from the repository root: - -```shell -cmake --build build --target EconomicDispatch -j 10 -cd build/examples/EconomicDispatch/IEEE39 -../EconomicDispatch IEEE39.solver.json -``` - -Use the written state in a dynamics study: - -```json -{ - "system_model_file": "IEEE39.case.json", - "state_file": "IEEE39.state.json", - "tmax": 10.0, - "events": [] -} -``` - ## Input Dispatch requires `system_model_file`, `dispatch_file`, and `output_state_file`; @@ -49,29 +33,15 @@ Machines marked `online: false` in the input state are currently rejected. `LoadZ` | `Shunt` with $G + jB = 1 / (R + jX)$ Controllers, exciters, governors, stabilizers, and faults do not enter the -optimal power flow. PhasorDynamics initialization checks the dispatch against -their limits. +optimal power flow. Ipopt uses exact sparse derivatives. The application sets `bound_relax_factor` -to 0, because PhasorDynamics initialization rejects limits that relaxed bounds -violate. Options under `ipopt` are applied after it. - -## Pass and fail criteria +to 0 to enforce the original bounds. Options under `ipopt` are applied after it. -- `EconomicDispatch_` passes when Ipopt converges and the state is - written. -- `EconomicDispatch__steady_start` applies the state to the case and - passes when both of these hold: - - the largest PhasorDynamics residual at $t = 0$ is below its tolerance; - - the largest change of any variable over 1 s, relative to one plus its - initial magnitude, is below its tolerance, with the `DynamicSimulation` - default solver tolerances. +## Pass criterion - Case | Residual | Tolerance | Drift | Tolerance - --------------|----------|-----------|---------|---------- - `IEEE39` | 1.0e-13 | 2e-13 | 9.3e-15 | 2e-14 - `Hawaii` | 1.3e-13 | 2.5e-13 | 2.4e-14 | 5e-14 - `ACTIVSg2000` | 5.1e-11 | 1e-10 | 4.1e-12 | 8e-12 +When enabled, `EconomicDispatch_` passes when Ipopt converges and the +state is written. ## Data diff --git a/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt b/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt deleted file mode 100644 index 70dcfb1c70..0000000000 --- a/tests/IntegrationTests/OptimalPowerFlow/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -add_executable(test_opf_steady_start runSteadyStartTests.cpp) -target_link_libraries( - test_opf_steady_start - PRIVATE GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data - GridKit::solvers_dyn - GridKit::testing) -target_include_directories( - test_opf_steady_start - PRIVATE ${CMAKE_SOURCE_DIR}/application/PhasorDynamics) - -install(TARGETS test_opf_steady_start) diff --git a/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp b/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp deleted file mode 100644 index 313ba25117..0000000000 --- a/tests/IntegrationTests/OptimalPowerFlow/runSteadyStartTests.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file runSteadyStartTests.cpp - * @brief PhasorDynamics starts in steady state from an optimal power flow state. - * - * Usage: test_opf_steady_start - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "StateUtilities.hpp" - -namespace -{ - using SystemModelT = GridKit::PhasorDynamics::SystemModel; - - /// Simulated time over which the state must hold [s] - constexpr double STEADY_TIME = 1.0; - - /// Solver tolerances of `DynamicSimulation` by default - constexpr double REL_TOL = 1.0e-7; - constexpr double ABS_TOL = 1.0e-9; - - double maxResidual(SystemModelT& system) - { - system.evaluateResidual(); - - const auto& f = system.getResidual(); - const double* values = f.getData(); - - double norm = 0.0; - for (size_t i = 0; i < f.getSize(); ++i) - { - norm = std::max(norm, std::abs(values[i])); - } - return norm; - } - - double maxDrift(const std::vector& y0, const double* y) - { - double drift = 0.0; - for (size_t i = 0; i < y0.size(); ++i) - { - drift = std::max(drift, std::abs(y[i] - y0[i]) / (1.0 + std::abs(y0[i]))); - } - return drift; - } -} // namespace - -int main(int argc, const char* argv[]) -{ - using namespace GridKit; - - if (argc != 5) - { - std::cerr << "Usage: " << argv[0] << " \n"; - return 1; - } - - const double residual_tol = std::atof(argv[3]); - const double drift_tol = std::atof(argv[4]); - - Testing::TestStatus success = "steadyStart"; - - auto data = PhasorDynamics::parseSystemModelData(std::filesystem::path(argv[1])); - PhasorDynamics::applyState(data, Model::parseStateData(std::filesystem::path(argv[2]))); - - SystemModelT system(data); - system.allocate(); - - const double residual = maxResidual(system); - std::cout << "Residual at t = 0: " << residual << "\n"; - success *= residual < residual_tol; - - const double* y = system.y().getData(); - const std::vector y0(y, y + system.size()); - - AnalysisManager::Sundials::Ida ida(&system); - ida.setTolerance(REL_TOL, ABS_TOL); - ida.configureSimulation(); - ida.initializeSimulation(0.0); - ida.runSimulation(STEADY_TIME); - - const double drift = maxDrift(y0, system.y().getData()); - std::cout << "Relative drift after " << STEADY_TIME << " s: " << drift << "\n"; - success *= drift < drift_tol; - - return success.report(); -} diff --git a/tests/UnitTests/PhasorDynamics/StateTests.hpp b/tests/UnitTests/PhasorDynamics/StateTests.hpp deleted file mode 100644 index 1d93de424b..0000000000 --- a/tests/UnitTests/PhasorDynamics/StateTests.hpp +++ /dev/null @@ -1,144 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include -#include - -#include "StateUtilities.hpp" - -namespace GridKit -{ - namespace Testing - { - /** - * @brief Application state initialization of PhasorDynamics case data - */ - class StateTests - { - using DataT = PhasorDynamics::SystemModelData; - - public: - /// Supplied voltage, current, and tap values set the case operating point - TestOutcome applyState() - { - TestStatus success = true; - - DataT data = caseData(); - Model::StateData state; - state.buses[Model::busKey(1)].values = {{"vr", 1.0}, {"vi", 0.0}}; - state.buses[Model::busKey(2)].values = {{"vr", 1.0}, {"vi", -0.1}}; - state.devices["genrou_1"].values = {{"ir", 0.8}, {"ii", -0.2}}; - state.devices["loadzip_2"].values = {{"ir", -0.7}, {"ii", 0.1}}; - state.devices["branch_1_2"].values = {{"tap", 1.05}, {"phase", 0.02}}; - PhasorDynamics::applyState(data, state); - - success *= isEqual(data.bus[1].Vr0, 1.0) && isEqual(data.bus[1].Vi0, -0.1); - success *= isEqual(real(data.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::p0)), 0.8); - success *= isEqual(real(data.genrou[0].parameters.at(PhasorDynamics::GenrouParameters::q0)), 0.2); - success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), 0.71); - success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), 0.03); - success *= isEqual(real(data.branch[0].parameters.at(PhasorDynamics::BranchParameters::tap)), 1.05); - success *= isEqual(real(data.branch[0].parameters.at(PhasorDynamics::BranchParameters::phase)), 0.02); - - return success.report(__func__); - } - - /// Open branches and offline shunt loads are removed, offline loads draw nothing - TestOutcome removals() - { - TestStatus success = true; - - DataT data = caseData(); - Model::StateData state; - state.devices["branch_1_2"].flags["open"] = true; - state.devices["loadz_2"].flags["online"] = false; - state.devices["loadzip_2"].flags["online"] = false; - PhasorDynamics::applyState(data, state); - - success *= data.branch.empty(); - success *= data.loadz.empty(); - success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Pnom)), 0.0); - success *= isEqual(real(data.loadzip[0].parameters.at(PhasorDynamics::LoadZIPParameters::Qnom)), 0.0); - - return success.report(__func__); - } - - /// Machines cannot be offline yet - TestOutcome offlineMachine() - { - TestStatus success = true; - - success *= throws(applyOfflineMachine); - - return success.report(__func__); - } - - private: - static constexpr double P0 = 0.8; - static constexpr double Q0 = 0.2; - static constexpr double PNOM = 0.7; - static constexpr double QNOM = 0.1; - static constexpr double R = 1.0; - static constexpr double X = 0.5; - static constexpr double TAP = 1.02; - - static double real(const std::variant& value) - { - return std::get(value); - } - - static void applyOfflineMachine() - { - DataT data = caseData(); - Model::StateData state; - state.devices["genrou_1"].flags["online"] = false; - PhasorDynamics::applyState(data, state); - } - - static DataT caseData() - { - using namespace PhasorDynamics; - - DataT data; - data.bus.resize(2); - data.bus[0].bus_id = 1; - data.bus[0].Vr0 = 1.02; - data.bus[0].Vi0 = 0.0; - data.bus[1].bus_id = 2; - data.bus[1].Vr0 = 0.98; - data.bus[1].Vi0 = -0.09; - - auto& branch = data.branch.emplace_back(); - branch.disambiguation_string = "branch_1_2"; - branch.buses[BranchBuses::bus1] = 1; - branch.buses[BranchBuses::bus2] = 2; - branch.parameters[BranchParameters::X] = 0.1; - branch.parameters[BranchParameters::tap] = TAP; - - auto& genrou = data.genrou.emplace_back(); - genrou.disambiguation_string = "genrou_1"; - genrou.buses[GenrouBuses::bus] = 1; - genrou.parameters[GenrouParameters::p0] = P0; - genrou.parameters[GenrouParameters::q0] = Q0; - - auto& loadzip = data.loadzip.emplace_back(); - loadzip.disambiguation_string = "loadzip_2"; - loadzip.buses[LoadZIPBuses::bus] = 2; - loadzip.parameters[LoadZIPParameters::Pnom] = PNOM; - loadzip.parameters[LoadZIPParameters::Qnom] = QNOM; - - auto& loadz = data.loadz.emplace_back(); - loadz.disambiguation_string = "loadz_2"; - loadz.buses[LoadZBuses::bus] = 2; - loadz.parameters[LoadZParameters::R] = R; - loadz.parameters[LoadZParameters::X] = X; - - return data; - } - }; - } // namespace Testing -} // namespace GridKit diff --git a/tests/UnitTests/PhasorDynamics/runStateTests.cpp b/tests/UnitTests/PhasorDynamics/runStateTests.cpp deleted file mode 100644 index c172eaff43..0000000000 --- a/tests/UnitTests/PhasorDynamics/runStateTests.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "StateTests.hpp" - -int main() -{ - GridKit::Testing::TestingResults result; - GridKit::Testing::StateTests test; - - result += test.applyState(); - result += test.removals(); - result += test.offlineMachine(); - - return result.summary(); -} From b74ff99e0ebaffa762eca0bff113d407b935a650 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Wed, 14 Oct 2026 21:01:16 -0500 Subject: [PATCH 08/10] BUG: Application symlink issue --- application/PhasorDynamics/AnalysisUtilities.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/PhasorDynamics/AnalysisUtilities.hpp b/application/PhasorDynamics/AnalysisUtilities.hpp index 85ed86c188..1ee046365f 100644 --- a/application/PhasorDynamics/AnalysisUtilities.hpp +++ b/application/PhasorDynamics/AnalysisUtilities.hpp @@ -274,7 +274,7 @@ namespace GridKit { // If model file already specifies a CSV output file, then the study // output file must be a symlink to the model output file - if (exists(data.output_file)) + if (exists(symlink_status(data.output_file))) { if ((!is_symlink(data.output_file)) || (read_symlink(data.output_file) != model_output_file)) { From a6e3ae1a24e06842111c0e43f553ec3c9573ba5a Mon Sep 17 00:00:00 2001 From: lukelowry Date: Thu, 15 Oct 2026 02:06:33 -0500 Subject: [PATCH 09/10] Enhance and cleanup --- CHANGELOG.md | 5 +- CMakeLists.txt | 7 +- GridKit/Model/CMakeLists.txt | 6 - .../Model/OptimalPowerFlow/Branch/Branch.hpp | 14 +- .../OptimalPowerFlow/Branch/BranchData.hpp | 14 +- .../OptimalPowerFlow/Branch/BranchImpl.hpp | 100 +++--- .../Model/OptimalPowerFlow/Branch/README.md | 85 ++--- GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp | 28 +- .../Model/OptimalPowerFlow/Bus/BusData.hpp | 4 +- .../Model/OptimalPowerFlow/Bus/BusImpl.hpp | 93 ++---- GridKit/Model/OptimalPowerFlow/Bus/README.md | 39 +-- GridKit/Model/OptimalPowerFlow/CMakeLists.txt | 8 +- GridKit/Model/OptimalPowerFlow/Component.hpp | 102 +++--- .../Model/OptimalPowerFlow/ComponentData.hpp | 24 +- .../Model/OptimalPowerFlow/ComponentModel.hpp | 12 +- .../OptimalPowerFlow/ComponentModelImpl.hpp | 18 +- .../OptimalPowerFlow/Generator/Generator.hpp | 15 +- .../Generator/GeneratorImpl.hpp | 75 ++--- .../OptimalPowerFlow/Generator/README.md | 79 +++-- GridKit/Model/OptimalPowerFlow/Load/Load.hpp | 18 +- .../Model/OptimalPowerFlow/Load/LoadData.hpp | 4 +- .../Model/OptimalPowerFlow/Load/LoadImpl.hpp | 38 +-- GridKit/Model/OptimalPowerFlow/Load/README.md | 45 +-- .../Model/OptimalPowerFlow/MatpowerData.cpp | 66 ---- .../Model/OptimalPowerFlow/MatpowerData.hpp | 61 ---- GridKit/Model/OptimalPowerFlow/README.md | 115 +++---- .../Model/OptimalPowerFlow/Shunt/README.md | 39 +-- .../Model/OptimalPowerFlow/Shunt/Shunt.hpp | 15 +- .../OptimalPowerFlow/Shunt/ShuntImpl.hpp | 29 +- .../Model/OptimalPowerFlow/SystemModel.hpp | 20 +- .../OptimalPowerFlow/SystemModelData.cpp | 243 +++++++------- .../OptimalPowerFlow/SystemModelData.hpp | 21 +- .../OptimalPowerFlow/SystemModelImpl.hpp | 152 +++++---- GridKit/Model/PowerFlow/MatpowerParser.hpp | 44 +-- GridKit/Model/PowerFlow/PowerFlowData.hpp | 4 +- GridKit/Model/STATE.md | 104 ------ GridKit/Model/StateData.cpp | 254 --------------- GridKit/Model/StateData.hpp | 97 ------ GridKit/Solver/Optimization/SteadyState.cpp | 3 +- .../ACTIVSg2000/ACTIVSg2000.m | 0 cases/OptimalPowerFlow/ACTIVSg2000/README.md | 15 + .../Hawaii/Hawaii.m | 0 cases/OptimalPowerFlow/Hawaii/README.md | 15 + .../IEEE39/IEEE39.m | 0 cases/OptimalPowerFlow/IEEE39/README.md | 15 + cmake/Config.cmake.in | 10 +- cmake/FindIpopt.cmake | 26 +- .../Model/OptimalPowerFlow/Branch/README.md | 6 + .../Model/OptimalPowerFlow/Bus/README.md | 6 + .../OptimalPowerFlow/Generator/README.md | 6 + .../Model/OptimalPowerFlow/Load/README.md | 6 + docs/GridKit/Model/OptimalPowerFlow/README.md | 18 ++ .../Model/OptimalPowerFlow/Shunt/README.md | 6 + docs/GridKit/Model/README.md | 1 + .../OptimalPowerFlow/ACTIVSg2000/README.md | 3 + docs/cases/OptimalPowerFlow/Hawaii/README.md | 3 + docs/cases/OptimalPowerFlow/IEEE39/README.md | 3 + docs/cases/OptimalPowerFlow/README.md | 11 + docs/cases/PhasorDynamics/README.md | 17 + docs/cases/README.md | 54 ++-- .../EconomicDispatch/README.md | 6 + docs/examples/OptimalPowerFlow/README.md | 14 + docs/examples/README.md | 1 + examples/CMakeLists.txt | 4 + examples/Consumer/CMakeLists.txt | 6 - .../GridKitConsumer/CMakeLists.txt.in | 12 - .../ACTIVSg2000/ACTIVSg2000.solver.json | 8 - .../ACTIVSg2000/CMakeLists.txt | 1 - examples/EconomicDispatch/CMakeLists.txt | 35 -- .../EconomicDispatch/EconomicDispatch.cpp | 267 ---------------- .../EconomicDispatch/Hawaii/CMakeLists.txt | 1 - .../Hawaii/Hawaii.solver.json | 8 - .../EconomicDispatch/IEEE39/CMakeLists.txt | 1 - .../IEEE39/IEEE39.solver.json | 8 - examples/EconomicDispatch/README.md | 51 --- examples/OptimalPowerFlow/CMakeLists.txt | 3 + .../EconomicDispatch/CMakeLists.txt | 18 ++ .../EconomicDispatch/EconomicDispatch.cpp | 88 ++++++ .../EconomicDispatch/README.md | 13 + examples/OptimalPowerFlow/README.md | 23 ++ .../MatPowerTesting/MatPowerTesting.hpp | 5 +- .../MatPowerTesting/test_parse_matpower.cpp | 8 +- examples/README.md | 3 +- tests/UnitTests/CMakeLists.txt | 1 - tests/UnitTests/Model/CMakeLists.txt | 8 - tests/UnitTests/Model/StateDataTests.hpp | 131 -------- tests/UnitTests/Model/runStateDataTests.cpp | 14 - .../UnitTests/OptimalPowerFlow/CMakeLists.txt | 2 - .../OptimalPowerFlow/ComponentTests.hpp | 298 +++++++----------- .../OptimalPowerFlow/SystemTests.hpp | 242 ++++++-------- .../OptimalPowerFlow/runComponentTests.cpp | 2 +- .../OptimalPowerFlow/runSystemTests.cpp | 5 +- 92 files changed, 1283 insertions(+), 2325 deletions(-) delete mode 100644 GridKit/Model/OptimalPowerFlow/MatpowerData.cpp delete mode 100644 GridKit/Model/OptimalPowerFlow/MatpowerData.hpp delete mode 100644 GridKit/Model/STATE.md delete mode 100644 GridKit/Model/StateData.cpp delete mode 100644 GridKit/Model/StateData.hpp rename cases/{PhasorDynamics => OptimalPowerFlow}/ACTIVSg2000/ACTIVSg2000.m (100%) create mode 100644 cases/OptimalPowerFlow/ACTIVSg2000/README.md rename cases/{PhasorDynamics => OptimalPowerFlow}/Hawaii/Hawaii.m (100%) create mode 100644 cases/OptimalPowerFlow/Hawaii/README.md rename cases/{PhasorDynamics => OptimalPowerFlow}/IEEE39/IEEE39.m (100%) create mode 100644 cases/OptimalPowerFlow/IEEE39/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/Branch/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/Bus/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/Generator/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/Load/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/README.md create mode 100644 docs/GridKit/Model/OptimalPowerFlow/Shunt/README.md create mode 100644 docs/cases/OptimalPowerFlow/ACTIVSg2000/README.md create mode 100644 docs/cases/OptimalPowerFlow/Hawaii/README.md create mode 100644 docs/cases/OptimalPowerFlow/IEEE39/README.md create mode 100644 docs/cases/OptimalPowerFlow/README.md create mode 100644 docs/cases/PhasorDynamics/README.md create mode 100644 docs/examples/OptimalPowerFlow/EconomicDispatch/README.md create mode 100644 docs/examples/OptimalPowerFlow/README.md delete mode 100644 examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json delete mode 100644 examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt delete mode 100644 examples/EconomicDispatch/CMakeLists.txt delete mode 100644 examples/EconomicDispatch/EconomicDispatch.cpp delete mode 100644 examples/EconomicDispatch/Hawaii/CMakeLists.txt delete mode 100644 examples/EconomicDispatch/Hawaii/Hawaii.solver.json delete mode 100644 examples/EconomicDispatch/IEEE39/CMakeLists.txt delete mode 100644 examples/EconomicDispatch/IEEE39/IEEE39.solver.json delete mode 100644 examples/EconomicDispatch/README.md create mode 100644 examples/OptimalPowerFlow/CMakeLists.txt create mode 100644 examples/OptimalPowerFlow/EconomicDispatch/CMakeLists.txt create mode 100644 examples/OptimalPowerFlow/EconomicDispatch/EconomicDispatch.cpp create mode 100644 examples/OptimalPowerFlow/EconomicDispatch/README.md create mode 100644 examples/OptimalPowerFlow/README.md delete mode 100644 tests/UnitTests/Model/CMakeLists.txt delete mode 100644 tests/UnitTests/Model/StateDataTests.hpp delete mode 100644 tests/UnitTests/Model/runStateDataTests.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index d509128290..b368a56da3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ - Added `enable` and `disable` solver events that put a branch in or out of service. - `verify()` returns `Model::ConfigurationChecks` listing every configuration problem instead of an error count. - Added `Model::ParameterReader` +- Added the `OptimalPowerFlow` model family, the `SteadyState` Ipopt interface, and the `EconomicDispatch` example for MATPOWER cases. +- The MATPOWER reader accepts rows without semicolons, solution columns, and decimal `baseMVA` and costs. +- Fixed the study output check for a dangling symlink. ## v0.2 @@ -99,8 +102,6 @@ - Added `GridKit_ENABLE_DEVELOPER_MODE` CMake option; in developer mode the Logger defaults to `EVERYTHING` verbosity. - Added `Logger::raiseVerbosity()`, which raises the verbosity without lowering a higher level. - Changed most of the core library code outputs to use the Logger instead of `std::cout`/`std::cerr`. -- Added the `StateData` reader and writer for OPF operating states. -- Added the `OptimalPowerFlow` model family, with sparse Enzyme Jacobians and Hessians and a steady-state Ipopt interface. ## v0.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 1244dfc436..98978ce4b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,7 +126,7 @@ endif("${isSystemDir}" STREQUAL "-1") option(BUILD_SHARED_LIBS "Build shared libraries" ON) if(GRIDKIT_ENABLE_IPOPT) - find_package(Ipopt REQUIRED) + include(FindIpopt) enable_language(Fortran) # Needed for linking to HSL endif() @@ -217,10 +217,7 @@ configure_package_config_file( INSTALL_DESTINATION share/cmake/gridkit NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO) -# Make the dependency finder available beside the generated package config. -configure_file(cmake/FindIpopt.cmake ${CMAKE_CURRENT_BINARY_DIR}/FindIpopt.cmake COPYONLY) - # Install configuration file install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GridKitConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/GridKitConfigVersion.cmake - ${CMAKE_CURRENT_BINARY_DIR}/FindIpopt.cmake DESTINATION share/cmake/gridkit) + DESTINATION share/cmake/gridkit) diff --git a/GridKit/Model/CMakeLists.txt b/GridKit/Model/CMakeLists.txt index c6f176d8f5..da8b88093f 100644 --- a/GridKit/Model/CMakeLists.txt +++ b/GridKit/Model/CMakeLists.txt @@ -5,12 +5,6 @@ # - Cameron Rutherford #]] -gridkit_add_library( - model_state_data - SOURCES StateData.cpp - HEADERS StateData.hpp - INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) - add_subdirectory(PhasorDynamics) add_subdirectory(PowerFlow) add_subdirectory(PowerElectronics) diff --git a/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp b/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp index 7ae1006e56..2a4b2735fc 100644 --- a/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp +++ b/GridKit/Model/OptimalPowerFlow/Branch/Branch.hpp @@ -24,7 +24,7 @@ namespace GridKit using ComponentModelT = ComponentModel, scalar_type, index_type>; using ComponentModelT::constraint_upper_; - using ComponentModelT::id_; + using ComponentModelT::in_service_; public: using ScalarT = scalar_type; @@ -34,22 +34,24 @@ namespace GridKit /// Local variables: real and imaginary voltage at bus 1, then at bus 2 static constexpr IdxT VARIABLE_SIZE = 4; - /// Local constraints: squared apparent power at bus 1 and bus 2, then power into bus 1 and bus 2 + /// Local constraint functions: squared apparent power at bus 1 and bus 2, then power into bus 1 and bus 2 static constexpr IdxT CONSTRAINT_SIZE = 6; - static constexpr IdxT INTERNAL_SIZE = 0; + /// Internal variables: none + static constexpr IdxT INTERNAL_VARIABLE_SIZE = 0; + /// Internal constraint functions: squared apparent power at bus 1 and bus 2 static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 2; static constexpr bool CONSTANT = false; explicit Branch(const ModelDataT& data); - int verify() const override; - int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + Model::ConfigurationChecks verify() const override; + int initialize(ScalarT* x) override; __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; private: - void setDerivedParameters(RealT tap, RealT phase, RealT status); + void setDerivedParams(); RealT R_{0.0}; RealT X_{0.0}; diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp index 84f2b78ab5..d62c4c61b3 100644 --- a/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchData.hpp @@ -16,14 +16,14 @@ namespace GridKit /// Parameters for a branch enum class BranchParameters : size_t { - R, ///< \f$R\f$ Branch series resistance [p.u.] - X, ///< \f$X\f$ Branch series reactance [p.u.] - G, ///< \f$G\f$ Total line shunt conductance, split equally between the two terminals [p.u.] - B, ///< \f$B\f$ Total line shunt susceptance, split equally between the two terminals [p.u.] - Gmag, ///< \f$G_{\mathrm{mag}}\f$ Magnetizing shunt conductance at bus 1, the tapped side [p.u.] - Bmag, ///< \f$B_{\mathrm{mag}}\f$ Magnetizing shunt susceptance at bus 1, the tapped side [p.u.] + R, ///< \f$R\f$ Series resistance [p.u.] + X, ///< \f$X\f$ Series reactance [p.u.] + G, ///< \f$G\f$ Total line shunt conductance, split between the terminals [p.u.] + B, ///< \f$B\f$ Total line shunt susceptance, split between the terminals [p.u.] + Gmag, ///< \f$G_\mathrm{mag}\f$ Magnetizing shunt conductance at bus 1 [p.u.] + Bmag, ///< \f$B_\mathrm{mag}\f$ Magnetizing shunt susceptance at bus 1 [p.u.] tap, ///< \f$\tau\f$ Off-nominal tap magnitude on the bus-1 side [p.u.] - phase, ///< \f$\theta\f$ Off-nominal phase-shift angle [rad] + phase, ///< \f$\theta\f$ Phase-shift angle [rad] Smax, ///< \f$S^{\max}\f$ Apparent power limit at each terminal [p.u.] }; diff --git a/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp b/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp index 0515b97176..228daa92c7 100644 --- a/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/Branch/BranchImpl.hpp @@ -22,7 +22,7 @@ namespace GridKit */ template Branch::Branch(const ModelDataT& data) - : ComponentModelT(data.id, busNumbers(data)), + : ComponentModelT(data.id, busNumbers(data), data.in_service), R_(parameter(data, BranchParameters::R, ZERO)), X_(parameter(data, BranchParameters::X, ZERO)), G_(parameter(data, BranchParameters::G, ZERO)), @@ -34,50 +34,34 @@ namespace GridKit Smax_(parameter(data, BranchParameters::Smax, UNBOUNDED)) { constraint_upper_ = {Smax_ * Smax_, Smax_ * Smax_}; + setDerivedParams(); } template - int Branch::verify() const + Model::ConfigurationChecks Branch::verify() const { - return this->check(std::isfinite(R_), "R must be finite") - + this->check(std::isfinite(X_), "X must be finite") - + this->check(std::isfinite(G_), "G must be finite") - + this->check(std::isfinite(B_), "B must be finite") - + this->check(std::isfinite(Gmag_), "Gmag must be finite") - + this->check(std::isfinite(Bmag_), "Bmag must be finite") - + this->check(std::isfinite(tap_), "tap must be finite") - + this->check(std::isfinite(phase_), "phase must be finite") - + this->check(R_ * R_ + X_ * X_ > ZERO, "R and X cannot both be zero") - + this->check(tap_ > ZERO, "tap must be positive") - + this->check(Smax_ > ZERO, "Smax must be positive"); + Model::ConfigurationChecks checks("Branch"); + checks.check(std::isfinite(R_), "R must be finite"); + checks.check(std::isfinite(X_), "X must be finite"); + checks.check(std::isfinite(G_), "G must be finite"); + checks.check(std::isfinite(B_), "B must be finite"); + checks.check(std::isfinite(Gmag_), "Gmag must be finite"); + checks.check(std::isfinite(Bmag_), "Bmag must be finite"); + checks.check(std::isfinite(tap_), "tap must be finite"); + checks.check(std::isfinite(phase_), "phase must be finite"); + checks.check(R_ * R_ + X_ * X_ > ZERO, "R and X cannot both be zero"); + checks.check(tap_ > ZERO, "tap must be positive"); + checks.check(Smax_ > ZERO, "Smax must be positive"); + return checks; } /** - * @brief Apply the state settings `open`, `tap` and `phase` + * @brief No internal variables */ template - int Branch::initialize(const Model::StateData& state, - [[maybe_unused]] ScalarT* x, - [[maybe_unused]] RealT* x_lower, - [[maybe_unused]] RealT* x_upper) + int Branch::initialize([[maybe_unused]] ScalarT* x) { - RealT tap = tap_; - RealT phase = phase_; - RealT status = ONE; - - const Model::StateRecord* record = state.device(id_); - if (record != nullptr) - { - tap = record->value("tap", tap); - phase = record->value("phase", phase); - if (record->flag("open", false)) - { - status = ZERO; - } - } - - setDerivedParameters(tap, phase, status); - return this->check(tap > ZERO, "state tap must be positive"); + return 0; } template @@ -91,7 +75,7 @@ namespace GridKit * @brief Squared apparent power and power into each bus * * Terminal currents are those of `PhasorDynamics::Branch`, and the power - * into bus k is \f$V_k I_k^*\f$. + * into each bus is \f$P + jQ = V I^*\f$. */ template __attribute__((always_inline)) inline void @@ -121,29 +105,39 @@ namespace GridKit } /** - * @brief Admittance of `PhasorDynamics::Branch`, scaled by the branch status + * @brief Admittance of `PhasorDynamics::Branch` */ template - void Branch::setDerivedParameters(RealT tap, RealT phase, RealT status) + void Branch::setDerivedParams() { const RealT denom = R_ * R_ + X_ * X_; const RealT g_br = R_ / denom; const RealT b_br = -X_ / denom; - const RealT inv_tap = ONE / tap; - const RealT cos_ph = std::cos(phase); - const RealT sin_ph = std::sin(phase); - - g11_ = status * (-g_br * inv_tap * inv_tap - HALF * G_ - Gmag_); - b11_ = status * (-b_br * inv_tap * inv_tap - HALF * B_ - Bmag_); - - g12_ = status * (g_br * cos_ph - b_br * sin_ph) * inv_tap; - b12_ = status * (b_br * cos_ph + g_br * sin_ph) * inv_tap; - - g21_ = status * (g_br * cos_ph + b_br * sin_ph) * inv_tap; - b21_ = status * (b_br * cos_ph - g_br * sin_ph) * inv_tap; - - g22_ = status * (-g_br - HALF * G_); - b22_ = status * (-b_br - HALF * B_); + const RealT inv_tap = ONE / tap_; + const RealT cos_ph = std::cos(phase_); + const RealT sin_ph = std::sin(phase_); + + g11_ = -g_br * inv_tap * inv_tap - HALF * G_ - Gmag_; + b11_ = -b_br * inv_tap * inv_tap - HALF * B_ - Bmag_; + + g12_ = (g_br * cos_ph - b_br * sin_ph) * inv_tap; + b12_ = (b_br * cos_ph + g_br * sin_ph) * inv_tap; + + g21_ = (g_br * cos_ph + b_br * sin_ph) * inv_tap; + b21_ = (b_br * cos_ph - g_br * sin_ph) * inv_tap; + + g22_ = -g_br - HALF * G_; + b22_ = -b_br - HALF * B_; + + // An out-of-service branch has zero admittance + g11_ *= in_service_; + b11_ *= in_service_; + g12_ *= in_service_; + b12_ *= in_service_; + g21_ *= in_service_; + b21_ *= in_service_; + g22_ *= in_service_; + b22_ *= in_service_; } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Branch/README.md b/GridKit/Model/OptimalPowerFlow/Branch/README.md index 2ce5234ce0..8fd7249d6d 100644 --- a/GridKit/Model/OptimalPowerFlow/Branch/README.md +++ b/GridKit/Model/OptimalPowerFlow/Branch/README.md @@ -5,46 +5,49 @@ PhasorDynamics [Branch](../../PhasorDynamics/Branch/README.md). ## Model Parameters -Symbol | Units | JSON | Description | Typical Value | Note -----------------------|--------|---------|-----------------------------------------------------------|---------------|----- -$R$ | [p.u.] | `R` | Series resistance | | From the case -$X$ | [p.u.] | `X` | Series reactance | | From the case -$G$ | [p.u.] | `G` | Total line shunt conductance, split between the terminals | | From the case -$B$ | [p.u.] | `B` | Total line shunt susceptance, split between the terminals | | From the case -$G_\mathrm{mag}$ | [p.u.] | `Gmag` | Magnetizing conductance at bus 1 | 0 | From the case -$B_\mathrm{mag}$ | [p.u.] | `Bmag` | Magnetizing susceptance at bus 1 | 0 | From the case -$\tau$ | [p.u.] | `tap` | Off-nominal tap magnitude on the bus-1 side | 1 | From the case -$\phi$ | [rad] | `phase` | Phase-shift angle | 0 | From the case -$S^{\max}$ | [p.u.] | `Smax` | Apparent power limit at each terminal | | MATPOWER `RATE_A`, default unbounded +Symbol | Units | Data | Description | Typical Value | Note +-----------------|--------|--------------|-----------------------------------------------------------|---------------|----- +$R$ | [p.u.] | `R` | Series resistance | | Default 0 +$X$ | [p.u.] | `X` | Series reactance | | Default 0 +$G$ | [p.u.] | `G` | Total line shunt conductance, split between the terminals | | Default 0 +$B$ | [p.u.] | `B` | Total line shunt susceptance, split between the terminals | | Default 0 +$G_\mathrm{mag}$ | [p.u.] | `Gmag` | Magnetizing shunt conductance at bus 1 | | Default 0 +$B_\mathrm{mag}$ | [p.u.] | `Bmag` | Magnetizing shunt susceptance at bus 1 | | Default 0 +$\tau$ | [p.u.] | `tap` | Off-nominal tap magnitude on the bus-1 side | | Default 1 +$\theta$ | [rad] | `phase` | Phase-shift angle | | Default 0 +$S^{\max}$ | [p.u.] | `Smax` | Apparent power limit at each terminal | | Default unbounded +$u$ | [-] | `in_service` | Service status, 1 in service and 0 out of service | | Default 1 ### Parameter Validation -- All parameters are finite, except $S^{\max}$ +- $R$, $X$, $G$, $B$, $G_\mathrm{mag}$, $B_\mathrm{mag}$, $\tau$, and $\theta$ are finite - $R^2 + X^2 > 0$ - $\tau > 0$ - $S^{\max} > 0$ ### Model Derived Parameters -The state settings `tap` and `phase` replace $\tau$ and $\phi$. The status $s$ -is zero if the state marks the branch `open` and one otherwise. - ```math \begin{aligned} -g &= \dfrac{R}{R^2 + X^2}, \quad b = -\dfrac{X}{R^2 + X^2} \\ -g_{11} &= s \left(-g / \tau^2 - G/2 - G_\mathrm{mag}\right), \quad b_{11} = s \left(-b / \tau^2 - B/2 - B_\mathrm{mag}\right) \\ -g_{12} &= s (g \cos\phi - b \sin\phi) / \tau, \quad b_{12} = s (b \cos\phi + g \sin\phi) / \tau \\ -g_{21} &= s (g \cos\phi + b \sin\phi) / \tau, \quad b_{21} = s (b \cos\phi - g \sin\phi) / \tau \\ -g_{22} &= s (-g - G/2), \quad b_{22} = s (-b - B/2) +g &= R / (R^2 + X^2) \\ +b &= -X / (R^2 + X^2) \\ +g_{11} &= u (-g / \tau^2 - G / 2 - G_\mathrm{mag}) \\ +b_{11} &= u (-b / \tau^2 - B / 2 - B_\mathrm{mag}) \\ +g_{12} &= u (g \cos\theta - b \sin\theta) / \tau \\ +b_{12} &= u (b \cos\theta + g \sin\theta) / \tau \\ +g_{21} &= u (g \cos\theta + b \sin\theta) / \tau \\ +b_{21} &= u (b \cos\theta - g \sin\theta) / \tau \\ +g_{22} &= u (-g - G / 2) \\ +b_{22} &= u (-b - B / 2) \end{aligned} ``` ## Model Ports -Name | Port | Init | Description --------|------|-------|------------ -`bus1` | Bus | Known | Bus-1 terminal, the tapped side -`bus2` | Bus | Known | Bus-2 terminal +Name | Port | Description +-------|------|------------ +`bus1` | Bus | Bus-1 terminal, the tapped side +`bus2` | Bus | Bus-2 terminal ## Model Variables @@ -54,24 +57,25 @@ None. ### External Variables -Symbol | Units | Description | Note ---------------------|--------|-----------------------|----- -$V_{\mathrm{r}1}$ | [p.u.] | Bus-1 real voltage | Owned by bus 1 -$V_{\mathrm{i}1}$ | [p.u.] | Bus-1 imaginary voltage | Owned by bus 1 -$V_{\mathrm{r}2}$ | [p.u.] | Bus-2 real voltage | Owned by bus 2 -$V_{\mathrm{i}2}$ | [p.u.] | Bus-2 imaginary voltage | Owned by bus 2 +Symbol | Units | Description | Note +------------------|--------|-------------------------|----- +$V_{\mathrm{r}1}$ | [p.u.] | Bus-1 real voltage | Owned by bus 1 +$V_{\mathrm{i}1}$ | [p.u.] | Bus-1 imaginary voltage | Owned by bus 1 +$V_{\mathrm{r}2}$ | [p.u.] | Bus-2 real voltage | Owned by bus 2 +$V_{\mathrm{i}2}$ | [p.u.] | Bus-2 imaginary voltage | Owned by bus 2 ## Model Equations -Terminal currents into the buses, and the power into bus $k$: - ```math \begin{aligned} I_{\mathrm{r}1} &= g_{11} V_{\mathrm{r}1} - b_{11} V_{\mathrm{i}1} + g_{12} V_{\mathrm{r}2} - b_{12} V_{\mathrm{i}2} \\ I_{\mathrm{i}1} &= b_{11} V_{\mathrm{r}1} + g_{11} V_{\mathrm{i}1} + b_{12} V_{\mathrm{r}2} + g_{12} V_{\mathrm{i}2} \\ I_{\mathrm{r}2} &= g_{21} V_{\mathrm{r}1} - b_{21} V_{\mathrm{i}1} + g_{22} V_{\mathrm{r}2} - b_{22} V_{\mathrm{i}2} \\ I_{\mathrm{i}2} &= b_{21} V_{\mathrm{r}1} + g_{21} V_{\mathrm{i}1} + b_{22} V_{\mathrm{r}2} + g_{22} V_{\mathrm{i}2} \\ -P_k &= V_{\mathrm{r}k} I_{\mathrm{r}k} + V_{\mathrm{i}k} I_{\mathrm{i}k}, \quad Q_k = V_{\mathrm{i}k} I_{\mathrm{r}k} - V_{\mathrm{r}k} I_{\mathrm{i}k} +P_1 &= V_{\mathrm{r}1} I_{\mathrm{r}1} + V_{\mathrm{i}1} I_{\mathrm{i}1} \\ +Q_1 &= V_{\mathrm{i}1} I_{\mathrm{r}1} - V_{\mathrm{r}1} I_{\mathrm{i}1} \\ +P_2 &= V_{\mathrm{r}2} I_{\mathrm{r}2} + V_{\mathrm{i}2} I_{\mathrm{i}2} \\ +Q_2 &= V_{\mathrm{i}2} I_{\mathrm{r}2} - V_{\mathrm{r}2} I_{\mathrm{i}2} \end{aligned} ``` @@ -81,21 +85,24 @@ None. ### Internal Constraints -A row exists only when $S^{\max}$ is set: - ```math -P_k^2 + Q_k^2 \le \left(S^{\max}\right)^2, \quad k = 1, 2 +\begin{aligned} +P_1^2 + Q_1^2 &\le (S^{\max})^2 \\ +P_2^2 + Q_2^2 &\le (S^{\max})^2 +\end{aligned} ``` ### External Constraints ```math \begin{aligned} -\Delta P_k^\mathrm{bus} &\mathrel{+}= P_k \\ -\Delta Q_k^\mathrm{bus} &\mathrel{+}= Q_k +\Delta P_1^\mathrm{bus} &\mathrel{+}= P_1 \\ +\Delta Q_1^\mathrm{bus} &\mathrel{+}= Q_1 \\ +\Delta P_2^\mathrm{bus} &\mathrel{+}= P_2 \\ +\Delta Q_2^\mathrm{bus} &\mathrel{+}= Q_2 \end{aligned} ``` ## Initialization -The state settings `open`, `tap`, and `phase` set the derived admittance. +None. diff --git a/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp b/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp index 2d81020f44..1223c89138 100644 --- a/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp +++ b/GridKit/Model/OptimalPowerFlow/Bus/Bus.hpp @@ -26,6 +26,8 @@ namespace GridKit using ComponentModelT::constraint_lower_; using ComponentModelT::constraint_upper_; using ComponentModelT::variable_indices_; + using ComponentModelT::variable_lower_; + using ComponentModelT::variable_upper_; public: using ScalarT = scalar_type; @@ -35,35 +37,31 @@ namespace GridKit /// Local variables: real and imaginary voltage static constexpr IdxT VARIABLE_SIZE = 2; - /// Local constraints: active and reactive power balance, squared voltage magnitude, and angle reference - static constexpr IdxT CONSTRAINT_SIZE = 4; - static constexpr IdxT INTERNAL_SIZE = 2; - static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 4; + /// Local constraint functions: active and reactive power balance, and squared voltage magnitude + static constexpr IdxT CONSTRAINT_SIZE = 3; + /// Internal variables: real and imaginary voltage + static constexpr IdxT INTERNAL_VARIABLE_SIZE = 2; + /// Internal constraint functions: active and reactive power balance, and squared voltage magnitude + static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 3; static constexpr bool CONSTANT = false; explicit Bus(const ModelDataT& data); - int verify() const override; - int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + Model::ConfigurationChecks verify() const override; + int initialize(ScalarT* x) override; - /// Keep the state angle, which sets the angle reference - void setReference(); - - bool infinite() const + bool reference() const { - return infinite_; + return reference_; } __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; private: - IdxT number_{0}; - bool infinite_{false}; + bool reference_{false}; RealT Vmin_{0.0}; RealT Vmax_{0.0}; - RealT vr_ref_{1.0}; - RealT vi_ref_{0.0}; }; } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp b/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp index c173fc5670..9f52e20a11 100644 --- a/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusData.hpp @@ -35,8 +35,8 @@ namespace GridKit /// Bus number IdxT number{0}; - /// Voltage fixed at its state value, as for `BusInfinite` - bool infinite{false}; + /// Angle reference, with zero imaginary voltage + bool reference{false}; /// Mapping of parameters to parameter values std::map parameters; diff --git a/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp b/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp index f19bee38b8..ec57c02c5f 100644 --- a/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/Bus/BusImpl.hpp @@ -5,6 +5,8 @@ #pragma once +#include + #include #include #include @@ -16,88 +18,53 @@ namespace GridKit /** * @brief Construct a bus from data * - * Balance rows are equalities, and the voltage magnitude row exists with a - * limit. An infinite bus has neither. + * The power balance is an equality, the squared voltage magnitude has the + * voltage limits, and a reference bus limits its imaginary voltage to zero. */ template Bus::Bus(const ModelDataT& data) - : ComponentModelT(Model::busKey(data.number), {}), - number_(data.number), - infinite_(data.infinite), + : ComponentModelT(std::format("bus_{}", data.number), {}), + reference_(data.reference), Vmin_(parameter(data, BusParameters::Vmin, ZERO)), Vmax_(parameter(data, BusParameters::Vmax, UNBOUNDED)) { - if (!infinite_) + constraint_lower_[0] = ZERO; + constraint_upper_[0] = ZERO; + constraint_lower_[1] = ZERO; + constraint_upper_[1] = ZERO; + constraint_upper_[2] = Vmax_ * Vmax_; + if (Vmin_ > ZERO) { - constraint_lower_[0] = ZERO; - constraint_upper_[0] = ZERO; - constraint_lower_[1] = ZERO; - constraint_upper_[1] = ZERO; - constraint_upper_[2] = Vmax_ * Vmax_; - if (Vmin_ > ZERO) - { - constraint_lower_[2] = Vmin_ * Vmin_; - } + constraint_lower_[2] = Vmin_ * Vmin_; + } + + if (reference_) + { + variable_lower_[1] = ZERO; + variable_upper_[1] = ZERO; } } template - int Bus::verify() const + Model::ConfigurationChecks Bus::verify() const { - return this->check(Vmin_ >= ZERO, "Vmin must be nonnegative") - + this->check(Vmax_ >= Vmin_, "Vmax must not be less than Vmin"); + Model::ConfigurationChecks checks("Bus"); + checks.check(Vmin_ >= ZERO, "Vmin must be nonnegative"); + checks.check(Vmax_ >= Vmin_, "Vmax must not be less than Vmin"); + return checks; } /** - * @brief Start from the state voltage, or a flat start without one - * - * The state voltage sets the angle reference. An infinite bus keeps its - * state voltage. + * @brief Flat start */ template - int Bus::initialize(const Model::StateData& state, - ScalarT* x, - RealT* x_lower, - RealT* x_upper) + int Bus::initialize(ScalarT* x) { - vr_ref_ = ONE; - vi_ref_ = ZERO; - - const Model::StateRecord* record = state.bus(number_); - if (record != nullptr) - { - vr_ref_ = record->value("vr", vr_ref_); - vi_ref_ = record->value("vi", vi_ref_); - } - - const IdxT vr_index = variable_indices_[0]; - const IdxT vi_index = variable_indices_[1]; - - x[vr_index] = vr_ref_; - x[vi_index] = vi_ref_; - x_lower[vr_index] = -UNBOUNDED; - x_upper[vr_index] = UNBOUNDED; - x_lower[vi_index] = -UNBOUNDED; - x_upper[vi_index] = UNBOUNDED; - - if (infinite_) - { - x_lower[vr_index] = vr_ref_; - x_upper[vr_index] = vr_ref_; - x_lower[vi_index] = vi_ref_; - x_upper[vi_index] = vi_ref_; - } - + x[variable_indices_[0]] = ONE; + x[variable_indices_[1]] = ZERO; return 0; } - template - void Bus::setReference() - { - constraint_lower_[3] = ZERO; - constraint_upper_[3] = ZERO; - } - template __attribute__((always_inline)) inline typename Bus::ScalarT Bus::objective([[maybe_unused]] const ScalarT* x) const @@ -106,8 +73,7 @@ namespace GridKit } /** - * @brief Squared voltage magnitude and the voltage component normal to - * the state voltage + * @brief Squared voltage magnitude * * Devices add their injections to the balance rows, which the bus leaves * at zero. @@ -120,7 +86,6 @@ namespace GridKit const ScalarT vi = x[1]; g[2] = vr * vr + vi * vi; - g[3] = vr_ref_ * vi - vi_ref_ * vr; } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Bus/README.md b/GridKit/Model/OptimalPowerFlow/Bus/README.md index 6198c98cd2..5d407b290b 100644 --- a/GridKit/Model/OptimalPowerFlow/Bus/README.md +++ b/GridKit/Model/OptimalPowerFlow/Bus/README.md @@ -1,16 +1,14 @@ # Bus -Bus voltage in Cartesian coordinates and the power balance of the bus. Devices -add the power they inject into the bus to its balance rows. +Bus voltage in Cartesian coordinates and power balance. ## Model Parameters -Symbol | Units | JSON | Description | Typical Value | Note ------------|--------|--------|-------------------------------|---------------|----- -$V^{\min}$ | [p.u.] | `Vmin` | Voltage magnitude lower limit | 0.95 | Default 0 -$V^{\max}$ | [p.u.] | `Vmax` | Voltage magnitude upper limit | 1.05 | Default unbounded - -A `BusInfinite` in the case makes the bus infinite. +Symbol | Units | Data | Description | Typical Value | Note +-----------|--------|-------------|----------------------------------------------|---------------|----- +$V^{\min}$ | [p.u.] | `Vmin` | Voltage magnitude lower limit | 0.95 | Default 0 +$V^{\max}$ | [p.u.] | `Vmax` | Voltage magnitude upper limit | 1.05 | Default unbounded + | [-] | `reference` | Angle reference, with zero imaginary voltage | | Default false ### Parameter Validation @@ -23,7 +21,7 @@ None. ## Model Ports -None. Devices connect to the bus by its number. +None. ## Model Variables @@ -48,19 +46,22 @@ None. ```math \begin{aligned} -0 &= \sum_{c \to k} P_{c,k} \\ -0 &= \sum_{c \to k} Q_{c,k} \\ -\left(V^{\min}\right)^2 &\le V_\mathrm{r}^2 + V_\mathrm{i}^2 \le \left(V^{\max}\right)^2 \\ -0 &= V_\mathrm{r}^\mathrm{state} V_\mathrm{i} - V_\mathrm{i}^\mathrm{state} V_\mathrm{r} +0 &= \Delta P^\mathrm{bus} \\ +0 &= \Delta Q^\mathrm{bus} \\ +(V^{\min})^2 &\le V_\mathrm{r}^2 + V_\mathrm{i}^2 \le (V^{\max})^2 \\ +0 &= V_\mathrm{i} && \text{reference bus} \end{aligned} ``` -The bus contributes zero to the balance rows. The magnitude row exists with a -limit, and the reference row only at the reference bus, where it keeps the -state angle. An infinite bus keeps its state voltage and has no rows. +### External Constraints + +None. ## Initialization -The state entry `bus_id_N` gives the starting voltage, $V_\mathrm{r}^\mathrm{state}$ -and $V_\mathrm{i}^\mathrm{state}$. Without an entry, the bus starts at -$V_\mathrm{r} = 1$ and $V_\mathrm{i} = 0$. +```math +\begin{aligned} +V_\mathrm{r} &\leftarrow 1 \\ +V_\mathrm{i} &\leftarrow 0 +\end{aligned} +``` diff --git a/GridKit/Model/OptimalPowerFlow/CMakeLists.txt b/GridKit/Model/OptimalPowerFlow/CMakeLists.txt index f95cc0186a..500002ff51 100644 --- a/GridKit/Model/OptimalPowerFlow/CMakeLists.txt +++ b/GridKit/Model/OptimalPowerFlow/CMakeLists.txt @@ -11,9 +11,7 @@ gridkit_add_library( INTERFACE GridKit::Utilities INTERFACE - GridKit::utilities_logger - INTERFACE - GridKit::model_state_data) + GridKit::utilities_logger) target_link_libraries( optimal_power_flow_components @@ -34,8 +32,8 @@ add_library(GridKit::optimal_power_flow_components_dependency_tracking ALIAS gridkit_add_library( optimal_power_flow_systemmodel - SOURCES SystemModelEnzyme.cpp SystemModelData.cpp MatpowerData.cpp - HEADERS SystemModel.hpp SystemModelData.hpp MatpowerData.hpp + SOURCES SystemModelEnzyme.cpp SystemModelData.cpp + HEADERS SystemModel.hpp SystemModelData.hpp LINK_LIBRARIES PUBLIC GridKit::optimal_power_flow_components diff --git a/GridKit/Model/OptimalPowerFlow/Component.hpp b/GridKit/Model/OptimalPowerFlow/Component.hpp index 52989aa2e3..4cad0e5ea9 100644 --- a/GridKit/Model/OptimalPowerFlow/Component.hpp +++ b/GridKit/Model/OptimalPowerFlow/Component.hpp @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include @@ -22,17 +22,20 @@ namespace GridKit { using Log = ::GridKit::Utilities::Logger; - /// Bound of a variable or constraint without a limit + /// Limit of a variable or constraint function without one template inline constexpr RealT UNBOUNDED = std::numeric_limits::infinity(); /** * @brief Optimal power flow component * - * Local variables are the internal variables followed by the real and - * imaginary voltage of each terminal bus. Local constraints are the - * internal constraints followed by the active and reactive power into - * each terminal bus. The system model maps local indices to global ones. + * Internal constraints limit the internal variables or the internal + * constraint functions. External constraint functions add the active and + * reactive power into each terminal bus to its balance. Local variables + * are the internal variables followed by the real and imaginary voltage + * of each terminal bus, and local constraint functions are the internal + * ones followed by the external ones. The system model maps local indices + * to global ones. */ template class Component @@ -43,25 +46,19 @@ namespace GridKit using RealT = typename ScalarTraits::RealT; using CooEntriesT = Enzyme::Sparse::CooEntries; - /// Local variables and constraints per terminal + /// Local variables and constraint functions per terminal static constexpr IdxT TERMINAL_SIZE = 2; virtual ~Component() = default; - virtual int verify() const = 0; + virtual Model::ConfigurationChecks verify() const = 0; /** - * @brief Set initial values and bounds of the internal variables + * @brief Set the starting point of the internal variables * - * @param[in] state - Operating state * @param[out] x - Variables - * @param[out] x_lower - Variable lower bounds - * @param[out] x_upper - Variable upper bounds */ - virtual int initialize(const Model::StateData& state, - ScalarT* x, - RealT* x_lower, - RealT* x_upper) = 0; + virtual int initialize(ScalarT* x) = 0; /// Add the objective contribution at `x` to `f` virtual int evaluateObjective(const ScalarT* x, ScalarT& f) = 0; @@ -78,9 +75,6 @@ namespace GridKit /// Evaluate the lower Lagrangian Hessian entries at `x` into `hessian()` virtual int evaluateHessian(const ScalarT* x, RealT sigma, const RealT* lambda) = 0; - /// Active and reactive power into each terminal bus at `x` - virtual int evaluateTerminalPower(const ScalarT* x, ScalarT* power) = 0; - IdxT size() const { return static_cast(variable_indices_.size()); @@ -91,9 +85,9 @@ namespace GridKit return static_cast(constraint_indices_.size()); } - IdxT sizeInternal() const + IdxT sizeInternalVariables() const { - return size_internal_; + return static_cast(variable_lower_.size()); } IdxT sizeInternalConstraints() const @@ -106,19 +100,36 @@ namespace GridKit return id_; } + bool inService() const + { + return in_service_ > ZERO; + } + /// Bus number of each terminal const std::vector& terminals() const { return terminals_; } - /// Lower bounds of the internal constraints + /// Lower limits of the internal variables + const std::vector& variableLower() const + { + return variable_lower_; + } + + /// Upper limits of the internal variables + const std::vector& variableUpper() const + { + return variable_upper_; + } + + /// Lower limits of the internal constraint functions const std::vector& constraintLower() const { return constraint_lower_; } - /// Upper bounds of the internal constraints + /// Upper limits of the internal constraint functions const std::vector& constraintUpper() const { return constraint_upper_; @@ -156,54 +167,37 @@ namespace GridKit protected: /** - * @param[in] id - Case device `id` + * @param[in] id - Device `id` * @param[in] terminals - Bus number of each terminal - * @param[in] size_internal - Number of internal variables - * @param[in] size_internal_constraints - Number of internal constraints + * @param[in] in_service - Service status + * @param[in] size_internal_variables - Number of internal variables + * @param[in] size_internal_constraints - Number of internal constraint functions */ Component(std::string id, std::vector terminals, - IdxT size_internal, + bool in_service, + IdxT size_internal_variables, IdxT size_internal_constraints) : id_(std::move(id)), terminals_(std::move(terminals)), - size_internal_(size_internal), + variable_lower_(size_internal_variables, -UNBOUNDED), + variable_upper_(size_internal_variables, UNBOUNDED), constraint_lower_(size_internal_constraints, -UNBOUNDED), constraint_upper_(size_internal_constraints, UNBOUNDED), - variable_indices_(size_internal + TERMINAL_SIZE * terminals_.size(), INVALID_INDEX), + variable_indices_(size_internal_variables + TERMINAL_SIZE * terminals_.size(), INVALID_INDEX), constraint_indices_(size_internal_constraints + TERMINAL_SIZE * terminals_.size(), INVALID_INDEX) { - } - - /** - * @brief Log `message` for this component if `condition` fails - * - * @return 0 if `condition` holds, 1 otherwise - */ - int check(bool condition, const char* message) const - { - if (condition) + if (!in_service) { - return 0; + in_service_ = ZERO; } - Log::error() << id_ << ": " << message << "\n"; - return 1; - } - - /** - * @brief Power into the bus at `terminal` given by the state - * - * @return false if the state has no current for the terminal or no - * voltage for its bus - */ - bool statePower(const Model::StateData& state, IdxT terminal, RealT& p, RealT& q) const - { - return Model::terminalPower(state, id_, terminals_[terminal], terminal, terminals_.size(), p, q); } std::string id_; std::vector terminals_; - IdxT size_internal_{0}; + RealT in_service_{ONE}; ///< \f$u\f$ Service status, 1 in service and 0 out of service + std::vector variable_lower_; + std::vector variable_upper_; std::vector constraint_lower_; std::vector constraint_upper_; std::vector variable_indices_; diff --git a/GridKit/Model/OptimalPowerFlow/ComponentData.hpp b/GridKit/Model/OptimalPowerFlow/ComponentData.hpp index edf449d6e7..d1b03972af 100644 --- a/GridKit/Model/OptimalPowerFlow/ComponentData.hpp +++ b/GridKit/Model/OptimalPowerFlow/ComponentData.hpp @@ -5,14 +5,13 @@ #pragma once +#include #include #include -#include #include -#include - #include +#include namespace GridKit { @@ -27,7 +26,7 @@ namespace GridKit * @tparam buses_enum Enumeration over terminal buses */ template - requires std::is_enum_v && std::is_enum_v + requires Utilities::SizedEnum && Utilities::SizedEnum struct ComponentData { using RealT = real_type; @@ -35,9 +34,12 @@ namespace GridKit using Parameters = parameters_enum; using Buses = buses_enum; - /// Case device `id` + /// Device `id` std::string id; + /// An out-of-service device keeps its entries and carries no power + bool in_service{true}; + /// Mapping of parameters to parameter values std::map parameters; @@ -71,16 +73,10 @@ namespace GridKit { using IdxT = typename DataT::IdxT; - std::vector numbers; - for (const auto terminal : magic_enum::enum_values()) + std::vector numbers(Utilities::enum_size(), INVALID_INDEX); + for (const auto& [terminal, number] : data.buses) { - IdxT number = INVALID_INDEX; - const auto entry = data.buses.find(terminal); - if (entry != data.buses.end()) - { - number = entry->second; - } - numbers.push_back(number); + numbers[static_cast(terminal)] = number; } return numbers; } diff --git a/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp b/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp index 54c509feea..510a7678de 100644 --- a/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp +++ b/GridKit/Model/OptimalPowerFlow/ComponentModel.hpp @@ -19,9 +19,9 @@ namespace GridKit * * `model_type` provides `objective(x)` and `constraints(x, g)` over its * local variables, the sizes `VARIABLE_SIZE`, `CONSTRAINT_SIZE`, - * `INTERNAL_SIZE` and `INTERNAL_CONSTRAINT_SIZE`, and `CONSTANT`, which is - * true when neither kernel depends on the variables. `g` starts at zero, - * so a kernel writes only the rows it contributes to. Derivatives come + * `INTERNAL_VARIABLE_SIZE` and `INTERNAL_CONSTRAINT_SIZE`, and `CONSTANT`, + * which is true when neither kernel depends on the variables. `g` starts + * at zero, so a kernel writes only the entries it contributes to. Derivatives come * from Enzyme for double scalars and from the system dependencies for * `DependencyTracking::Variable`. * @@ -40,14 +40,14 @@ namespace GridKit int evaluateConstraints(const ScalarT* x, ScalarT* g) override; int evaluateJacobian(const ScalarT* x) override; int evaluateHessian(const ScalarT* x, RealT sigma, const RealT* lambda) override; - int evaluateTerminalPower(const ScalarT* x, ScalarT* power) override; protected: /** - * @param[in] id - Case device `id` + * @param[in] id - Device `id` * @param[in] terminals - Bus number of each terminal + * @param[in] in_service - Service status */ - ComponentModel(std::string id, std::vector terminals); + ComponentModel(std::string id, std::vector terminals, bool in_service = true); private: static constexpr bool hasEnzymeDerivatives(); diff --git a/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp b/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp index cddb7cff0b..8c95fb0b3f 100644 --- a/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/ComponentModelImpl.hpp @@ -5,7 +5,6 @@ #pragma once -#include #include #include #include @@ -65,10 +64,12 @@ namespace GridKit template ComponentModel::ComponentModel(std::string id, - std::vector terminals) + std::vector terminals, + bool in_service) : Component(std::move(id), std::move(terminals), - model_type::INTERNAL_SIZE, + in_service, + model_type::INTERNAL_VARIABLE_SIZE, model_type::INTERNAL_CONSTRAINT_SIZE) { assert(this->size() == model_type::VARIABLE_SIZE); @@ -164,16 +165,5 @@ namespace GridKit } return 0; } - - template - int ComponentModel::evaluateTerminalPower(const ScalarT* x, ScalarT* power) - { - const auto local = gather(x); - std::array local_g{}; - model().constraints(local.data(), local_g.data()); - - std::copy(local_g.begin() + model_type::INTERNAL_CONSTRAINT_SIZE, local_g.end(), power); - return 0; - } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp b/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp index 5cb4d3f1e2..bc7bcc8a54 100644 --- a/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp +++ b/GridKit/Model/OptimalPowerFlow/Generator/Generator.hpp @@ -21,8 +21,10 @@ namespace GridKit { using ComponentModelT = ComponentModel, scalar_type, index_type>; - using ComponentModelT::id_; + using ComponentModelT::in_service_; using ComponentModelT::variable_indices_; + using ComponentModelT::variable_lower_; + using ComponentModelT::variable_upper_; public: using ScalarT = scalar_type; @@ -32,16 +34,18 @@ namespace GridKit /// Local variables: active and reactive power, then terminal real and imaginary voltage static constexpr IdxT VARIABLE_SIZE = 4; - /// Local constraints: power into the bus + /// Local constraint functions: power into the bus static constexpr IdxT CONSTRAINT_SIZE = 2; - static constexpr IdxT INTERNAL_SIZE = 2; + /// Internal variables: active and reactive power + static constexpr IdxT INTERNAL_VARIABLE_SIZE = 2; + /// Internal constraint functions: none, the power limits act on the internal variables static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; static constexpr bool CONSTANT = false; explicit Generator(const ModelDataT& data); - int verify() const override; - int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + Model::ConfigurationChecks verify() const override; + int initialize(ScalarT* x) override; __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; @@ -54,7 +58,6 @@ namespace GridKit RealT c0_{0.0}; RealT c1_{0.0}; RealT c2_{0.0}; - RealT online_{1.0}; }; } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp index 192473a05e..f79a37c378 100644 --- a/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/Generator/GeneratorImpl.hpp @@ -17,7 +17,7 @@ namespace GridKit { template Generator::Generator(const ModelDataT& data) - : ComponentModelT(data.id, busNumbers(data)), + : ComponentModelT(data.id, busNumbers(data), data.in_service), Pmin_(parameter(data, GeneratorParameters::Pmin, -UNBOUNDED)), Pmax_(parameter(data, GeneratorParameters::Pmax, UNBOUNDED)), Qmin_(parameter(data, GeneratorParameters::Qmin, -UNBOUNDED)), @@ -26,67 +26,36 @@ namespace GridKit c1_(parameter(data, GeneratorParameters::c1, ZERO)), c2_(parameter(data, GeneratorParameters::c2, ZERO)) { + // Out of service, the internal constraints fix the power at zero + variable_lower_ = {ZERO, ZERO}; + variable_upper_ = {ZERO, ZERO}; + if (data.in_service) + { + variable_lower_ = {Pmin_, Qmin_}; + variable_upper_ = {Pmax_, Qmax_}; + } } template - int Generator::verify() const + Model::ConfigurationChecks Generator::verify() const { - return this->check(Pmin_ <= Pmax_, "Pmin must not exceed Pmax") - + this->check(Qmin_ <= Qmax_, "Qmin must not exceed Qmax") - + this->check(std::isfinite(c0_), "c0 must be finite") - + this->check(std::isfinite(c1_), "c1 must be finite") - + this->check(std::isfinite(c2_), "c2 must be finite"); + Model::ConfigurationChecks checks("Generator"); + checks.check(Pmin_ <= Pmax_, "Pmin must not exceed Pmax"); + checks.check(Qmin_ <= Qmax_, "Qmin must not exceed Qmax"); + checks.check(std::isfinite(c0_), "c0 must be finite"); + checks.check(std::isfinite(c1_), "c1 must be finite"); + checks.check(std::isfinite(c2_), "c2 must be finite"); + return checks; } /** - * @brief Start from the state injection and bound it by the limits - * - * An offline generator injects no power and has no cost. + * @brief Start from zero power */ template - int Generator::initialize(const Model::StateData& state, - ScalarT* x, - RealT* x_lower, - RealT* x_upper) + int Generator::initialize(ScalarT* x) { - bool online = true; - const Model::StateRecord* record = state.device(id_); - if (record != nullptr) - { - online = record->flag("online", true); - } - - RealT p = ZERO; - RealT q = ZERO; - this->statePower(state, 0, p, q); - - RealT p_lower = Pmin_; - RealT p_upper = Pmax_; - RealT q_lower = Qmin_; - RealT q_upper = Qmax_; - - online_ = ONE; - if (!online) - { - online_ = ZERO; - p = ZERO; - q = ZERO; - p_lower = ZERO; - p_upper = ZERO; - q_lower = ZERO; - q_upper = ZERO; - } - - const IdxT p_index = variable_indices_[0]; - const IdxT q_index = variable_indices_[1]; - - x[p_index] = p; - x[q_index] = q; - x_lower[p_index] = p_lower; - x_upper[p_index] = p_upper; - x_lower[q_index] = q_lower; - x_upper[q_index] = q_upper; - + x[variable_indices_[0]] = ZERO; + x[variable_indices_[1]] = ZERO; return 0; } @@ -95,7 +64,7 @@ namespace GridKit Generator::objective(const ScalarT* x) const { const ScalarT p = x[0]; - return online_ * (c0_ + c1_ * p + c2_ * p * p); + return in_service_ * (c0_ + c1_ * p + c2_ * p * p); } template diff --git a/GridKit/Model/OptimalPowerFlow/Generator/README.md b/GridKit/Model/OptimalPowerFlow/Generator/README.md index f0597753a4..e96418d1ca 100644 --- a/GridKit/Model/OptimalPowerFlow/Generator/README.md +++ b/GridKit/Model/OptimalPowerFlow/Generator/README.md @@ -1,23 +1,19 @@ # Generator -Dispatchable active and reactive power injection with a quadratic cost. The -`EconomicDispatch` example makes one for every GENROU, GENSAL, -GenClassical, and REGCA device in the case, with limits and costs from the -MATPOWER case on the system base. +Dispatchable active and reactive power injection with a quadratic cost. ## Model Parameters -Symbol | Units | JSON | Description | Typical Value | Note ----------------------|--------|--------|-------------------------------|---------------|----- -$P^{\min}$ | [p.u.] | `Pmin` | Active power lower limit | 0 | Default unbounded -$P^{\max}$ | [p.u.] | `Pmax` | Active power upper limit | 1 | Default unbounded -$Q^{\min}$ | [p.u.] | `Qmin` | Reactive power lower limit | -0.5 | Default unbounded -$Q^{\max}$ | [p.u.] | `Qmax` | Reactive power upper limit | 0.5 | Default unbounded -$c_0$ | | `c0` | Constant cost coefficient | 0 | Default 0 -$c_1$ | | `c1` | Linear cost coefficient | 1000 | Default 0 -$c_2$ | | `c2` | Quadratic cost coefficient | 100 | Default 0 - -Values are on the system base. +Symbol | Units | Data | Description | Typical Value | Note +-----------|--------|--------------|---------------------------------------------------|---------------|----- +$P^{\min}$ | [p.u.] | `Pmin` | Active power lower limit | 0 | Default unbounded +$P^{\max}$ | [p.u.] | `Pmax` | Active power upper limit | 1 | Default unbounded +$Q^{\min}$ | [p.u.] | `Qmin` | Reactive power lower limit | -0.5 | Default unbounded +$Q^{\max}$ | [p.u.] | `Qmax` | Reactive power upper limit | 0.5 | Default unbounded +$c_0$ | [\$/h] | `c0` | Constant cost coefficient | | Default 0 +$c_1$ | [\$/h] | `c1` | Linear cost coefficient | 1000 | Default 0 +$c_2$ | [\$/h] | `c2` | Quadratic cost coefficient | 100 | Default 0 +$u$ | [-] | `in_service` | Service status, 1 in service and 0 out of service | | Default 1 ### Parameter Validation @@ -31,62 +27,61 @@ None. ## Model Ports -Name | Port | Init | Description -------|------|-------|------------ -`bus` | Bus | Known | Terminal bus +Name | Port | Description +------|------|------------ +`bus` | Bus | Terminal bus ## Model Variables ### Internal Variables -Symbol | Units | Description | Note --------|--------|--------------------------------|----- -$P$ | [p.u.] | Active power into the bus | System base -$Q$ | [p.u.] | Reactive power into the bus | System base +Symbol | Units | Description | Note +-------|--------|-----------------------------|----- +$P$ | [p.u.] | Active power into the bus | +$Q$ | [p.u.] | Reactive power into the bus | ### External Variables -Symbol | Units | Description | Note ------------------|--------|------------------------------|----- -$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus -$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus +Symbol | Units | Description | Note +---------------|--------|----------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus ## Model Equations ### Objective ```math -a \left(c_0 + c_1 P + c_2 P^2\right) +\begin{aligned} +f &\mathrel{+}= u (c_0 + c_1 P + c_2 P^2) +\end{aligned} ``` -### External Constraints +### Internal Constraints ```math \begin{aligned} -\Delta P^\mathrm{bus} &\mathrel{+}= P \\ -\Delta Q^\mathrm{bus} &\mathrel{+}= Q +P^{\min} &\le P \le P^{\max} && \text{in service} \\ +Q^{\min} &\le Q \le Q^{\max} && \text{in service} \\ +0 &= P && \text{out of service} \\ +0 &= Q && \text{out of service} \end{aligned} ``` -### Bounds +### External Constraints ```math \begin{aligned} -P^{\min} &\le P \le P^{\max} \\ -Q^{\min} &\le Q \le Q^{\max} +\Delta P^\mathrm{bus} &\mathrel{+}= P \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= Q \end{aligned} ``` -An offline generator has $P = Q = 0$. - ## Initialization -The state terminal current and bus voltage give the starting point, which is -zero without them: - ```math -P + jQ \leftarrow V_\mathrm{bus} I^* +\begin{aligned} +P &\leftarrow 0 \\ +Q &\leftarrow 0 +\end{aligned} ``` - -$a \leftarrow 0$ if the state marks the device `online` as false, and $a -\leftarrow 1$ otherwise. diff --git a/GridKit/Model/OptimalPowerFlow/Load/Load.hpp b/GridKit/Model/OptimalPowerFlow/Load/Load.hpp index 404f85c5ac..d2f9291f30 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/Load.hpp +++ b/GridKit/Model/OptimalPowerFlow/Load/Load.hpp @@ -13,14 +13,14 @@ namespace GridKit namespace OptimalPowerFlow { /** - * @brief Fixed power demand given by the state + * @brief Constant power demand */ template class Load : public ComponentModel, scalar_type, index_type> { using ComponentModelT = ComponentModel, scalar_type, index_type>; - using ComponentModelT::id_; + using ComponentModelT::in_service_; public: using ScalarT = scalar_type; @@ -30,23 +30,25 @@ namespace GridKit /// Local variables: terminal real and imaginary voltage static constexpr IdxT VARIABLE_SIZE = 2; - /// Local constraints: power into the bus + /// Local constraint functions: power into the bus static constexpr IdxT CONSTRAINT_SIZE = 2; - static constexpr IdxT INTERNAL_SIZE = 0; + /// Internal variables: none + static constexpr IdxT INTERNAL_VARIABLE_SIZE = 0; + /// Internal constraint functions: none static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; static constexpr bool CONSTANT = true; explicit Load(const ModelDataT& data); - int verify() const override; - int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + Model::ConfigurationChecks verify() const override; + int initialize(ScalarT* x) override; __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; private: - RealT p_{0.0}; - RealT q_{0.0}; + RealT P_{0.0}; + RealT Q_{0.0}; }; } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp b/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp index 8b4ee0f741..3ffe41165e 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp +++ b/GridKit/Model/OptimalPowerFlow/Load/LoadData.hpp @@ -13,9 +13,11 @@ namespace GridKit { namespace OptimalPowerFlow { - /// Parameters for a load, whose demand comes from the state + /// Parameters for a load enum class LoadParameters : size_t { + P, ///< \f$P\f$ Active power demand [p.u.] + Q, ///< \f$Q\f$ Reactive power demand [p.u.] }; /// Buses for a load diff --git a/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp b/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp index 78cd65b2c7..4eac036a3b 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/Load/LoadImpl.hpp @@ -5,6 +5,8 @@ #pragma once +#include + #include #include #include @@ -15,38 +17,28 @@ namespace GridKit { template Load::Load(const ModelDataT& data) - : ComponentModelT(data.id, busNumbers(data)) + : ComponentModelT(data.id, busNumbers(data), data.in_service), + P_(parameter(data, LoadParameters::P, ZERO)), + Q_(parameter(data, LoadParameters::Q, ZERO)) { } template - int Load::verify() const + Model::ConfigurationChecks Load::verify() const { - return 0; + Model::ConfigurationChecks checks("Load"); + checks.check(std::isfinite(P_), "P must be finite"); + checks.check(std::isfinite(Q_), "Q must be finite"); + return checks; } /** - * @brief Take the demand from the state injection - * - * An offline load draws no power. + * @brief No internal variables */ template - int Load::initialize(const Model::StateData& state, - [[maybe_unused]] ScalarT* x, - [[maybe_unused]] RealT* x_lower, - [[maybe_unused]] RealT* x_upper) + int Load::initialize([[maybe_unused]] ScalarT* x) { - const bool has_power = this->statePower(state, 0, p_, q_); - - const Model::StateRecord* record = state.device(id_); - if (record != nullptr && !record->flag("online", true)) - { - p_ = ZERO; - q_ = ZERO; - return 0; - } - - return this->check(has_power, "state has no current for the load or no voltage for its bus"); + return 0; } template @@ -60,8 +52,8 @@ namespace GridKit __attribute__((always_inline)) inline void Load::constraints([[maybe_unused]] const ScalarT* x, ScalarT* g) const { - g[0] = p_; - g[1] = q_; + g[0] = -in_service_ * P_; + g[1] = -in_service_ * Q_; } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Load/README.md b/GridKit/Model/OptimalPowerFlow/Load/README.md index 968fbb86d5..768a4ff061 100644 --- a/GridKit/Model/OptimalPowerFlow/Load/README.md +++ b/GridKit/Model/OptimalPowerFlow/Load/README.md @@ -1,17 +1,28 @@ # Load -Fixed power demand given by the state. The `EconomicDispatch` example makes -one for every LoadZIP device in the case. +Constant power demand. ## Model Parameters +Symbol | Units | Data | Description | Typical Value | Note +-------|--------|--------------|---------------------------------------------------|---------------|----- +$P$ | [p.u.] | `P` | Active power demand | | Default 0 +$Q$ | [p.u.] | `Q` | Reactive power demand | | Default 0 +$u$ | [-] | `in_service` | Service status, 1 in service and 0 out of service | | Default 1 + +### Parameter Validation + +- $P$ and $Q$ are finite + +### Model Derived Parameters + None. ## Model Ports -Name | Port | Init | Description -------|------|-------|------------ -`bus` | Bus | Known | Terminal bus +Name | Port | Description +------|------|------------ +`bus` | Bus | Terminal bus ## Model Variables @@ -21,10 +32,10 @@ None. ### External Variables -Symbol | Units | Description | Note ------------------|--------|------------------------------|----- -$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus -$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus +Symbol | Units | Description | Note +---------------|--------|----------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus ## Model Equations @@ -32,21 +43,19 @@ $V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus None. +### Internal Constraints + +None. + ### External Constraints ```math \begin{aligned} -\Delta P^\mathrm{bus} &\mathrel{+}= P^\mathrm{state} \\ -\Delta Q^\mathrm{bus} &\mathrel{+}= Q^\mathrm{state} +\Delta P^\mathrm{bus} &\mathrel{+}= -u P \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= -u Q \end{aligned} ``` ## Initialization -The state terminal current and bus voltage give the injection: - -```math -P^\mathrm{state} + jQ^\mathrm{state} \leftarrow V_\mathrm{bus} I^* -``` - -An offline load injects zero. A load without a state current is an error. +None. diff --git a/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp b/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp deleted file mode 100644 index 797887dc59..0000000000 --- a/GridKit/Model/OptimalPowerFlow/MatpowerData.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file MatpowerData.cpp - * @brief MATPOWER case file input. - */ - -#include -#include -#include -#include -#include - -#include -#include - -namespace GridKit -{ - namespace OptimalPowerFlow - { - const MatpowerMatrix& MatpowerData::matrix(const std::string& name) const - { - const auto entry = matrices.find(name); - if (entry == matrices.end()) - { - throw std::invalid_argument("MATPOWER case has no mpc." + name); - } - return entry->second; - } - - MatpowerData parseMatpowerData(std::istream& stream) - { - static const std::regex matrix_start(R"(\s*mpc\.(\w+)\s*=\s*\[(.*))"); - - MatpowerData data; - for (std::string line; std::getline(stream, line);) - { - std::smatch match; - if (!std::regex_match(line, match, matrix_start)) - { - continue; - } - - auto& matrix = data.matrices[match[1]]; - GridKit::readMatPowerMatrix(stream, line, [&](const std::string& row) - { - std::istringstream values(row); - std::vector numbers{std::istream_iterator(values), std::istream_iterator()}; - if (!values.eof()) - { - throw std::invalid_argument("MATPOWER matrix row is not numeric: " + row); - } - matrix.push_back(std::move(numbers)); }); - } - return data; - } - - MatpowerData parseMatpowerData(const std::filesystem::path& file) - { - std::ifstream stream(file); - if (!stream) - { - throw std::runtime_error("Could not open MATPOWER case file " + file.string()); - } - return parseMatpowerData(stream); - } - } // namespace OptimalPowerFlow -} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp b/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp deleted file mode 100644 index 11ec207247..0000000000 --- a/GridKit/Model/OptimalPowerFlow/MatpowerData.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file MatpowerData.hpp - * @brief Numeric data of a MATPOWER case file. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace GridKit -{ - namespace OptimalPowerFlow - { - /// Rows of a MATPOWER matrix - using MatpowerMatrix = std::vector>; - - /** - * @brief Numeric matrices of a MATPOWER case file by field name - * - * Holds every `mpc. = [ ... ];` matrix. Rows end at `;` or at the - * end of a line and may have any number of columns. Scalars and cell - * arrays such as `mpc.bus_name` are skipped. - */ - struct MatpowerData - { - std::map matrices; - - /// Matrix `mpc.` - const MatpowerMatrix& matrix(const std::string& name) const; - }; - - /// Zero-based columns of MATPOWER `idx_bus`, `idx_brch`, `idx_gen`, and `idx_cost` - namespace MatpowerColumns - { - inline constexpr size_t BUS_I = 0; - inline constexpr size_t VMAX = 11; - inline constexpr size_t VMIN = 12; - inline constexpr size_t F_BUS = 0; - inline constexpr size_t T_BUS = 1; - inline constexpr size_t RATE_A = 5; - inline constexpr size_t BR_STATUS = 10; - inline constexpr size_t GEN_BUS = 0; - inline constexpr size_t QMAX = 3; - inline constexpr size_t QMIN = 4; - inline constexpr size_t GEN_STATUS = 7; - inline constexpr size_t PMAX = 8; - inline constexpr size_t PMIN = 9; - inline constexpr size_t MODEL = 0; - inline constexpr size_t NCOST = 3; - inline constexpr size_t COST = 4; - } // namespace MatpowerColumns - - MatpowerData parseMatpowerData(std::istream& stream); - MatpowerData parseMatpowerData(const std::filesystem::path& file); - } // namespace OptimalPowerFlow -} // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/README.md b/GridKit/Model/OptimalPowerFlow/README.md index 66f1608732..8cd42821bd 100644 --- a/GridKit/Model/OptimalPowerFlow/README.md +++ b/GridKit/Model/OptimalPowerFlow/README.md @@ -1,87 +1,68 @@ # Optimal Power Flow AC optimal power flow in Cartesian coordinates. It finds the least-cost -operating point within the component limits and returns the solution as an -operating [state](../STATE.md). PhasorDynamics initialization is deferred. +operating point within the component limits. ## Formulation +Minimize + ```math \begin{aligned} -\min_x \quad & \sum_g a_g \left(c_{0,g} + c_{1,g} P_g + c_{2,g} P_g^2\right) \\ -\text{s.t.} \quad & \sum_{c \to k} P_{c,k}(x) = 0, \quad \sum_{c \to k} Q_{c,k}(x) = 0 && \text{each bus } k \text{ that is not infinite} \\ -& P_{\ell,k}^2 + Q_{\ell,k}^2 \le \left(S_\ell^{\max}\right)^2 && \text{each terminal } k \text{ of a rated branch } \ell \\ -& \left(V_k^{\min}\right)^2 \le V_{\mathrm{r}k}^2 + V_{\mathrm{i}k}^2 \le \left(V_k^{\max}\right)^2 \\ -& P_g^{\min} \le P_g \le P_g^{\max}, \quad Q_g^{\min} \le Q_g \le Q_g^{\max} \\ -& V_{\mathrm{r}}^\mathrm{state} V_{\mathrm{i}} - V_{\mathrm{i}}^\mathrm{state} V_{\mathrm{r}} = 0 && \text{reference bus} +f &= \sum_g u_g (c_{0g} + c_{1g} P_g + c_{2g} P_g^2) \end{aligned} ``` -- $P_{c,k}$ and $Q_{c,k}$ are the power component $c$ injects into bus $k$. - Every sign in this family is positive into the bus. -- $a_g$ is one for an online generator and zero for an offline one. -- The reference bus is the lowest-numbered bus. With an infinite bus there is - no reference bus. An infinite bus keeps its state voltage, has no balance - rows, and supplies any mismatch. -- A constraint without a finite bound gets no row. - -## Components +subject to -Component | Variables | Constraints | Kernels -------------|----------------------|----------------------------------|---------- -`Bus` | $V_\mathrm{r}$, $V_\mathrm{i}$ | Power balance, $\lvert V \rvert^2$, and angle reference | Quadratic -`Branch` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | $\lvert S_1 \rvert^2$, $\lvert S_2 \rvert^2$ and power into both buses | Quartic -`Generator` | $P$, $Q$ and terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus | Quadratic cost -`Load` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus, fixed by the state | Constant -`Shunt` | Terminal $V_\mathrm{r}$, $V_\mathrm{i}$ | Power into the bus | Quadratic - -Local variables are the internal variables followed by $V_\mathrm{r}$ and -$V_\mathrm{i}$ of each terminal bus. Local constraints are the internal -constraints followed by $P$ and $Q$ into each terminal bus. `SystemModel` maps both to global indices, so a -device adds its injection to the balance rows of its buses. +```math +\begin{aligned} +0 &= \sum_{c \to k} P_{ck} && \text{each bus } k \\ +0 &= \sum_{c \to k} Q_{ck} && \text{each bus } k \\ +(V_k^{\min})^2 &\le V_{\mathrm{r}k}^2 + V_{\mathrm{i}k}^2 \le (V_k^{\max})^2 && \text{each bus } k \\ +0 &= V_{\mathrm{i}k} && \text{each reference bus } k \\ +P_{\ell k}^2 + Q_{\ell k}^2 &\le (S_\ell^{\max})^2 && \text{each terminal } k \text{ of each branch } \ell \\ +P_g^{\min} &\le P_g \le P_g^{\max} && \text{each in-service generator } g \\ +Q_g^{\min} &\le Q_g \le Q_g^{\max} && \text{each in-service generator } g \\ +0 &= P_g && \text{each out-of-service generator } g \\ +0 &= Q_g && \text{each out-of-service generator } g +\end{aligned} +``` ## Derivatives -Each model supplies two kernels over its local variables, `objective(x)` and -`constraints(x, g)`. `ComponentModel` differentiates them with Enzyme: +Each component supplies `objective(x)` and `constraints(x, g)`, which +`ComponentModel` differentiates with Enzyme: -Driver | Derivative | Mode ----------|------------------------------------------------------|--------------------- -`DfDx` | Objective gradient | Reverse -`DgDx` | Constraint Jacobian | Forward, one sweep per local variable +Driver | Derivative | Mode +---------|-----------------------------------------------------------|----- +`DfDx` | Objective gradient | Reverse +`DgDx` | Constraint Jacobian | Forward `D2LDx2` | Lower triangle of the Hessian of $\sigma f + \lambda^T g$ | Forward over reverse -The Jacobian and Hessian stores are sparse. Enzyme's sparsity analysis stores -every structural entry, numerical zeros included, so the patterns set in -`allocate()` hold at every point and for every multiplier. `Load` has a -constant kernel and no entries. - -The `DependencyTracking::Variable` instantiations give the same Jacobian and -objective gradient from dependencies. Tests compare the two. - ## Data -`SystemModelData` holds the network supplied by the caller. -`applyMatpowerData` adds limits and costs -from a [MATPOWER case](https://matpower.org/docs/ref/matpower/caseformat.html) -of the same network: - -- Buses match by number and take `VMIN` and `VMAX`. -- The in-service branches between two buses match the branches between them - in order and take a nonzero `RATE_A`. -- The in-service generators at a bus match the generators at that bus in - order and take `PMIN`, `PMAX`, `QMIN`, `QMAX`, and their polynomial cost of - at most second order. MATPOWER generators at a bus without generators are - static injections that the loads already carry. -- Values in MW, Mvar, and MVA and costs in P [MW] become system base values. - -`parseMatpowerData` reads every numeric `mpc.` matrix. Rows end at `;` or -at the end of a line, so both MATPOWER and PowerWorld exports read. Matrix -scanning is shared with the PowerFlow reader. - -## State - -`SystemModel` reads the starting point, the load demand, and the device settings -`online`, `open`, `tap`, and `phase` from a state. `solutionState()` returns -that state with the solved bus voltages and the terminal currents of every -device, computed from the power into each terminal bus. +`parseMatpowerCase` reads a +[MATPOWER case](https://matpower.org/docs/ref/matpower/caseformat.html): + +MATPOWER | Component | Parameters +-------------------------------------------------------|-------------|----------- +bus `BUS_TYPE` 3 | `Bus` | `reference` +bus `VMIN`, `VMAX` | `Bus` | $V^{\min}$, $V^{\max}$ +bus `PD`, `QD` when either is nonzero | `Load` | $P$, $Q$ +bus `GS`, `BS` when either is nonzero | `Shunt` | $G$, $B$ +branch `BR_R`, `BR_X`, `BR_B` | `Branch` | $R$, $X$, $B$ +branch `TAP`, `SHIFT` | `Branch` | $\tau$, $\theta$ +branch `RATE_A` when positive | `Branch` | $S^{\max}$ +branch `BR_STATUS` | `Branch` | $u$ +gen `PMIN`, `PMAX`, `QMIN`, `QMAX` | `Generator` | $P^{\min}$, $P^{\max}$, $Q^{\min}$, $Q^{\max}$ +gen `GEN_STATUS` | `Generator` | $u$ +gencost `COST` of a polynomial of at most second order | `Generator` | $c_2$, $c_1$, $c_0$ + +A zero `TAP` gives $\tau = 1$ for a line. The branch also gets +$B_\mathrm{mag} = B (1 / \tau^2 - 1) / 2$ so that the line charging at bus 1 +scales by $1 / \tau^2$ as in MATPOWER. Values in MW, Mvar, and MVA and costs in +P [MW] become system base values, and `SHIFT` in degrees becomes radians. Every +island needs a reference bus. The model has no isolated buses, angle-difference +limits, or other cost models, so `parseMatpowerCase` throws for a case that uses +them. diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/README.md b/GridKit/Model/OptimalPowerFlow/Shunt/README.md index 15cfb7a070..e5c4dcc7f7 100644 --- a/GridKit/Model/OptimalPowerFlow/Shunt/README.md +++ b/GridKit/Model/OptimalPowerFlow/Shunt/README.md @@ -1,14 +1,14 @@ # Shunt -Constant admittance $Y = G + jB$ to ground. The `EconomicDispatch` example -makes one for every LoadZ device in the case. +Constant admittance $Y = G + jB$ to ground. ## Model Parameters -Symbol | Units | JSON | Description | Typical Value | Note --------|--------|------|-------------------|---------------|----- -$G$ | [p.u.] | `G` | Shunt conductance | | $R / (R^2 + X^2)$ of the LoadZ -$B$ | [p.u.] | `B` | Shunt susceptance | | $-X / (R^2 + X^2)$ of the LoadZ +Symbol | Units | Data | Description | Typical Value | Note +-------|--------|--------------|---------------------------------------------------|---------------|----- +$G$ | [p.u.] | `G` | Shunt conductance | | Default 0 +$B$ | [p.u.] | `B` | Shunt susceptance | | Default 0 +$u$ | [-] | `in_service` | Service status, 1 in service and 0 out of service | | Default 1 ### Parameter Validation @@ -20,9 +20,9 @@ None. ## Model Ports -Name | Port | Init | Description -------|------|-------|------------ -`bus` | Bus | Known | Terminal bus +Name | Port | Description +------|------|------------ +`bus` | Bus | Terminal bus ## Model Variables @@ -32,10 +32,10 @@ None. ### External Variables -Symbol | Units | Description | Note ------------------|--------|------------------------------|----- -$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus -$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus +Symbol | Units | Description | Note +---------------|--------|----------------------------|----- +$V_\mathrm{r}$ | [p.u.] | Terminal real voltage | Owned by the bus +$V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus ## Model Equations @@ -43,18 +43,19 @@ $V_\mathrm{i}$ | [p.u.] | Terminal imaginary voltage | Owned by the bus None. -### External Constraints +### Internal Constraints -Power into the bus is $-Y^* \lvert V \rvert^2$: +None. + +### External Constraints ```math \begin{aligned} -\Delta P^\mathrm{bus} &\mathrel{+}= -a G \left(V_\mathrm{r}^2 + V_\mathrm{i}^2\right) \\ -\Delta Q^\mathrm{bus} &\mathrel{+}= a B \left(V_\mathrm{r}^2 + V_\mathrm{i}^2\right) +\Delta P^\mathrm{bus} &\mathrel{+}= -u G (V_\mathrm{r}^2 + V_\mathrm{i}^2) \\ +\Delta Q^\mathrm{bus} &\mathrel{+}= u B (V_\mathrm{r}^2 + V_\mathrm{i}^2) \end{aligned} ``` ## Initialization -$a \leftarrow 0$ if the state marks the device `online` as false, and $a -\leftarrow 1$ otherwise. +None. diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp b/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp index 517c22a3e8..ece0f8103e 100644 --- a/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp +++ b/GridKit/Model/OptimalPowerFlow/Shunt/Shunt.hpp @@ -15,14 +15,14 @@ namespace GridKit /** * @brief Constant admittance \f$Y = G + jB\f$ to ground * - * Power into the bus is \f$-Y^* V^2\f$. + * Power into the bus is \f$-Y^* (V_\mathrm{r}^2 + V_\mathrm{i}^2)\f$. */ template class Shunt : public ComponentModel, scalar_type, index_type> { using ComponentModelT = ComponentModel, scalar_type, index_type>; - using ComponentModelT::id_; + using ComponentModelT::in_service_; public: using ScalarT = scalar_type; @@ -32,16 +32,18 @@ namespace GridKit /// Local variables: terminal real and imaginary voltage static constexpr IdxT VARIABLE_SIZE = 2; - /// Local constraints: power into the bus + /// Local constraint functions: power into the bus static constexpr IdxT CONSTRAINT_SIZE = 2; - static constexpr IdxT INTERNAL_SIZE = 0; + /// Internal variables: none + static constexpr IdxT INTERNAL_VARIABLE_SIZE = 0; + /// Internal constraint functions: none static constexpr IdxT INTERNAL_CONSTRAINT_SIZE = 0; static constexpr bool CONSTANT = false; explicit Shunt(const ModelDataT& data); - int verify() const override; - int initialize(const Model::StateData& state, ScalarT* x, RealT* x_lower, RealT* x_upper) override; + Model::ConfigurationChecks verify() const override; + int initialize(ScalarT* x) override; __attribute__((always_inline)) inline ScalarT objective(const ScalarT* x) const; __attribute__((always_inline)) inline void constraints(const ScalarT* x, ScalarT* g) const; @@ -49,7 +51,6 @@ namespace GridKit private: RealT G_{0.0}; RealT B_{0.0}; - RealT online_{1.0}; }; } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp index 38fb4807be..ad180d0da9 100644 --- a/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/Shunt/ShuntImpl.hpp @@ -17,36 +17,27 @@ namespace GridKit { template Shunt::Shunt(const ModelDataT& data) - : ComponentModelT(data.id, busNumbers(data)), + : ComponentModelT(data.id, busNumbers(data), data.in_service), G_(parameter(data, ShuntParameters::G, ZERO)), B_(parameter(data, ShuntParameters::B, ZERO)) { } template - int Shunt::verify() const + Model::ConfigurationChecks Shunt::verify() const { - return this->check(std::isfinite(G_), "G must be finite") - + this->check(std::isfinite(B_), "B must be finite"); + Model::ConfigurationChecks checks("Shunt"); + checks.check(std::isfinite(G_), "G must be finite"); + checks.check(std::isfinite(B_), "B must be finite"); + return checks; } /** - * @brief An offline shunt draws no power + * @brief No internal variables */ template - int Shunt::initialize(const Model::StateData& state, - [[maybe_unused]] ScalarT* x, - [[maybe_unused]] RealT* x_lower, - [[maybe_unused]] RealT* x_upper) + int Shunt::initialize([[maybe_unused]] ScalarT* x) { - online_ = ONE; - - const Model::StateRecord* record = state.device(id_); - if (record != nullptr && !record->flag("online", true)) - { - online_ = ZERO; - } - return 0; } @@ -63,8 +54,8 @@ namespace GridKit { const ScalarT v2 = x[0] * x[0] + x[1] * x[1]; - g[0] = -online_ * G_ * v2; - g[1] = online_ * B_ * v2; + g[0] = -in_service_ * G_ * v2; + g[1] = in_service_ * B_ * v2; } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModel.hpp b/GridKit/Model/OptimalPowerFlow/SystemModel.hpp index a2cf8ffb1c..33ca5497d0 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModel.hpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModel.hpp @@ -9,10 +9,10 @@ #include #include +#include #include #include #include -#include namespace GridKit { @@ -25,10 +25,8 @@ namespace GridKit * @brief AC optimal power flow in Cartesian coordinates * * Minimizes the generation cost subject to the power balance at every - * bus that is not infinite and the bounds of the components. The state - * gives the starting point, the fixed demand, and the device settings. - * The reference bus is the lowest-numbered bus unless an infinite bus - * sets the angle reference. + * bus and the limits of the components. Each reference bus has zero + * imaginary voltage, and every island needs one. */ template class SystemModel : public Model::OptimizationEvaluator @@ -55,7 +53,7 @@ namespace GridKit using BusT = Bus; using CooEntriesT = typename ComponentT::CooEntriesT; - SystemModel(const SystemModelData& data, const Model::StateData& state); + explicit SystemModel(const SystemModelData& data); int allocate() override; int initialize() override; @@ -66,21 +64,19 @@ namespace GridKit int evaluateJacobian() override; int evaluateHessian(RealT sigma, const RealT* lambda) override; - /// Input state with the bus voltages and device currents at `x()` - Model::StateData solutionState() const; + Model::ConfigurationChecks verify() const; private: using EntriesT = const CooEntriesT& (ComponentT::*) () const; - int verify() const; + std::vector unreferencedIslands() const; + int connect(ComponentT& component); int allocateDerivatives(); std::unique_ptr assemble(IdxT rows, IdxT cols, EntriesT entries, std::vector& map_to_csr) const; int refill(CsrMatrixT& matrix, EntriesT entries, const std::vector& map_to_csr) const; - Model::StateData state_; - /// Buses first, then devices std::vector> components_; @@ -90,8 +86,6 @@ namespace GridKit /// Map from component entries to CSR entries std::vector jacobian_map_; std::vector hessian_map_; - - int data_errors_{0}; }; } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp index 8c047fe7ca..32d1463a71 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModelData.cpp @@ -1,18 +1,18 @@ /** * @file SystemModelData.cpp - * @brief Optimal power flow limits and costs from a MATPOWER case. + * @brief Optimal power flow data from a MATPOWER case. */ -#include #include -#include +#include +#include +#include #include #include -#include -#include -#include +#include #include +#include namespace GridKit { @@ -20,95 +20,105 @@ namespace GridKit { namespace { - namespace Column = MatpowerColumns; - using SystemModelDataT = SystemModelData; - using BusPair = std::pair; + using MatpowerDataT = PowerFlowData::SystemModelData; + + /// MATPOWER bus types + constexpr size_t REFERENCE_BUS = 3; + constexpr size_t ISOLATED_BUS = 4; /// MATPOWER polynomial cost model - constexpr double POLYNOMIAL = 2.0; + constexpr size_t POLYNOMIAL = 2; - /// Buses of a branch in increasing order - BusPair busPair(size_t bus1, size_t bus2) - { - return {std::min(bus1, bus2), std::max(bus1, bus2)}; - } + /// MATPOWER angle-difference limit of no effect [deg] + constexpr double NO_ANGLE_LIMIT = 360.0; + + constexpr double RADIANS_PER_DEGREE = std::numbers::pi / 180.0; - std::string name(const BusPair& buses) + bool isZero(double value) { - return "Branch " + std::to_string(buses.first) + "-" + std::to_string(buses.second); + return !(value < ZERO) && !(value > ZERO); } - /// Voltage limits of the buses, matched by number - void applyBuses(SystemModelDataT& data, const MatpowerMatrix& rows) + /// Buses, and the loads and shunts of their demand and shunt columns + void addBuses(SystemModelDataT& data, const MatpowerDataT& matpower) { - std::map buses; - for (auto& bus : data.bus) + const double mva_base = matpower.baseMVA; + for (size_t i = 0; i < matpower.bus.size(); ++i) { - buses[bus.number] = &bus; - } + const auto& row = matpower.bus[i]; + if (row.type == ISOLATED_BUS) + { + throw std::invalid_argument(std::format("MATPOWER bus {}: isolated buses are not supported", row.bus_i)); + } - for (const auto& row : rows) - { - const auto number = static_cast(row.at(Column::BUS_I)); - const auto bus = buses.find(number); - if (bus == buses.end()) + auto& bus = data.bus.emplace_back(); + bus.number = row.bus_i; + bus.reference = row.type == REFERENCE_BUS; + bus.parameters[BusParameters::Vmin] = row.Vmin; + bus.parameters[BusParameters::Vmax] = row.Vmax; + + const auto& demand = matpower.load[i]; + if (!isZero(demand.Pd) || !isZero(demand.Qd)) { - throw std::invalid_argument("MATPOWER bus " + std::to_string(number) + " is unknown or repeated"); + auto& load = data.load.emplace_back(); + load.id = std::format("load_{}", row.bus_i); + load.buses[LoadBuses::bus] = row.bus_i; + load.parameters[LoadParameters::P] = demand.Pd / mva_base; + load.parameters[LoadParameters::Q] = demand.Qd / mva_base; } - bus->second->parameters[BusParameters::Vmin] = row.at(Column::VMIN); - bus->second->parameters[BusParameters::Vmax] = row.at(Column::VMAX); - buses.erase(bus); - } - if (rows.size() != data.bus.size()) - { - throw std::invalid_argument("MATPOWER case has " + std::to_string(rows.size()) + " buses, but the case has " - + std::to_string(data.bus.size())); + if (!isZero(row.Gs) || !isZero(row.Bs)) + { + auto& shunt = data.shunt.emplace_back(); + shunt.id = std::format("shunt_{}", row.bus_i); + shunt.buses[ShuntBuses::bus] = row.bus_i; + shunt.parameters[ShuntParameters::G] = row.Gs / mva_base; + shunt.parameters[ShuntParameters::B] = row.Bs / mva_base; + } } } - /// Ratings of the branches, matched in order by their buses - void applyBranches(SystemModelDataT& data, const MatpowerMatrix& rows, double mva_base) + /// Branches, numbered by MATPOWER row + void addBranches(SystemModelDataT& data, const MatpowerDataT& matpower) { - std::map> branches; - for (auto& branch : data.branch) + const double mva_base = matpower.baseMVA; + for (size_t k = 0; k < matpower.branch.size(); ++k) { - branches[busPair(branch.buses.at(BranchBuses::bus1), branch.buses.at(BranchBuses::bus2))].push_back(&branch); - } + const auto& row = matpower.branch[k]; - std::map matched; - for (const auto& row : rows) - { - if (row.at(Column::BR_STATUS) <= 0.0) + const bool no_angle_limit = (row.angmin <= -NO_ANGLE_LIMIT && row.angmax >= NO_ANGLE_LIMIT) + || (isZero(row.angmin) && isZero(row.angmax)); + if (!no_angle_limit) { - continue; + throw std::invalid_argument(std::format("MATPOWER branch {}: angle difference limits are not supported", k + 1)); } - const BusPair buses = busPair(static_cast(row.at(Column::F_BUS)), static_cast(row.at(Column::T_BUS))); - size_t& count = matched[buses]; - if (count == branches[buses].size()) + // A zero ratio is a line + double tap = ONE; + if (!isZero(row.ratio)) { - throw std::invalid_argument(name(buses) + " has more in-service MATPOWER branches than the case"); + tap = row.ratio; } - // A zero rating is unlimited - auto& branch = *branches[buses][count++]; - if (row.at(Column::RATE_A) > 0.0) - { - branch.parameters[BranchParameters::Smax] = row.at(Column::RATE_A) / mva_base; - } - else - { - branch.parameters.erase(BranchParameters::Smax); - } - } + auto& branch = data.branch.emplace_back(); + branch.id = std::format("branch_{}", k + 1); + branch.in_service = row.status > 0; + branch.buses[BranchBuses::bus1] = row.fbus; + branch.buses[BranchBuses::bus2] = row.tbus; + branch.parameters[BranchParameters::R] = row.r; + branch.parameters[BranchParameters::X] = row.x; + branch.parameters[BranchParameters::B] = row.b; + branch.parameters[BranchParameters::tap] = tap; + branch.parameters[BranchParameters::phase] = row.angle * RADIANS_PER_DEGREE; - for (const auto& [buses, list] : branches) - { - if (matched[buses] != list.size()) + // MATPOWER scales the line charging at the tapped bus by 1 / tap^2 + branch.parameters[BranchParameters::Bmag] = HALF * row.b * (ONE / (tap * tap) - ONE); + + // A zero rating is unlimited + if (row.rateA > ZERO) { - throw std::invalid_argument(name(buses) + " has fewer in-service MATPOWER branches than the case"); + branch.parameters[BranchParameters::Smax] = row.rateA / mva_base; } } } @@ -117,24 +127,23 @@ namespace GridKit * @brief Costs from a MATPOWER polynomial in P [MW], whose coefficients * run from the highest order down */ - void setCost(SystemModelDataT::GeneratorDataT& generator, const std::vector& cost, double mva_base) + void setCost(SystemModelDataT::GeneratorDataT& generator, const MatpowerDataT::GenCostDataT& cost, double mva_base) { - if (cost.at(Column::MODEL) != POLYNOMIAL) + if (cost.kind != POLYNOMIAL || cost.rest.size() != cost.n) { throw std::invalid_argument(generator.id + ": only polynomial MATPOWER costs are supported"); } - const auto n = static_cast(cost.at(Column::NCOST)); std::array coefficients{}; - double scale = 1.0; - for (size_t k = 0; k < n; ++k) + double scale = ONE; + for (size_t k = 0; k < cost.n; ++k) { - const double coefficient = cost.at(Column::COST + n - 1 - k) * scale; + const double coefficient = cost.rest[cost.n - 1 - k] * scale; if (k < coefficients.size()) { coefficients[k] = coefficient; } - else if (coefficient != 0.0) + else if (!isZero(coefficient)) { throw std::invalid_argument(generator.id + ": MATPOWER cost is above quadratic"); } @@ -146,61 +155,59 @@ namespace GridKit generator.parameters[GeneratorParameters::c2] = coefficients[2]; } - /** - * @brief Limits and costs of the generators, matched in order by bus - * - * MATPOWER generators at a bus without generators are skipped. - */ - void applyGenerators(SystemModelDataT& data, const MatpowerMatrix& rows, const MatpowerMatrix& costs, double mva_base) + /// Generators, numbered by MATPOWER row + void addGenerators(SystemModelDataT& data, const MatpowerDataT& matpower) { - std::map> generators; - for (auto& generator : data.generator) + if (matpower.gencost.size() != matpower.gen.size()) { - generators[generator.buses.at(GeneratorBuses::bus)].push_back(&generator); + throw std::invalid_argument("MATPOWER case needs one active power cost per generator"); } - std::map matched; - for (size_t i = 0; i < rows.size(); ++i) + const double mva_base = matpower.baseMVA; + for (size_t i = 0; i < matpower.gen.size(); ++i) { - const auto& row = rows[i]; - const auto number = static_cast(row.at(Column::GEN_BUS)); - const auto entry = generators.find(number); - if (row.at(Column::GEN_STATUS) <= 0.0 || entry == generators.end()) - { - continue; - } - - size_t& count = matched[number]; - if (count == entry->second.size()) - { - throw std::invalid_argument("Bus " + std::to_string(number) + " has more in-service MATPOWER generators than the case"); - } - - auto& generator = *entry->second[count++]; - generator.parameters[GeneratorParameters::Pmin] = row.at(Column::PMIN) / mva_base; - generator.parameters[GeneratorParameters::Pmax] = row.at(Column::PMAX) / mva_base; - generator.parameters[GeneratorParameters::Qmin] = row.at(Column::QMIN) / mva_base; - generator.parameters[GeneratorParameters::Qmax] = row.at(Column::QMAX) / mva_base; - setCost(generator, costs.at(i), mva_base); - } - - for (const auto& [number, list] : generators) - { - if (matched[number] != list.size()) - { - throw std::invalid_argument("Bus " + std::to_string(number) + " has fewer in-service MATPOWER generators than the case"); - } + const auto& row = matpower.gen[i]; + + auto& generator = data.generator.emplace_back(); + generator.id = std::format("gen_{}", i + 1); + generator.in_service = row.status > 0; + generator.buses[GeneratorBuses::bus] = row.bus; + generator.parameters[GeneratorParameters::Pmin] = row.Pmin / mva_base; + generator.parameters[GeneratorParameters::Pmax] = row.Pmax / mva_base; + generator.parameters[GeneratorParameters::Qmin] = row.Qmin / mva_base; + generator.parameters[GeneratorParameters::Qmax] = row.Qmax / mva_base; + setCost(generator, matpower.gencost[i], mva_base); } } } // namespace - void applyMatpowerData(SystemModelData& data, const MatpowerData& matpower) + SystemModelData parseMatpowerCase(std::istream& stream) { - const double mva_base = data.va_base / std::mega::num; + MatpowerDataT matpower{}; + readMatPower(matpower, stream); + if (matpower.baseMVA <= ZERO) + { + throw std::invalid_argument("MATPOWER case needs a positive baseMVA"); + } + + SystemModelDataT data; + data.va_base = matpower.baseMVA * std::mega::num; + + addBuses(data, matpower); + addBranches(data, matpower); + addGenerators(data, matpower); - applyBuses(data, matpower.matrix("bus")); - applyBranches(data, matpower.matrix("branch"), mva_base); - applyGenerators(data, matpower.matrix("gen"), matpower.matrix("gencost"), mva_base); + return data; + } + + SystemModelData parseMatpowerCase(const std::filesystem::path& file) + { + std::ifstream stream(file); + if (!stream) + { + throw std::runtime_error("Could not open MATPOWER case " + file.string()); + } + return parseMatpowerCase(stream); } } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp b/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp index 2832963edc..6a6c5aff1c 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModelData.hpp @@ -6,13 +6,14 @@ #pragma once #include +#include +#include #include #include #include #include #include -#include #include namespace GridKit @@ -43,15 +44,17 @@ namespace GridKit }; /** - * @brief Set bus voltage limits, branch ratings, and generator limits and - * costs from a MATPOWER case of the same network + * @brief Read a MATPOWER case * - * Buses match by number. In-service MATPOWER branches match the branches - * between the same buses in order, and in-service MATPOWER generators the - * generators at the same bus. MATPOWER generators at a bus without - * generators are static injections that the loads carry, and are skipped. - * Values in MW, Mvar, and MVA become system base values. + * Reference buses are MATPOWER bus type 3, and bus demand and bus shunts + * become loads and shunts. Generator and branch status sets `in_service`. + * Values in MW, Mvar, and MVA, and costs in P [MW], become system base + * values. + * + * @throw std::invalid_argument for isolated buses, branch angle-difference + * limits, or costs that are not polynomials of at most second order */ - void applyMatpowerData(SystemModelData& data, const MatpowerData& matpower); + SystemModelData parseMatpowerCase(std::istream& stream); + SystemModelData parseMatpowerCase(const std::filesystem::path& file); } // namespace OptimalPowerFlow } // namespace GridKit diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp index 6e7c4bc03c..be5f759a88 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp @@ -5,7 +5,12 @@ #pragma once +#include #include +#include +#include +#include +#include #include #include @@ -22,21 +27,17 @@ namespace GridKit namespace OptimalPowerFlow { /** - * @param[in] data - Network, limits, and costs - * @param[in] state - Starting point, fixed demand, and device settings + * @param[in] data - Network, demand, limits, and costs */ template - SystemModel::SystemModel(const SystemModelData& data, - const Model::StateData& state) - : state_(state) + SystemModel::SystemModel(const SystemModelData& data) { for (const auto& bus_data : data.bus) { auto bus = std::make_unique(bus_data); if (!buses_.emplace(bus_data.number, bus.get()).second) { - Log::error() << "OptimalPowerFlow::SystemModel: duplicate bus " << bus_data.number << "\n"; - ++data_errors_; + throw std::invalid_argument(std::format("OptimalPowerFlow::SystemModel: duplicate bus {}", bus_data.number)); } components_.push_back(std::move(bus)); } @@ -63,28 +64,23 @@ namespace GridKit } /** - * @brief Number the variables and the bounded constraints, connect the - * terminals, and set the starting point and the derivative patterns + * @brief Number the variables and the limited constraint functions, + * connect the terminals, copy the limits, and set the starting point and + * the derivative patterns * - * A constraint without a finite bound gets no row. + * A constraint function without a finite limit gets no row. */ template int SystemModel::allocate() { - if (verify() != 0) + const auto checks = verify(); + for (const auto& error : checks.errors()) { - Log::error() << "OptimalPowerFlow::SystemModel: invalid model data\n"; - return 1; - } - - bool has_infinite_bus = false; - for (const auto& [number, bus] : buses_) - { - has_infinite_bus = has_infinite_bus || bus->infinite(); + Log::error() << error << '\n'; } - if (!has_infinite_bus && !buses_.empty()) + if (!checks.passed()) { - buses_.begin()->second->setReference(); + return 1; } IdxT n = 0; @@ -92,7 +88,7 @@ namespace GridKit for (auto& component : components_) { auto& variables = component->variableIndices(); - for (IdxT j = 0; j < component->sizeInternal(); ++j) + for (IdxT j = 0; j < component->sizeInternalVariables(); ++j) { variables[j] = n++; } @@ -124,10 +120,19 @@ namespace GridKit g_lower_.resize(m); g_upper_.resize(m); + RealT* x_lower = x_lower_.getData(); + RealT* x_upper = x_upper_.getData(); RealT* g_lower = g_lower_.getData(); RealT* g_upper = g_upper_.getData(); for (const auto& component : components_) { + const auto& variables = component->variableIndices(); + for (IdxT j = 0; j < component->sizeInternalVariables(); ++j) + { + x_lower[variables[j]] = component->variableLower()[j]; + x_upper[variables[j]] = component->variableUpper()[j]; + } + const auto& rows = component->constraintIndices(); for (IdxT i = 0; i < component->sizeInternalConstraints(); ++i) { @@ -138,12 +143,13 @@ namespace GridKit } } } + x_lower_.setDataUpdated(); + x_upper_.setDataUpdated(); g_lower_.setDataUpdated(); g_upper_.setDataUpdated(); if (initialize() != 0) { - Log::error() << "OptimalPowerFlow::SystemModel: initialization from the state failed\n"; return 1; } @@ -151,19 +157,17 @@ namespace GridKit } /** - * @brief Starting point and variable bounds from the state + * @brief Starting point */ template int SystemModel::initialize() { - ScalarT* x = x_.getData(); - RealT* x_lower = x_lower_.getData(); - RealT* x_upper = x_upper_.getData(); + ScalarT* x = x_.getData(); int ret = 0; for (auto& component : components_) { - ret += component->initialize(state_, x, x_lower, x_upper); + ret += component->initialize(x); } // For DependencyTracking::Variable, set variable numbers @@ -176,8 +180,6 @@ namespace GridKit } x_.setDataUpdated(); - x_lower_.setDataUpdated(); - x_upper_.setDataUpdated(); return ret; } @@ -213,51 +215,89 @@ namespace GridKit } /** - * @brief Device currents follow from the power into each terminal bus + * @brief Every problem with the data, including an island without a + * reference bus */ template - Model::StateData SystemModel::solutionState() const + Model::ConfigurationChecks SystemModel::verify() const { - Model::StateData state = state_; - const ScalarT* x = x_.getData(); + Model::ConfigurationChecks checks; - for (const auto& [number, bus] : buses_) + for (const IdxT number : unreferencedIslands()) { - auto& voltage = state.buses[Model::busKey(number)].values; - voltage["vr"] = static_cast(x[bus->variableIndices()[0]]); - voltage["vi"] = static_cast(x[bus->variableIndices()[1]]); + checks.fail(std::format("OptimalPowerFlow::SystemModel: the island of bus {} has no reference bus", number)); } for (const auto& component : components_) { - const auto& terminals = component->terminals(); - std::vector power(ComponentT::TERMINAL_SIZE * terminals.size()); - component->evaluateTerminalPower(x, power.data()); - - for (IdxT t = 0; t < terminals.size(); ++t) + for (const auto& error : component->verify().errors()) { - Model::setTerminalCurrent(state, - component->id(), - terminals[t], - t, - terminals.size(), - static_cast(power[ComponentT::TERMINAL_SIZE * t]), - static_cast(power[ComponentT::TERMINAL_SIZE * t + 1])); + checks.fail(std::format("{}: {}", component->id(), error)); } } - return state; + return checks; } + /** + * @brief Lowest bus number of each island without a reference bus + * + * In-service devices connect the buses of their terminals. + */ template - int SystemModel::verify() const + std::vector SystemModel::unreferencedIslands() const { - int ret = data_errors_; + // Each bus points toward the root bus of its island + std::map parent; + for (const auto& [number, bus] : buses_) + { + parent[number] = number; + } + + const auto root = [&parent](IdxT number) + { + while (parent.at(number) != number) + { + number = parent.at(number); + } + return number; + }; + for (const auto& component : components_) { - ret += component->verify(); + const auto& terminals = component->terminals(); + const bool connected = std::ranges::all_of(terminals, [this](IdxT number) + { return buses_.contains(number); }); + if (!component->inService() || !connected) + { + continue; + } + for (IdxT t = 1; t < terminals.size(); ++t) + { + parent[root(terminals[t])] = root(terminals[0]); + } } - return ret; + + std::set referenced; + for (const auto& [number, bus] : buses_) + { + if (bus->reference()) + { + referenced.insert(root(number)); + } + } + + std::vector unreferenced; + std::set reported; + for (const auto& [number, bus] : buses_) + { + const IdxT island = root(number); + if (!referenced.contains(island) && reported.insert(island).second) + { + unreferenced.push_back(number); + } + } + return unreferenced; } /** @@ -276,7 +316,7 @@ namespace GridKit return 1; } - const IdxT variable = component.sizeInternal() + ComponentT::TERMINAL_SIZE * t; + const IdxT variable = component.sizeInternalVariables() + ComponentT::TERMINAL_SIZE * t; const IdxT constraint = component.sizeInternalConstraints() + ComponentT::TERMINAL_SIZE * t; for (IdxT k = 0; k < ComponentT::TERMINAL_SIZE; ++k) { diff --git a/GridKit/Model/PowerFlow/MatpowerParser.hpp b/GridKit/Model/PowerFlow/MatpowerParser.hpp index 5ce5e19de5..604f73d7a1 100644 --- a/GridKit/Model/PowerFlow/MatpowerParser.hpp +++ b/GridKit/Model/PowerFlow/MatpowerParser.hpp @@ -123,18 +123,6 @@ namespace GridKit return component; } - // Ensure that all of the given line has been consumed, and that the only - // remaining non-whitespace character left in the line is a semicolon. - inline void checkEndOfMatrixRow(std::istream& is) - { - std::string rest; - is >> rest; - ltrim(rest); - rtrim(rest); - if (rest != ";") - throw std::runtime_error(matlab_syntax_error); - } - template void readMatPowerBusRow(const std::string& row, BusData& br, LoadData& lr) { @@ -157,8 +145,9 @@ namespace GridKit lr.bus_i = br.bus_i; } + /// Columns after `apf` hold solution values and are ignored. template - void readMatPowerGenRow(GenData& gr, std::string& row) + void readMatPowerGenRow(GenData& gr, const std::string& row) { logs() << "Parsing MATPOWER gen row\n"; std::stringstream is(row); @@ -166,29 +155,23 @@ namespace GridKit >> gr.status >> gr.Pmax >> gr.Pmin >> gr.Pc1 >> gr.Pc2 >> gr.Qc1min >> gr.Qc1max >> gr.Qc2min >> gr.Qc2max >> gr.ramp_agc >> gr.ramp_10 >> gr.ramp_30 >> gr.ramp_q >> gr.apf; - checkEndOfMatrixRow(is); } + /// Columns after `angmax` hold solution values and are ignored. template - void readMatPowerBranchRow(BranchData& br, std::string& row) + void readMatPowerBranchRow(BranchData& br, const std::string& row) { logs() << "Parsing MATPOWER branch row\n"; std::stringstream is(row); is >> br.fbus >> br.tbus >> br.r >> br.x >> br.b >> br.rateA >> br.rateB >> br.rateC >> br.ratio >> br.angle >> br.status >> br.angmin >> br.angmax; - checkEndOfMatrixRow(is); } template - void readMatPowerGenCostRow(GenCostData& gcr, std::string& row) + void readMatPowerGenCostRow(GenCostData& gcr, const std::string& row) { logs() << "Parsing MATPOWER gen cost row\n"; - // Ensure last character is semicolon. - rtrim(row); - if (row[row.size() - 1] != ';') - throw std::runtime_error(matlab_syntax_error + "\nGot line " + row); - std::stringstream is(row); is >> gcr.kind >> gcr.startup >> gcr.shutdown >> gcr.n; @@ -217,12 +200,11 @@ namespace GridKit template void readMatPowerBaseMVA(SystemModelData& mp, std::string& line) { - std::regex pat("mpc\\.baseMVA\\s*=\\s*([0-9]+);"); + std::regex pat(R"(mpc\.baseMVA\s*=\s*([0-9.eE+-]+)\s*;)"); std::smatch matches; if (std::regex_match(line, matches, pat)) { - std::string s = matches[1]; - mp.baseMVA = std::atof(s.c_str()); + mp.baseMVA = std::stod(matches[1].str()); } else { @@ -272,9 +254,8 @@ namespace GridKit // First, parse matrix components if (component == "bus") { - readMatPowerMatrix(is, line, [&](std::string row) + readMatPowerMatrix(is, line, [&](const std::string& row) { - row += ';'; BusDataT br{}; LoadDataT lr{}; readMatPowerBusRow(row, br, lr); @@ -283,27 +264,24 @@ namespace GridKit } else if (component == "gen") { - readMatPowerMatrix(is, line, [&](std::string row) + readMatPowerMatrix(is, line, [&](const std::string& row) { - row += ';'; GenDataT gr{}; readMatPowerGenRow(gr, row); mp.gen.push_back(gr); }); } else if (component == "branch") { - readMatPowerMatrix(is, line, [&](std::string row) + readMatPowerMatrix(is, line, [&](const std::string& row) { - row += ';'; BranchDataT br{}; readMatPowerBranchRow(br, row); mp.branch.push_back(br); }); } else if (component == "gencost") { - readMatPowerMatrix(is, line, [&](std::string row) + readMatPowerMatrix(is, line, [&](const std::string& row) { - row += ';'; GenCostDataT gcr{}; readMatPowerGenCostRow(gcr, row); mp.gencost.push_back(gcr); }); diff --git a/GridKit/Model/PowerFlow/PowerFlowData.hpp b/GridKit/Model/PowerFlow/PowerFlowData.hpp index 5d30c996b4..8da95af08e 100644 --- a/GridKit/Model/PowerFlow/PowerFlowData.hpp +++ b/GridKit/Model/PowerFlow/PowerFlowData.hpp @@ -168,8 +168,8 @@ namespace GridKit struct GenCostData { IdxT kind; - IdxT startup; - IdxT shutdown; + RealT startup; + RealT shutdown; IdxT n; std::vector rest; diff --git a/GridKit/Model/STATE.md b/GridKit/Model/STATE.md deleted file mode 100644 index 221a12ab1f..0000000000 --- a/GridKit/Model/STATE.md +++ /dev/null @@ -1,104 +0,0 @@ -# State Input Format - -A state file separates the model definition from its initial state. - -This also separates the case from the dispatch. One canonical `texas.case.json` can have multiple operating points in `examples/`: - -- `texas-summer2025.state.json` -- `texas-winter2025.state.json` -- `texas-summer2026.state.json` - -For example `texas-summer2025.state.json` might be structured as: - -```json -"header":{ - ... -}, -"buses":{ - ... -}, -"devices":{ - ... -} -``` - -Each entry gives initial outputs and operating settings. Models use these values and connected inputs to initialize their own state. - -Buses store their voltages. Devices store their terminal currents and operating settings. - -## Bus - -### RMS State (PowerFlow & PhasorDynamics) - -RMS voltages use real and imaginary parts: - -```json -"bus_id_2533":{ - "vr": 0.9289638822595822, - "vi": -0.39534548980249884 -} -``` - -### ABC State (EMT) - -Future EMT bus entries would give instantaneous phase voltages and device entries would give currents. Each model would define any other initial states or history it needs. - -```json -"bus_id_2533":{ - "va": 0.9289638822595822, - "vb": -0.39534548980249884, - "vc": -0.39534548980249884 -} -``` - -## Devices - -Device entries give initial outputs and settings such as `online`, `open`, `tap`, and `phase`. - -Use `ir`/`ii` for one terminal and `ir1`/`ii1`, `ir2`/`ii2` for multiple terminals. Numbers follow the model's terminal numbering. Currents are positive into each connected bus and use the system base. - -> At nonzero voltage, convert terminal power to initial current with `I = conj((P + jQ) / V)`. - -```json -"gen_id_2":{ - "online": true, - "ir": 0.8, - "ii": -0.2 -}, -"br_id_2":{ - "open": false, - "tap": 1, - "phase": 0 -} -``` - -# Migration - -- Initialize components from output values and connected inputs. -- Derive missing values and check the initialization equations. - -`Bus`: - -- Treat buses as components with `vr` and `vi` output ports. -- Move voltage initialization from the case to the state file. - -`Branch`: - -- Expose `ir1`, `ii1`, `ir2`, and `ii2` as output ports. -- Make `tap`, `phase`, and `open` input ports. - -`REGCA`, `LoadZ`, `LoadZIP`, `GENROU`, `GENSAL`, `GenClassical`: - -- Expose `ir` and `ii` as output ports. -- Initialize from terminal voltage and current. -- Remove generator and converter `p0`/`q0` parameters. -- Make `online` an input port. - -# Readers and Writers - -`GridKit/Model/StateData.hpp` reads and writes this format. Device keys are the -case `id`. Bus keys are `bus_id_` followed by the bus number. - -`OptimalPowerFlow::SystemModel` reads the starting point, load demand, and -device settings from the state. `solutionState()` returns the state with -solved bus voltages and device terminal currents. diff --git a/GridKit/Model/StateData.cpp b/GridKit/Model/StateData.cpp deleted file mode 100644 index ffbcdb5c7b..0000000000 --- a/GridKit/Model/StateData.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/** - * @file StateData.cpp - * @brief JSON input and output for `StateData`. - */ - -#include -#include - -#include - -#include - -namespace GridKit -{ - namespace Model - { - namespace - { - using json = nlohmann::json; - - StateRecord readRecord(const std::string& id, const json& object) - { - StateRecord record; - for (const auto& [key, value] : object.items()) - { - if (value.is_boolean()) - { - record.flags[key] = value.get(); - } - else if (value.is_number()) - { - record.values[key] = value.get(); - } - else if (!value.is_null()) - { - throw std::invalid_argument("State entry " + id + "." + key + " must be a number or a boolean"); - } - } - return record; - } - - std::map readRecords(const json& document, const char* section) - { - std::map records; - if (document.contains(section)) - { - for (const auto& [id, object] : document.at(section).items()) - { - records.emplace(id, readRecord(id, object)); - } - } - return records; - } - - json writeRecords(const std::map& records) - { - json section = json::object(); - for (const auto& [id, record] : records) - { - json object = json::object(); - for (const auto& [key, value] : record.values) - { - object[key] = value; - } - for (const auto& [key, flag] : record.flags) - { - object[key] = flag; - } - section[id] = object; - } - return section; - } - - template - void readOptional(const json& object, const char* key, std::optional& value) - { - if (object.contains(key) && !object.at(key).is_null()) - { - value = object.at(key).get(); - } - } - - template - void writeOptional(json& object, const char* key, const std::optional& value) - { - if (value) - { - object[key] = *value; - } - } - } // namespace - - double StateRecord::value(const std::string& key, double fallback) const - { - const auto entry = values.find(key); - if (entry == values.end()) - { - return fallback; - } - return entry->second; - } - - bool StateRecord::flag(const std::string& key, bool fallback) const - { - const auto entry = flags.find(key); - if (entry == flags.end()) - { - return fallback; - } - return entry->second; - } - - const StateRecord* StateData::bus(std::size_t number) const - { - const auto entry = buses.find(busKey(number)); - if (entry == buses.end()) - { - return nullptr; - } - return &entry->second; - } - - const StateRecord* StateData::device(const std::string& id) const - { - const auto entry = devices.find(id); - if (entry == devices.end()) - { - return nullptr; - } - return &entry->second; - } - - std::string busKey(std::size_t number) - { - return "bus_id_" + std::to_string(number); - } - - std::pair currentKeys(std::size_t terminal, std::size_t terminal_count) - { - if (terminal_count == 1) - { - return {"ir", "ii"}; - } - const auto suffix = std::to_string(terminal + 1); - return {"ir" + suffix, "ii" + suffix}; - } - - bool terminalPower(const StateData& state, - const std::string& id, - std::size_t number, - std::size_t terminal, - std::size_t terminal_count, - double& p, - double& q) - { - const StateRecord* device = state.device(id); - const StateRecord* bus = state.bus(number); - if (device == nullptr || bus == nullptr) - { - return false; - } - - const auto [ir_key, ii_key] = currentKeys(terminal, terminal_count); - if (!device->values.contains(ir_key) || !device->values.contains(ii_key) - || !bus->values.contains("vr") || !bus->values.contains("vi")) - { - return false; - } - - const double vr = bus->values.at("vr"); - const double vi = bus->values.at("vi"); - const double ir = device->values.at(ir_key); - const double ii = device->values.at(ii_key); - - p = vr * ir + vi * ii; - q = vi * ir - vr * ii; - return true; - } - - void setTerminalCurrent(StateData& state, - const std::string& id, - std::size_t number, - std::size_t terminal, - std::size_t terminal_count, - double p, - double q) - { - const auto& voltage = state.buses.at(busKey(number)).values; - const double vr = voltage.at("vr"); - const double vi = voltage.at("vi"); - const double v2 = vr * vr + vi * vi; - - // I = conj((P + jQ) / V) - const auto [ir_key, ii_key] = currentKeys(terminal, terminal_count); - auto& current = state.devices[id].values; - current[ir_key] = (p * vr + q * vi) / v2; - current[ii_key] = (p * vi - q * vr) / v2; - } - - StateData parseStateData(std::istream& stream) - { - const json document = json::parse(stream); - - StateData state; - if (document.contains("header")) - { - const auto& header = document.at("header"); - readOptional(header, "version", state.header.version); - readOptional(header, "time", state.header.time); - readOptional(header, "created", state.header.created); - readOptional(header, "description", state.header.description); - } - state.buses = readRecords(document, "buses"); - state.devices = readRecords(document, "devices"); - return state; - } - - StateData parseStateData(const std::filesystem::path& file) - { - std::ifstream stream(file); - if (!stream) - { - throw std::runtime_error("Could not open state file " + file.string()); - } - return parseStateData(stream); - } - - void writeStateData(const StateData& state, std::ostream& stream) - { - json header = json::object(); - writeOptional(header, "version", state.header.version); - writeOptional(header, "time", state.header.time); - writeOptional(header, "created", state.header.created); - writeOptional(header, "description", state.header.description); - - json document = json::object(); - document["header"] = header; - document["buses"] = writeRecords(state.buses); - document["devices"] = writeRecords(state.devices); - - stream << document.dump(4) << "\n"; - } - - void writeStateData(const StateData& state, const std::filesystem::path& file) - { - std::ofstream stream(file); - if (!stream) - { - throw std::runtime_error("Could not open state file " + file.string()); - } - writeStateData(state, stream); - } - } // namespace Model -} // namespace GridKit diff --git a/GridKit/Model/StateData.hpp b/GridKit/Model/StateData.hpp deleted file mode 100644 index 59cf23581d..0000000000 --- a/GridKit/Model/StateData.hpp +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file StateData.hpp - * @brief Operating state shared by all model families. See `STATE.md`. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace GridKit -{ - namespace Model - { - /// Entries of one bus or device - struct StateRecord - { - std::map values; ///< Numeric entries such as `vr` or `ir` - std::map flags; ///< Boolean entries such as `online` or `open` - - double value(const std::string& key, double fallback) const; - bool flag(const std::string& key, bool fallback) const; - }; - - /// Metadata of a state file - struct StateHeader - { - std::optional version; - std::optional time; - std::optional created; - std::optional description; - }; - - /** - * @brief Operating state of a case - * - * Currents are positive into the bus and use the system base. - */ - struct StateData - { - StateHeader header; - std::map buses; ///< Keyed by `busKey(number)` - std::map devices; ///< Keyed by the case `id` - - const StateRecord* bus(std::size_t number) const; - const StateRecord* device(const std::string& id) const; - }; - - /// Key of bus `number` in `StateData::buses` - std::string busKey(std::size_t number); - - /** - * @brief Keys of the real and imaginary current at `terminal` of a device - * with `terminal_count` terminals - */ - std::pair currentKeys(std::size_t terminal, std::size_t terminal_count); - - /** - * @brief Power into bus `number` at `terminal` of device `id` - * - * @return false if the state has no current for the terminal or no - * voltage for the bus - */ - bool terminalPower(const StateData& state, - const std::string& id, - std::size_t number, - std::size_t terminal, - std::size_t terminal_count, - double& p, - double& q); - - /** - * @brief Set the current of device `id` at `terminal` that injects `p` - * and `q` into bus `number` - * - * @pre The state has a nonzero voltage for bus `number`. - */ - void setTerminalCurrent(StateData& state, - const std::string& id, - std::size_t number, - std::size_t terminal, - std::size_t terminal_count, - double p, - double q); - - StateData parseStateData(std::istream& stream); - StateData parseStateData(const std::filesystem::path& file); - void writeStateData(const StateData& state, std::ostream& stream); - void writeStateData(const StateData& state, const std::filesystem::path& file); - } // namespace Model -} // namespace GridKit diff --git a/GridKit/Solver/Optimization/SteadyState.cpp b/GridKit/Solver/Optimization/SteadyState.cpp index 022516adcf..044327d9c1 100644 --- a/GridKit/Solver/Optimization/SteadyState.cpp +++ b/GridKit/Solver/Optimization/SteadyState.cpp @@ -181,7 +181,7 @@ namespace AnalysisManager } /** - * @brief Leave the final point in the model + * @brief Leave the final point and its objective in the model */ template void SteadyState::finalize_solution([[maybe_unused]] SolverReturn status, @@ -197,6 +197,7 @@ namespace AnalysisManager [[maybe_unused]] IpoptCalculatedQuantities* ip_cq) { setVariables(x); + model_->evaluateObjective(); } template diff --git a/cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m b/cases/OptimalPowerFlow/ACTIVSg2000/ACTIVSg2000.m similarity index 100% rename from cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.m rename to cases/OptimalPowerFlow/ACTIVSg2000/ACTIVSg2000.m diff --git a/cases/OptimalPowerFlow/ACTIVSg2000/README.md b/cases/OptimalPowerFlow/ACTIVSg2000/README.md new file mode 100644 index 0000000000..4d5ce62396 --- /dev/null +++ b/cases/OptimalPowerFlow/ACTIVSg2000/README.md @@ -0,0 +1,15 @@ +# Synthetic Texas (ACTIVSg2000) + +## One-Line Diagram + +![ACTIVSg2000 one-line diagram](../../PhasorDynamics/ACTIVSg2000/ACTIVSg2000.png) + +Figure 1: One-line diagram of the ACTIVSg2000 case.[^1] + +## Development + +The complete optimal power flow of this MATPOWER case is modeled in GridKit. + +The economic dispatch results are provided [here](../../../examples/OptimalPowerFlow/EconomicDispatch/README.md). + +[^1]: Texas A&M University, [Grid Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/activsg2000/). diff --git a/cases/PhasorDynamics/Hawaii/Hawaii.m b/cases/OptimalPowerFlow/Hawaii/Hawaii.m similarity index 100% rename from cases/PhasorDynamics/Hawaii/Hawaii.m rename to cases/OptimalPowerFlow/Hawaii/Hawaii.m diff --git a/cases/OptimalPowerFlow/Hawaii/README.md b/cases/OptimalPowerFlow/Hawaii/README.md new file mode 100644 index 0000000000..be190db41c --- /dev/null +++ b/cases/OptimalPowerFlow/Hawaii/README.md @@ -0,0 +1,15 @@ +# Synthetic Hawaii + +## One-Line Diagram + +![Hawaii one-line diagram](../../PhasorDynamics/Hawaii/hawaii.png) + +Figure 1: One-line diagram of the synthetic Hawaii case.[^1] + +## Development + +The complete optimal power flow of this MATPOWER case is modeled in GridKit. + +The economic dispatch results are provided [here](../../../examples/OptimalPowerFlow/EconomicDispatch/README.md). + +[^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). diff --git a/cases/PhasorDynamics/IEEE39/IEEE39.m b/cases/OptimalPowerFlow/IEEE39/IEEE39.m similarity index 100% rename from cases/PhasorDynamics/IEEE39/IEEE39.m rename to cases/OptimalPowerFlow/IEEE39/IEEE39.m diff --git a/cases/OptimalPowerFlow/IEEE39/README.md b/cases/OptimalPowerFlow/IEEE39/README.md new file mode 100644 index 0000000000..0c211e6556 --- /dev/null +++ b/cases/OptimalPowerFlow/IEEE39/README.md @@ -0,0 +1,15 @@ +# IEEE 39-Bus New England + +## One-Line Diagram + +![IEEE39 one-line diagram](../../PhasorDynamics/IEEE39/IEEE39.png) + +Figure 1: One-line diagram of the IEEE 39-Bus case.[^1] + +## Development + +The complete optimal power flow of this MATPOWER case is modeled in GridKit. + +The economic dispatch results are provided [here](../../../examples/OptimalPowerFlow/EconomicDispatch/README.md). + +[^1]: Texas A&M University, [Electric Grid Test Case Repository](https://electricgrids.engr.tamu.edu/electric-grid-test-cases/). diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index 8b76200944..3ecd9cb5e6 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -5,6 +5,8 @@ @PACKAGE_INIT@ +include ( "${CMAKE_CURRENT_LIST_DIR}/GridKitTargets.cmake" ) + include(CMakeFindDependencyMacro) set(GridKit_ENABLE_SUNDIALS @GRIDKIT_ENABLE_SUNDIALS@) if(GridKit_ENABLE_SUNDIALS) @@ -12,11 +14,3 @@ if(GridKit_ENABLE_SUNDIALS) enable_language(C) find_dependency(SUNDIALS) endif() - -set(GridKit_ENABLE_IPOPT @GRIDKIT_ENABLE_IPOPT@) -if(GridKit_ENABLE_IPOPT AND NOT TARGET IPOPT) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") - find_dependency(Ipopt MODULE) -endif() - -include("${CMAKE_CURRENT_LIST_DIR}/GridKitTargets.cmake") diff --git a/cmake/FindIpopt.cmake b/cmake/FindIpopt.cmake index 3763c91461..5dcb63fe58 100644 --- a/cmake/FindIpopt.cmake +++ b/cmake/FindIpopt.cmake @@ -1,7 +1,7 @@ # #[[ -Finds Ipopt include directory and libraries and exports target `IPOPT` +Finds Ipopt include directory and libraries and exports target `Ipopt` User may set: - IPOPT_ROOT_DIR @@ -26,6 +26,7 @@ find_library( if(IPOPT_LIBRARY) set(IPOPT_LIBRARY CACHE FILEPATH "Path to Ipopt library") + message(STATUS "Found Ipopt library: " ${IPOPT_LIBRARY}) get_filename_component( IPOPT_LIBRARY_DIR ${IPOPT_LIBRARY} @@ -55,12 +56,25 @@ find_path( include/coin-or include/coinor) -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Ipopt REQUIRED_VARS IPOPT_LIBRARY IPOPT_INCLUDE_DIR) -mark_as_advanced(IPOPT_LIBRARY IPOPT_INCLUDE_DIR) - -if(Ipopt_FOUND AND NOT TARGET IPOPT) +if(IPOPT_LIBRARY) + message(STATUS "Found Ipopt include: ${IPOPT_INCLUDE_DIR}") + mark_as_advanced(IPOPT_INCLUDE_DIR) add_library(IPOPT INTERFACE IMPORTED) target_link_libraries(IPOPT INTERFACE ${IPOPT_LIBRARY}) target_include_directories(IPOPT INTERFACE ${IPOPT_INCLUDE_DIR}) +else() + if(NOT IPOPT_ROOT_DIR) + message(STATUS "Ipopt dir not found! Please provide correct filepath.") + set(IPOPT_DIR + ${IPOPT_DIR} + CACHE PATH "Path to Ipopt installation root.") + unset(IPOPT_INCLUDE_DIR CACHE) + unset(IPOPT_LIBRARY CACHE) + unset(IPOPT_LIBRARY_DIR CACHE) + elseif(NOT IPOPT_LIB) + message(STATUS "Ipopt library not found! Please provide correct filepath.") + endif() + if(IPOPT_ROOT_DIR AND NOT IPOPT_INCLUDE_DIR) + message(STATUS "Ipopt include directory not found! Please provide correct path.") + endif() endif() diff --git a/docs/GridKit/Model/OptimalPowerFlow/Branch/README.md b/docs/GridKit/Model/OptimalPowerFlow/Branch/README.md new file mode 100644 index 0000000000..7cd620331e --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/Branch/README.md @@ -0,0 +1,6 @@ +# Branch + +```{include} ../../../../../GridKit/Model/OptimalPowerFlow/Branch/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/OptimalPowerFlow/Bus/README.md b/docs/GridKit/Model/OptimalPowerFlow/Bus/README.md new file mode 100644 index 0000000000..41f8f4f2de --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/Bus/README.md @@ -0,0 +1,6 @@ +# Bus + +```{include} ../../../../../GridKit/Model/OptimalPowerFlow/Bus/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/OptimalPowerFlow/Generator/README.md b/docs/GridKit/Model/OptimalPowerFlow/Generator/README.md new file mode 100644 index 0000000000..e950ed1f98 --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/Generator/README.md @@ -0,0 +1,6 @@ +# Generator + +```{include} ../../../../../GridKit/Model/OptimalPowerFlow/Generator/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/OptimalPowerFlow/Load/README.md b/docs/GridKit/Model/OptimalPowerFlow/Load/README.md new file mode 100644 index 0000000000..f585cc5ea3 --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/Load/README.md @@ -0,0 +1,6 @@ +# Load + +```{include} ../../../../../GridKit/Model/OptimalPowerFlow/Load/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/OptimalPowerFlow/README.md b/docs/GridKit/Model/OptimalPowerFlow/README.md new file mode 100644 index 0000000000..56c121262f --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/README.md @@ -0,0 +1,18 @@ +# OptimalPowerFlow + +```{toctree} +:maxdepth: 1 +:titlesonly: +:class: gk-index + +Branch +Bus +Generator +Load +Shunt +``` + +```{include} ../../../../GridKit/Model/OptimalPowerFlow/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/OptimalPowerFlow/Shunt/README.md b/docs/GridKit/Model/OptimalPowerFlow/Shunt/README.md new file mode 100644 index 0000000000..4dc2db8d40 --- /dev/null +++ b/docs/GridKit/Model/OptimalPowerFlow/Shunt/README.md @@ -0,0 +1,6 @@ +# Shunt + +```{include} ../../../../../GridKit/Model/OptimalPowerFlow/Shunt/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/GridKit/Model/README.md b/docs/GridKit/Model/README.md index 91f567fb3e..e3ce351c51 100644 --- a/docs/GridKit/Model/README.md +++ b/docs/GridKit/Model/README.md @@ -9,6 +9,7 @@ Browse models by family, or see the shared mathematical functions. CommonMath <../CommonMath> EMT +OptimalPowerFlow PhasorDynamics PowerElectronics PowerFlow diff --git a/docs/cases/OptimalPowerFlow/ACTIVSg2000/README.md b/docs/cases/OptimalPowerFlow/ACTIVSg2000/README.md new file mode 100644 index 0000000000..9ce74b7f8f --- /dev/null +++ b/docs/cases/OptimalPowerFlow/ACTIVSg2000/README.md @@ -0,0 +1,3 @@ +```{include} ../../../../cases/OptimalPowerFlow/ACTIVSg2000/README.md +:relative-images: +``` diff --git a/docs/cases/OptimalPowerFlow/Hawaii/README.md b/docs/cases/OptimalPowerFlow/Hawaii/README.md new file mode 100644 index 0000000000..23385ea26c --- /dev/null +++ b/docs/cases/OptimalPowerFlow/Hawaii/README.md @@ -0,0 +1,3 @@ +```{include} ../../../../cases/OptimalPowerFlow/Hawaii/README.md +:relative-images: +``` diff --git a/docs/cases/OptimalPowerFlow/IEEE39/README.md b/docs/cases/OptimalPowerFlow/IEEE39/README.md new file mode 100644 index 0000000000..63a4655d4c --- /dev/null +++ b/docs/cases/OptimalPowerFlow/IEEE39/README.md @@ -0,0 +1,3 @@ +```{include} ../../../../cases/OptimalPowerFlow/IEEE39/README.md +:relative-images: +``` diff --git a/docs/cases/OptimalPowerFlow/README.md b/docs/cases/OptimalPowerFlow/README.md new file mode 100644 index 0000000000..82aadbc4b9 --- /dev/null +++ b/docs/cases/OptimalPowerFlow/README.md @@ -0,0 +1,11 @@ +# OptimalPowerFlow + +```{toctree} +:maxdepth: 1 +:titlesonly: +:class: gk-index + +ACTIVSg2000 +Hawaii +IEEE39 +``` diff --git a/docs/cases/PhasorDynamics/README.md b/docs/cases/PhasorDynamics/README.md new file mode 100644 index 0000000000..1791b7f1c5 --- /dev/null +++ b/docs/cases/PhasorDynamics/README.md @@ -0,0 +1,17 @@ +# PhasorDynamics + +```{toctree} +:maxdepth: 1 +:titlesonly: +:class: gk-index + +ACTIVSg200 +ACTIVSg500 +ACTIVSg2000 +ACTIVSg10k +Hawaii +IEEE39 +Two-Area Kundur +WECC240 +Toy Cases +``` diff --git a/docs/cases/README.md b/docs/cases/README.md index 27a96bfc9f..7a44118d41 100644 --- a/docs/cases/README.md +++ b/docs/cases/README.md @@ -1,88 +1,82 @@ # Cases -## PhasorDynamics - ::::{grid} 1 1 2 2 :gutter: 3 :::{grid-item-card} ACTIVSg200 -:link: PhasorDynamics/ACTIVSg200/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/ACTIVSg200/ACTIVSg200.png :class-card: gk-card + +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} ACTIVSg500 -:link: PhasorDynamics/ACTIVSg500/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/ACTIVSg500/ACTIVSg500.png :class-card: gk-card + +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} ACTIVSg2000 -:link: PhasorDynamics/ACTIVSg2000/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/ACTIVSg2000/ACTIVSg2000.png :class-card: gk-card + +{bdg-ref-success}`OptimalPowerFlow ` +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} ACTIVSg10k -:link: PhasorDynamics/ACTIVSg10k/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/ACTIVSg10k/ACTIVSg10k.png :class-card: gk-card + +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} Hawaii -:link: PhasorDynamics/Hawaii/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/Hawaii/hawaii.png :class-card: gk-card + +{bdg-ref-success}`OptimalPowerFlow ` +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} IEEE39 -:link: PhasorDynamics/IEEE39/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/IEEE39/IEEE39.png :class-card: gk-card + +{bdg-ref-success}`OptimalPowerFlow ` +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} Two-Area Kundur -:link: PhasorDynamics/TwoArea/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/TwoArea/TwoArea.png :class-card: gk-card + +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} WECC240 -:link: PhasorDynamics/WECC240/README -:link-type: doc :img-top: ../../cases/PhasorDynamics/WECC240/WECC240.jpg :class-card: gk-card + +{bdg-ref-primary}`PhasorDynamics ` ::: :::{grid-item-card} Toy Cases -:link: PhasorDynamics/Toy/README -:link-type: doc :class-card: gk-card Two- and three-bus cases for component studies. + +{bdg-ref-primary}`PhasorDynamics ` ::: :::: ```{toctree} -:maxdepth: 1 +:maxdepth: 2 :titlesonly: :hidden: -ACTIVSg200 -ACTIVSg500 -ACTIVSg2000 -ACTIVSg10k -Hawaii -IEEE39 -Two-Area Kundur -WECC240 -Toy Cases +OptimalPowerFlow +PhasorDynamics ``` diff --git a/docs/examples/OptimalPowerFlow/EconomicDispatch/README.md b/docs/examples/OptimalPowerFlow/EconomicDispatch/README.md new file mode 100644 index 0000000000..471ffeb561 --- /dev/null +++ b/docs/examples/OptimalPowerFlow/EconomicDispatch/README.md @@ -0,0 +1,6 @@ +# EconomicDispatch + +```{include} ../../../../examples/OptimalPowerFlow/EconomicDispatch/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/examples/OptimalPowerFlow/README.md b/docs/examples/OptimalPowerFlow/README.md new file mode 100644 index 0000000000..a27190337b --- /dev/null +++ b/docs/examples/OptimalPowerFlow/README.md @@ -0,0 +1,14 @@ +# OptimalPowerFlow + +```{toctree} +:maxdepth: 4 +:titlesonly: +:hidden: + +EconomicDispatch +``` + +```{include} ../../../examples/OptimalPowerFlow/README.md +:start-line: 1 +:relative-images: +``` diff --git a/docs/examples/README.md b/docs/examples/README.md index 2cd095d72d..ba2b4830c5 100644 --- a/docs/examples/README.md +++ b/docs/examples/README.md @@ -6,6 +6,7 @@ :hidden: EMT +OptimalPowerFlow PhasorDynamics PowerElectronics PowerFlow diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7ad5538710..8889091075 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -59,4 +59,8 @@ if(TARGET SUNDIALS::idas) add_subdirectory(Network) endif() +if(GRIDKIT_ENABLE_ENZYME) + add_subdirectory(OptimalPowerFlow) +endif() + add_subdirectory(Consumer) diff --git a/examples/Consumer/CMakeLists.txt b/examples/Consumer/CMakeLists.txt index 2f836d3608..f83582258d 100644 --- a/examples/Consumer/CMakeLists.txt +++ b/examples/Consumer/CMakeLists.txt @@ -36,12 +36,6 @@ else() GridKit::power_elec_microload) endif() -if(GRIDKIT_ENABLE_ENZYME AND GRIDKIT_ENABLE_IPOPT) - install(FILES ${CMAKE_SOURCE_DIR}/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp - ${CMAKE_SOURCE_DIR}/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp - DESTINATION ${_rel_consumer_path}/OptimalPowerFlow) -endif() - # Install CMakeLists.txt for example project configure_file(${CMAKE_CURRENT_SOURCE_DIR}/GridKitConsumer/CMakeLists.txt.in ${CMAKE_CURRENT_BINARY_DIR}/GridKitConsumer/CMakeLists.txt @ONLY) diff --git a/examples/Consumer/GridKitConsumer/CMakeLists.txt.in b/examples/Consumer/GridKitConsumer/CMakeLists.txt.in index 322f17127b..647b9cff67 100644 --- a/examples/Consumer/GridKitConsumer/CMakeLists.txt.in +++ b/examples/Consumer/GridKitConsumer/CMakeLists.txt.in @@ -28,15 +28,3 @@ include(CTest) add_test(NAME GridKitConsumer COMMAND consumer WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) - -if(TARGET GridKit::optimal_power_flow_systemmodel_dependency_tracking - AND TARGET GridKit::solvers_opt_steady) - add_executable(opf_consumer OptimalPowerFlow/runSystemTests.cpp) - target_link_libraries( - opf_consumer - GridKit::optimal_power_flow_systemmodel - GridKit::optimal_power_flow_systemmodel_dependency_tracking - GridKit::solvers_opt_steady - GridKit::testing) - add_test(NAME GridKitOPFConsumer COMMAND opf_consumer) -endif() diff --git a/examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json b/examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json deleted file mode 100644 index 490ed99f78..0000000000 --- a/examples/EconomicDispatch/ACTIVSg2000/ACTIVSg2000.solver.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "system_model_file": "ACTIVSg2000.case.json", - "dispatch_file": "ACTIVSg2000.m", - "output_state_file": "ACTIVSg2000.state.json", - "ipopt": { - "tol": 1e-08 - } -} diff --git a/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt b/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt deleted file mode 100644 index d4fa645e50..0000000000 --- a/examples/EconomicDispatch/ACTIVSg2000/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -gridkit_economic_dispatch_example(ACTIVSg2000) diff --git a/examples/EconomicDispatch/CMakeLists.txt b/examples/EconomicDispatch/CMakeLists.txt deleted file mode 100644 index c1d6a7b218..0000000000 --- a/examples/EconomicDispatch/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -add_executable(EconomicDispatch EconomicDispatch.cpp) -target_link_libraries( - EconomicDispatch - PUBLIC GridKit::optimal_power_flow_systemmodel - GridKit::phasor_dynamics_systemmodel - GridKit::model_state_data - GridKit::solvers_opt_steady) -target_include_directories( - EconomicDispatch - PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include) -install( - TARGETS EconomicDispatch - EXPORT gridkit-targets - RUNTIME) - -# -# gridkit_economic_dispatch_example() -# -# Solve the economic dispatch of `cases/PhasorDynamics/` with the limits -# and costs of its MATPOWER case, and write the solution state. -# -function(gridkit_economic_dispatch_example case) - gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.case.json) - gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/PhasorDynamics/${case}/${case}.m) - gridkit_example_add_file(${case}.solver.json) - - add_test( - NAME EconomicDispatch_${case} - COMMAND EconomicDispatch ${case}.solver.json - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endfunction() - -add_subdirectory(IEEE39) -add_subdirectory(Hawaii) -add_subdirectory(ACTIVSg2000) diff --git a/examples/EconomicDispatch/EconomicDispatch.cpp b/examples/EconomicDispatch/EconomicDispatch.cpp deleted file mode 100644 index 1af36ef896..0000000000 --- a/examples/EconomicDispatch/EconomicDispatch.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/** - * @file EconomicDispatch.cpp - * @brief Economic dispatch of a PhasorDynamics case, written as an operating - * state. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace OPF = GridKit::OptimalPowerFlow; -namespace PD = GridKit::PhasorDynamics; -namespace fs = std::filesystem; - -using json = nlohmann::json; -using Log = GridKit::Utilities::Logger; -using GridKit::Model::StateData; - -/// Numeric case parameter, or its model default if omitted -template -typename DataT::RealT realParameter(const DataT& data, typename DataT::Parameters key, typename DataT::RealT fallback = 0.0) -{ - const auto entry = data.parameters.find(key); - if (entry == data.parameters.end()) - { - return fallback; - } - if (const auto* value = std::get_if(&entry->second)) - { - return *value; - } - if (const auto* value = std::get_if(&entry->second)) - { - return static_cast(*value); - } - throw std::invalid_argument(data.disambiguation_string + ": parameter " + std::string(magic_enum::enum_name(key)) + " must be numeric"); -} - -/// Preserve a supplied current pair, or initialize it from the case power -void initializeCurrent(StateData& state, const std::string& id, size_t bus, double p, double q) -{ - const auto* record = state.device(id); - const bool has_ir = record != nullptr && record->values.contains("ir"); - const bool has_ii = record != nullptr && record->values.contains("ii"); - if (has_ir != has_ii) - { - throw std::invalid_argument(id + ": state must supply both ir and ii"); - } - if (!has_ir) - { - GridKit::Model::setTerminalCurrent(state, id, bus, 0, 1, p, q); - } -} - -/** - * @brief Dispatchable generators from PhasorDynamics machines - */ -template -void addGenerators(OPF::SystemModelData<>& data, StateData& state, const std::vector& machines) -{ - using Buses = typename MachineDataT::Buses; - using Parameters = typename MachineDataT::Parameters; - - for (const auto& machine : machines) - { - auto& generator = data.generator.emplace_back(); - generator.id = machine.disambiguation_string; - generator.buses[OPF::GeneratorBuses::bus] = machine.buses.at(Buses::bus); - - const auto* record = state.device(generator.id); - if (record != nullptr && !record->flag("online", true)) - { - throw std::invalid_argument("Offline machine " + generator.id + " is not supported yet"); - } - initializeCurrent(state, generator.id, machine.buses.at(Buses::bus), realParameter(machine, Parameters::p0), realParameter(machine, Parameters::q0)); - } -} - -/** - * @brief Optimal power flow network of a PhasorDynamics case - * - * Machines become generators, `LoadZIP` devices fixed loads, and `LoadZ` - * devices shunts. Branches keep the PhasorDynamics parameters. Missing state - * voltages and current pairs are initialized from the case in the same pass. - */ -OPF::SystemModelData<> network(const PD::SystemModelData<>& grid, StateData& state) -{ - using BusType = PD::SystemModelData<>::BusDataT::BusType; - - OPF::SystemModelData<> data; - data.va_base = grid.va_base; - - for (const auto& bus : grid.bus) - { - auto& record = data.bus.emplace_back(); - record.number = bus.bus_id; - record.infinite = bus.bus_type == BusType::SLACK; - - auto& voltage = state.buses[GridKit::Model::busKey(bus.bus_id)].values; - voltage.try_emplace("vr", bus.Vr0); - voltage.try_emplace("vi", bus.Vi0); - } - - for (const auto& branch : grid.branch) - { - auto& record = data.branch.emplace_back(); - record.id = branch.disambiguation_string; - record.buses[OPF::BranchBuses::bus1] = branch.buses.at(PD::BranchBuses::bus1); - record.buses[OPF::BranchBuses::bus2] = branch.buses.at(PD::BranchBuses::bus2); - for (const auto& key : std::views::keys(branch.parameters)) - { - const auto parameter = magic_enum::enum_cast(magic_enum::enum_name(key)); - record.parameters[parameter.value()] = realParameter(branch, key); - } - } - - addGenerators(data, state, grid.genrou); - addGenerators(data, state, grid.gensal); - addGenerators(data, state, grid.genclassical); - addGenerators(data, state, grid.regca); - - for (const auto& load : grid.loadzip) - { - auto& record = data.load.emplace_back(); - record.id = load.disambiguation_string; - record.buses[OPF::LoadBuses::bus] = load.buses.at(PD::LoadZIPBuses::bus); - initializeCurrent(state, record.id, load.buses.at(PD::LoadZIPBuses::bus), -realParameter(load, PD::LoadZIPParameters::Pnom), -realParameter(load, PD::LoadZIPParameters::Qnom)); - } - - // Y = 1 / (R + jX) - for (const auto& load : grid.loadz) - { - const double r = realParameter(load, PD::LoadZParameters::R, 0.1); - const double x = realParameter(load, PD::LoadZParameters::X, 0.01); - - auto& record = data.shunt.emplace_back(); - record.id = load.disambiguation_string; - record.buses[OPF::ShuntBuses::bus] = load.buses.at(PD::LoadZBuses::bus); - record.parameters[OPF::ShuntParameters::G] = r / (r * r + x * x); - record.parameters[OPF::ShuntParameters::B] = -x / (r * r + x * x); - } - - return data; -} - -/** - * @brief Set Ipopt options of string, integer, or real type - */ -void setOptions(Ipopt::IpoptApplication& app, const json& options) -{ - for (const auto& [name, value] : options.items()) - { - bool set = false; - if (value.is_string()) - { - set = app.Options()->SetStringValue(name, value.get()); - } - else if (value.is_number_integer()) - { - set = app.Options()->SetIntegerValue(name, value.get()); - } - else if (value.is_number()) - { - set = app.Options()->SetNumericValue(name, value.get()); - } - - if (!set) - { - throw std::invalid_argument("Invalid Ipopt option " + name); - } - } -} - -int runApplication(int argc, const char* argv[]) -{ - if (argc < 2) - { - std::cerr << "Usage: EconomicDispatch \n"; - return 1; - } - - const fs::path file = argv[1]; - std::ifstream stream(file); - if (!stream) - { - throw std::runtime_error("Could not open dispatch study " + file.string()); - } - const json options = json::parse(stream); - const auto input = [&](const char* key) - { - const auto path = options.at(key).get(); - return path.is_absolute() ? path : file.parent_path() / path; - }; - const auto output = options.at("output_state_file").get(); - const auto grid = PD::parseSystemModelData(input("system_model_file")); - - StateData state; - if (options.contains("state_file") && !options.at("state_file").get().empty()) - { - state = GridKit::Model::parseStateData(input("state_file")); - } - auto data = network(grid, state); - OPF::applyMatpowerData(data, OPF::parseMatpowerData(input("dispatch_file"))); - - OPF::SystemModel model(data, state); - if (model.allocate() != 0) - { - return 1; - } - - // Enforce the original bounds - Ipopt::SmartPtr app = IpoptApplicationFactory(); - app->Options()->SetNumericValue("bound_relax_factor", 0.0); - setOptions(*app, options.value("ipopt", json::object())); - if (app->Initialize() != Ipopt::Solve_Succeeded) - { - Log::error() << "Ipopt initialization failed\n"; - return 1; - } - - Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::SteadyState(&model); - - const Ipopt::ApplicationReturnStatus status = app->OptimizeTNLP(problem); - if (status != Ipopt::Solve_Succeeded && status != Ipopt::Solved_To_Acceptable_Level) - { - Log::error() << "Ipopt did not converge, status " << magic_enum::enum_name(status) << "\n"; - return 1; - } - - model.evaluateObjective(); - std::cout << "\nOptimal cost " << model.objective() << "\n"; - - GridKit::Model::writeStateData(model.solutionState(), output); - std::cout << "State written to " << output << "\n"; - - return 0; -} - -int main(int argc, const char* argv[]) -{ - try - { - return runApplication(argc, argv); - } - catch (const std::exception& error) - { - Log::error() << "EconomicDispatch failed: " << error.what() << '\n'; - } - - return 1; -} diff --git a/examples/EconomicDispatch/Hawaii/CMakeLists.txt b/examples/EconomicDispatch/Hawaii/CMakeLists.txt deleted file mode 100644 index 2127842f85..0000000000 --- a/examples/EconomicDispatch/Hawaii/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -gridkit_economic_dispatch_example(Hawaii) diff --git a/examples/EconomicDispatch/Hawaii/Hawaii.solver.json b/examples/EconomicDispatch/Hawaii/Hawaii.solver.json deleted file mode 100644 index 4cdb03e871..0000000000 --- a/examples/EconomicDispatch/Hawaii/Hawaii.solver.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "system_model_file": "Hawaii.case.json", - "dispatch_file": "Hawaii.m", - "output_state_file": "Hawaii.state.json", - "ipopt": { - "tol": 1e-08 - } -} diff --git a/examples/EconomicDispatch/IEEE39/CMakeLists.txt b/examples/EconomicDispatch/IEEE39/CMakeLists.txt deleted file mode 100644 index 9497c81e0c..0000000000 --- a/examples/EconomicDispatch/IEEE39/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -gridkit_economic_dispatch_example(IEEE39) diff --git a/examples/EconomicDispatch/IEEE39/IEEE39.solver.json b/examples/EconomicDispatch/IEEE39/IEEE39.solver.json deleted file mode 100644 index 1af1737bb6..0000000000 --- a/examples/EconomicDispatch/IEEE39/IEEE39.solver.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "system_model_file": "IEEE39.case.json", - "dispatch_file": "IEEE39.m", - "output_state_file": "IEEE39.state.json", - "ipopt": { - "tol": 1e-08 - } -} diff --git a/examples/EconomicDispatch/README.md b/examples/EconomicDispatch/README.md deleted file mode 100644 index 9adad7e673..0000000000 --- a/examples/EconomicDispatch/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Economic Dispatch - -This example source is retained but is not built, installed, or registered -with CTest. PhasorDynamics initialization from an OPF state is deferred. - -The source solves the optimal power flow of a case in `cases/PhasorDynamics/` -with the limits and costs of its MATPOWER case and writes the solution state. -Previously recorded OPF results: - - Case | Buses | Generators | Ipopt iterations | Cost [$/h] - --------------|-------|------------|------------------|----------- - `IEEE39` | 39 | 10 | 16 | 40086.9 - `Hawaii` | 37 | 39 | 20 | 4151.17 - `ACTIVSg2000` | 2000 | 334 | 35 | 1.22901e6 - -## Input - -Dispatch requires `system_model_file`, `dispatch_file`, and `output_state_file`; -`state_file` and `ipopt` are optional. See the -[IEEE39 input](IEEE39/IEEE39.solver.json). -Input paths are relative to the solver file; output is relative to the working -directory. Missing state values use the case operating point; supplied currents -must include both `ir` and `ii`. - -Machines marked `online: false` in the input state are currently rejected. - - Case device | Optimal power flow component - ---------------------------------------------|----------------------------- - `Bus`, `BusInfinite` | `Bus`, infinite for `BusInfinite` - `Branch` | `Branch` with the same parameters - `Genrou`, `Gensal`, `GenClassical`, `Regca` | `Generator` - `LoadZIP` | `Load` with its demand from the state - `LoadZ` | `Shunt` with $G + jB = 1 / (R + jX)$ - -Controllers, exciters, governors, stabilizers, and faults do not enter the -optimal power flow. - -Ipopt uses exact sparse derivatives. The application sets `bound_relax_factor` -to 0 to enforce the original bounds. Options under `ipopt` are applied after it. - -## Pass criterion - -When enabled, `EconomicDispatch_` passes when Ipopt converges and the -state is written. - -## Data - -- `IEEE39`: MATPOWER `case39`. -- `Hawaii`: the MATPOWER export of the Texas A&M Hawaii40 case. -- `ACTIVSg2000`: MATPOWER `case_ACTIVSg2000`. The static generators are - `LoadZIP` devices with negative demand in the case, so they stay fixed. diff --git a/examples/OptimalPowerFlow/CMakeLists.txt b/examples/OptimalPowerFlow/CMakeLists.txt new file mode 100644 index 0000000000..f398596f70 --- /dev/null +++ b/examples/OptimalPowerFlow/CMakeLists.txt @@ -0,0 +1,3 @@ +if(GRIDKIT_ENABLE_IPOPT) + add_subdirectory(EconomicDispatch) +endif() diff --git a/examples/OptimalPowerFlow/EconomicDispatch/CMakeLists.txt b/examples/OptimalPowerFlow/EconomicDispatch/CMakeLists.txt new file mode 100644 index 0000000000..6ce7711d81 --- /dev/null +++ b/examples/OptimalPowerFlow/EconomicDispatch/CMakeLists.txt @@ -0,0 +1,18 @@ +add_executable(EconomicDispatch EconomicDispatch.cpp) +target_link_libraries( + EconomicDispatch + PUBLIC GridKit::optimal_power_flow_systemmodel GridKit::solvers_opt_steady) +install(TARGETS EconomicDispatch RUNTIME DESTINATION bin) + +# Optimal costs [$/h] from PYPOWER 5.1.21, a port of MATPOWER +set(_reference_cost_IEEE39 41864.1776) +set(_reference_cost_Hawaii 4151.35488) +set(_reference_cost_ACTIVSg2000 1228892.076) + +foreach(case IN ITEMS IEEE39 Hawaii ACTIVSg2000) + gridkit_example_add_file(${CMAKE_SOURCE_DIR}/cases/OptimalPowerFlow/${case}/${case}.m) + add_test( + NAME EconomicDispatch_${case} + COMMAND EconomicDispatch ${case}.m ${_reference_cost_${case}} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +endforeach() diff --git a/examples/OptimalPowerFlow/EconomicDispatch/EconomicDispatch.cpp b/examples/OptimalPowerFlow/EconomicDispatch/EconomicDispatch.cpp new file mode 100644 index 0000000000..3f82ea8df6 --- /dev/null +++ b/examples/OptimalPowerFlow/EconomicDispatch/EconomicDispatch.cpp @@ -0,0 +1,88 @@ +/** + * @file EconomicDispatch.cpp + * @brief AC optimal power flow of a MATPOWER case. + */ + +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace OPF = GridKit::OptimalPowerFlow; + +using Log = GridKit::Utilities::Logger; + +/// Relative tolerance of the optimal cost against a reference cost +constexpr double COST_TOLERANCE = 1.0e-8; + +int runApplication(int argc, const char* argv[]) +{ + Log::raiseVerbosity(Log::SUMMARY); + + if (argc < 2) + { + Log::error() << "No input file provided\n" + << "\n" + << "Usage:\n" + << " EconomicDispatch [reference-cost]\n" + << "\n"; + return 1; + } + + OPF::SystemModel model(OPF::parseMatpowerCase(argv[1])); + if (model.allocate() != 0) + { + return 1; + } + + // Exact sparse Jacobians and Hessians come from the model + Ipopt::SmartPtr app = IpoptApplicationFactory(); + if (app->Initialize() != Ipopt::Solve_Succeeded) + { + return 1; + } + + Ipopt::SmartPtr problem = new AnalysisManager::IpoptInterface::SteadyState(&model); + if (app->OptimizeTNLP(problem) != Ipopt::Solve_Succeeded) + { + Log::error() << "Ipopt did not find an optimal solution\n"; + return 1; + } + + const double cost = model.objective(); + Log::summary() << std::format("Optimal cost {:.2f} $/h\n", cost); + + // A reference cost turns the study into a check + if (argc > 2) + { + const double reference = std::stod(argv[2]); + const double error = std::abs(cost - reference) / std::abs(reference); + if (error > COST_TOLERANCE) + { + Log::error() << std::format("Optimal cost differs from the reference {} $/h by {:.1e}\n", reference, error); + return 1; + } + } + + return 0; +} + +int main(int argc, const char* argv[]) +{ + try + { + return runApplication(argc, argv); + } + catch (const std::exception& error) + { + Log::error() << "EconomicDispatch failed: " << error.what() << '\n'; + } + + return 1; +} diff --git a/examples/OptimalPowerFlow/EconomicDispatch/README.md b/examples/OptimalPowerFlow/EconomicDispatch/README.md new file mode 100644 index 0000000000..236e6b6131 --- /dev/null +++ b/examples/OptimalPowerFlow/EconomicDispatch/README.md @@ -0,0 +1,13 @@ +# EconomicDispatch + +These examples solve the AC optimal power flow of MATPOWER cases with Ipopt, +using the exact sparse derivatives of the `OptimalPowerFlow` model. + +| Case | Buses | Optimal cost [\$/h] | +| --- | --- | --- | +| [IEEE39](../../../cases/OptimalPowerFlow/IEEE39/README.md) | 39 | 41864.18 | +| [Hawaii](../../../cases/OptimalPowerFlow/Hawaii/README.md) | 37 | 4151.35 | +| [ACTIVSg2000](../../../cases/OptimalPowerFlow/ACTIVSg2000/README.md) | 2000 | 1228892.07 | + +The tests check each cost against PYPOWER 5.1.21, a port of MATPOWER, to a +relative 1e-8. diff --git a/examples/OptimalPowerFlow/README.md b/examples/OptimalPowerFlow/README.md new file mode 100644 index 0000000000..91880f7190 --- /dev/null +++ b/examples/OptimalPowerFlow/README.md @@ -0,0 +1,23 @@ +# OptimalPowerFlow + +The economic dispatch examples +use the reusable MATPOWER cases in `cases/OptimalPowerFlow/`. + +| Examples | Purpose | +| --- | --- | +| [EconomicDispatch](EconomicDispatch/README.md) | AC optimal power flow studies. | + +## Running a Study + +Configure and build GridKit with Enzyme and Ipopt enabled. CMake copies each +case file into the build tree and packages it in the install tree. + +For an installation under `/path/to/install`, run: + +```bash +cd /path/to/install/share/gridkit/examples/OptimalPowerFlow/EconomicDispatch +/path/to/install/bin/EconomicDispatch IEEE39.m +``` + +A second argument, a reference cost in \$/h, makes the study fail when the +optimal cost differs from it. diff --git a/examples/PowerFlow/MatPowerTesting/MatPowerTesting.hpp b/examples/PowerFlow/MatPowerTesting/MatPowerTesting.hpp index 062a32fece..9db3ea8933 100644 --- a/examples/PowerFlow/MatPowerTesting/MatPowerTesting.hpp +++ b/examples/PowerFlow/MatPowerTesting/MatPowerTesting.hpp @@ -38,11 +38,10 @@ namespace GridKit PowerFlowData::GenCostData b, RealT tol = tol_) { - (void) tol; // suppress warning int fail = 0; fail += a.kind != b.kind; - fail += a.startup != b.startup; - fail += a.shutdown != b.shutdown; + fail += !isEqual(a.startup, b.startup, tol); + fail += !isEqual(a.shutdown, b.shutdown, tol); fail += a.n != b.n; if (fail) { diff --git a/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp b/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp index 8e7e675c1d..901a3396d0 100644 --- a/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp +++ b/examples/PowerFlow/MatPowerTesting/test_parse_matpower.cpp @@ -35,7 +35,7 @@ mpc.version = '2'; %%----- Power Flow Data -----%% %% system MVA base -mpc.baseMVA = 100; +mpc.baseMVA = 100.0; %% bus data % bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin @@ -49,7 +49,7 @@ mpc.bus = [1 2 0 0 0 0 1 1 0 230 1 1.1 0.0; % ] belongs to the comment %% generator data % bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf -mpc.gen = [1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0; +mpc.gen = [1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 1 170 0 127.5 -127.5 1 100 1 170 0 0 0 0 0 0 0 0 0 0 0 0 3 323.49 0 390 -390 1 100 1 520 0 0 0 0 0 0 0 0 0 0 0 0; 4 0 0 150 -150 1 100 1 200 0 0 0 0 0 0 0 0 0 0 0 0; @@ -58,7 +58,7 @@ mpc.gen = [1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0; %% branch data % fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax -mpc.branch = [1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360; +mpc.branch = [1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360 0 0 0 0 0 0 0 0; 1 4 0.00304 0.0304 0.00658 0 0 0 0 0 1 -360 360; 1 5 0.00064 0.0064 0.03126 0 0 0 0 0 1 -360 360; 2 3 0.00108 0.0108 0.01852 0 0 0 0 0 1 -360 360; @@ -70,7 +70,7 @@ mpc.branch = [1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360; %% generator cost data % 1 startup shutdown n x1 y1 ... xn yn % 2 startup shutdown n c(n-1) ... c0 -mpc.gencost = [2 0 0 3 0 14 0; +mpc.gencost = [2 0.0 0.0 3 0 14 0; 2 0 0 3 0 15 0; 2 0 0 3 0 30 0; 2 0 0 3 0 40 0; 2 0 0 3 0 10 0; diff --git a/examples/README.md b/examples/README.md index 7fd15a9e0d..a4ed632ebf 100644 --- a/examples/README.md +++ b/examples/README.md @@ -3,11 +3,12 @@ GridKit™ usage examples are organized as follows: - [EMT](EMT/README.md) contains architecture skeletons for future EMT examples. -- `Enzyme` directory contains Enzyme automatic differentiation examples. - `Experimental` directory contains examples of dynamic-constrained optimization. - `LinearAlgebra` has examples and tests for dense and sparse matrices in GridKit™. +- [OptimalPowerFlow](OptimalPowerFlow/README.md) contains examples of AC optimal +power flow with GridKit™. - [PhasorDynamics](PhasorDynamics/README.md) contains examples describing use of GridKit™ for phasor domain dynamic simulations. - `PowerElectronics` has examples describing microgrid simulations with diff --git a/tests/UnitTests/CMakeLists.txt b/tests/UnitTests/CMakeLists.txt index 5d69032fc7..a7eac6c4e3 100644 --- a/tests/UnitTests/CMakeLists.txt +++ b/tests/UnitTests/CMakeLists.txt @@ -2,7 +2,6 @@ add_subdirectory(AutomaticDifferentiation) add_subdirectory(LinearAlgebra) add_subdirectory(Math) -add_subdirectory(Model) add_subdirectory(Network) if(GRIDKIT_ENABLE_ENZYME) add_subdirectory(OptimalPowerFlow) diff --git a/tests/UnitTests/Model/CMakeLists.txt b/tests/UnitTests/Model/CMakeLists.txt deleted file mode 100644 index c5ca959193..0000000000 --- a/tests/UnitTests/Model/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -add_executable(test_state_data runStateDataTests.cpp) -target_link_libraries( - test_state_data - PRIVATE GridKit::model_state_data GridKit::testing) - -add_test(NAME ModelStateDataTest COMMAND test_state_data) - -install(TARGETS test_state_data) diff --git a/tests/UnitTests/Model/StateDataTests.hpp b/tests/UnitTests/Model/StateDataTests.hpp deleted file mode 100644 index a2d3e8b2f0..0000000000 --- a/tests/UnitTests/Model/StateDataTests.hpp +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include -#include - -namespace GridKit -{ - namespace Testing - { - class StateDataTests - { - public: - /// Bus and current keys follow `STATE.md` - TestOutcome keys() - { - TestStatus success = true; - - success *= Model::busKey(7) == "bus_id_7"; - success *= Model::currentKeys(0, 1) == std::pair{"ir", "ii"}; - success *= Model::currentKeys(1, 2) == std::pair{"ir2", "ii2"}; - - return success.report(__func__); - } - - /// Numbers and flags are read into separate maps and survive writing - TestOutcome roundTrip() - { - TestStatus success = true; - - std::istringstream input(R"({ - "header": {"version": 1, "description": "round trip"}, - "buses": {"bus_id_2": {"vr": 0.98, "vi": -0.12}}, - "devices": { - "gen_2": {"online": true, "ir": 0.8, "ii": -0.2}, - "branch_1_2": {"open": false, "tap": 1, "phase": 0.05, "note": null} - } - })"); - const Model::StateData state = Model::parseStateData(input); - - success *= state.header.version == 1U; - success *= state.header.description == "round trip"; - success *= !state.header.created.has_value(); - success *= !state.header.time.has_value(); - - const Model::StateRecord* bus = state.bus(2); - success *= bus != nullptr; - success *= state.bus(3) == nullptr; - - const Model::StateRecord* generator = state.device("gen_2"); - success *= generator != nullptr; - success *= generator->flag("online", false); - success *= !generator->values.contains("online"); - - const Model::StateRecord* branch = state.device("branch_1_2"); - success *= branch != nullptr; - success *= !branch->flag("open", true); - success *= isEqual(branch->value("tap", 0.0), 1.0); - success *= !branch->values.contains("note"); - success *= isEqual(branch->value("missing", 0.25), 0.25); - - std::stringstream buffer; - Model::writeStateData(state, buffer); - const Model::StateData copy = Model::parseStateData(buffer); - - success *= copy.header.version == state.header.version; - success *= copy.header.description == state.header.description; - success *= !copy.header.created.has_value(); - success *= isEqual(copy.buses.at("bus_id_2").values, bus->values); - success *= isEqual(copy.devices.at("gen_2").values, generator->values); - success *= copy.devices.at("gen_2").flags == generator->flags; - success *= isEqual(copy.devices.at("branch_1_2").values, branch->values); - success *= copy.devices.at("branch_1_2").flags == branch->flags; - - return success.report(__func__); - } - - /// Entries that are neither numbers nor booleans are rejected - TestOutcome rejectsText() - { - TestStatus success = true; - - success *= throws(parseText); - - return success.report(__func__); - } - - /// Terminal current and terminal power are inverse conversions - TestOutcome terminalConversion() - { - TestStatus success = true; - - Model::StateData state; - state.buses[Model::busKey(4)].values = {{"vr", 1.02}, {"vi", -0.15}}; - state.buses[Model::busKey(5)].values = {{"vr", 0.97}, {"vi", 0.08}}; - - double p = 0.0; - double q = 0.0; - - Model::setTerminalCurrent(state, "gen_4", 4, 0, 1, 0.7, -0.25); - success *= Model::terminalPower(state, "gen_4", 4, 0, 1, p, q); - success *= isEqual(p, 0.7); - success *= isEqual(q, -0.25); - - Model::setTerminalCurrent(state, "branch_4_5", 5, 1, 2, -0.4, 0.1); - success *= state.devices.at("branch_4_5").values.contains("ir2"); - success *= state.devices.at("branch_4_5").values.contains("ii2"); - success *= Model::terminalPower(state, "branch_4_5", 5, 1, 2, p, q); - success *= isEqual(p, -0.4); - success *= isEqual(q, 0.1); - - // No current for this terminal, and no voltage for bus 6 - success *= !Model::terminalPower(state, "branch_4_5", 4, 0, 2, p, q); - success *= !Model::terminalPower(state, "gen_4", 6, 0, 1, p, q); - - return success.report(__func__); - } - - private: - static void parseText() - { - std::istringstream input(R"({"devices": {"gen_2": {"ir": "0.8"}}})"); - Model::parseStateData(input); - } - }; - } // namespace Testing -} // namespace GridKit diff --git a/tests/UnitTests/Model/runStateDataTests.cpp b/tests/UnitTests/Model/runStateDataTests.cpp deleted file mode 100644 index cd01af3e81..0000000000 --- a/tests/UnitTests/Model/runStateDataTests.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "StateDataTests.hpp" - -int main() -{ - GridKit::Testing::TestingResults result; - GridKit::Testing::StateDataTests test; - - result += test.keys(); - result += test.roundTrip(); - result += test.rejectsText(); - result += test.terminalConversion(); - - return result.summary(); -} diff --git a/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt index d68abb804b..4f802bc76d 100644 --- a/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt +++ b/tests/UnitTests/OptimalPowerFlow/CMakeLists.txt @@ -3,8 +3,6 @@ target_link_libraries( test_opf_components GridKit::optimal_power_flow_components GridKit::optimal_power_flow_components_dependency_tracking - GridKit::phasor_dynamics_branch - GridKit::phasor_dynamics_bus GridKit::testing) add_test(NAME OptimalPowerFlowComponentTest COMMAND test_opf_components) install(TARGETS test_opf_components) diff --git a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp index 67199bfab7..20a55ec8d6 100644 --- a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -17,9 +18,6 @@ #include #include #include -#include -#include -#include #include namespace GridKit @@ -27,7 +25,6 @@ namespace GridKit namespace Testing { namespace OPF = GridKit::OptimalPowerFlow; - namespace PD = GridKit::PhasorDynamics; /** * @brief Component derivatives against dependency tracking and closed forms @@ -41,39 +38,24 @@ namespace GridKit using EntryMap = std::map, RealT>; public: - /// Power into each bus is V conj(I) with I from `PhasorDynamics::Branch` + /// Power into each bus at V1 = 1 and V2 = j, from the admittances by hand TestOutcome branchPower() { TestStatus success = true; - OPF::Branch branch(opfBranchData()); - const auto x = variables(branch, Model::StateData{}, BRANCH_X); + OPF::Branch branch(branchData()); + const auto x = variables(branch, POWER_X); std::vector g(branch.sizeConstraints()); branch.evaluateConstraints(x.data(), g.data()); - const RealT vr1 = BRANCH_X[0]; - const RealT vi1 = BRANCH_X[1]; - const RealT vr2 = BRANCH_X[2]; - const RealT vi2 = BRANCH_X[3]; - - RealT ir1 = 0.0; - RealT ii1 = 0.0; - RealT ir2 = 0.0; - RealT ii2 = 0.0; - pdCurrents(vr1, vi1, vr2, vi2, ir1, ii1, ir2, ii2); - - const RealT p1 = vr1 * ir1 + vi1 * ii1; - const RealT q1 = vi1 * ir1 - vr1 * ii1; - const RealT p2 = vr2 * ir2 + vi2 * ii2; - const RealT q2 = vi2 * ir2 - vr2 * ii2; - - success *= isEqual(g[0], p1 * p1 + q1 * q1, POWER_TOL); - success *= isEqual(g[1], p2 * p2 + q2 * q2, POWER_TOL); - success *= isEqual(g[2], p1, POWER_TOL); - success *= isEqual(g[3], q1, POWER_TOL); - success *= isEqual(g[4], p2, POWER_TOL); - success *= isEqual(g[5], q2, POWER_TOL); + // S1 = -3.9 - j3.45 and S2 = -7.6 - j7.3 + success *= isEqual(g[0], 27.1125, POWER_TOL); + success *= isEqual(g[1], 111.05, POWER_TOL); + success *= isEqual(g[2], -3.9, POWER_TOL); + success *= isEqual(g[3], -3.45, POWER_TOL); + success *= isEqual(g[4], -7.6, POWER_TOL); + success *= isEqual(g[5], -7.3, POWER_TOL); return success.report(__func__); } @@ -83,12 +65,12 @@ namespace GridKit { TestStatus success = true; - OPF::Branch branch(opfBranchData()); - const auto x = variables(branch, Model::StateData{}, BRANCH_X); + OPF::Branch branch(branchData()); + const auto x = variables(branch, BRANCH_X); branch.evaluateJacobian(x.data()); - OPF::Branch tracked(opfBranchData()); - const auto x_tracked = variables(tracked, Model::StateData{}, BRANCH_X); + OPF::Branch tracked(branchData()); + const auto x_tracked = variables(tracked, BRANCH_X); std::vector g(tracked.sizeConstraints()); tracked.evaluateConstraints(x_tracked.data(), g.data()); @@ -107,30 +89,18 @@ namespace GridKit { TestStatus success = true; - OPF::Branch branch(opfBranchData()); - const auto x = variables(branch, Model::StateData{}, BRANCH_X); + OPF::Branch branch(branchData()); + const auto x = variables(branch, BRANCH_X); branch.evaluateHessian(x.data(), ONE, BRANCH_LAMBDA.data()); - // Admittances of PhasorDynamics::Branch from unit voltages - RealT g11 = 0.0; - RealT b11 = 0.0; - RealT g12 = 0.0; - RealT b12 = 0.0; - RealT g21 = 0.0; - RealT b21 = 0.0; - RealT g22 = 0.0; - RealT b22 = 0.0; - pdCurrents(ONE, ZERO, ZERO, ZERO, g11, b11, g21, b21); - pdCurrents(ZERO, ZERO, ONE, ZERO, g12, b12, g22, b22); - // Rows 2 to 5: P1, Q1, P2, Q2 EntryMap expected; - addPowerHessian(expected, 0, {g11, b11, g12, b12}, BRANCH_LAMBDA[2], BRANCH_LAMBDA[3]); - addPowerHessian(expected, 1, {g21, b21, g22, b22}, BRANCH_LAMBDA[4], BRANCH_LAMBDA[5]); + addPowerHessian(expected, 0, BUS1_ADMITTANCE, BRANCH_LAMBDA[2], BRANCH_LAMBDA[3]); + addPowerHessian(expected, 1, BUS2_ADMITTANCE, BRANCH_LAMBDA[4], BRANCH_LAMBDA[5]); // Rows 0 and 1: |S|^2 = P^2 + Q^2 by the chain rule over tracked gradients - OPF::Branch tracked(opfBranchData()); - const auto x_tracked = variables(tracked, Model::StateData{}, BRANCH_X); + OPF::Branch tracked(branchData()); + const auto x_tracked = variables(tracked, BRANCH_X); std::vector g(tracked.sizeConstraints()); tracked.evaluateConstraints(x_tracked.data(), g.data()); @@ -144,8 +114,8 @@ namespace GridKit } const RealT weight1 = TWO * BRANCH_LAMBDA[0]; const RealT weight2 = TWO * BRANCH_LAMBDA[1]; - addPowerHessian(expected, 0, {g11, b11, g12, b12}, weight1 * g[2].getValue(), weight1 * g[3].getValue()); - addPowerHessian(expected, 1, {g21, b21, g22, b22}, weight2 * g[4].getValue(), weight2 * g[5].getValue()); + addPowerHessian(expected, 0, BUS1_ADMITTANCE, weight1 * g[2].getValue(), weight1 * g[3].getValue()); + addPowerHessian(expected, 1, BUS2_ADMITTANCE, weight2 * g[4].getValue(), weight2 * g[5].getValue()); success *= isEqual(sum(branch.hessian()), expected, HESSIAN_TOL); success *= branch.hessian().values.size() == BRANCH_HESSIAN_SIZE; @@ -153,17 +123,17 @@ namespace GridKit return success.report(__func__); } - /// Entry counts are structural, so an open branch at a flat start with - /// zero multipliers has the same entries + /// Entry counts are structural, so an out-of-service branch at a flat + /// start with zero multipliers has the same entries, all zero TestOutcome branchPattern() { TestStatus success = true; - Model::StateData state; - state.devices[BRANCH_ID].flags["open"] = true; + auto data = branchData(); + data.in_service = false; - OPF::Branch branch(opfBranchData()); - const auto x = variables(branch, state, FLAT_START); + OPF::Branch branch(data); + const auto x = variables(branch, FLAT_START); const std::vector lambda(branch.sizeConstraints(), ZERO); branch.evaluateJacobian(x.data()); @@ -171,6 +141,10 @@ namespace GridKit success *= branch.jacobian().values.size() == BRANCH_JACOBIAN_SIZE; success *= branch.hessian().values.size() == BRANCH_HESSIAN_SIZE; + for (const RealT value : branch.jacobian().values) + { + success *= isEqual(value, ZERO); + } for (const RealT value : branch.hessian().values) { success *= isEqual(value, ZERO); @@ -184,18 +158,17 @@ namespace GridKit { TestStatus success = true; - Model::StateData state; - state.buses[Model::busKey(1)].values = {{"vr", 1.0}, {"vi", 0.0}}; - OPF::Generator generator(generatorData()); std::vector x(generator.size()); - std::vector x_lower(generator.size()); - std::vector x_upper(generator.size()); numberLocally(generator); - success *= generator.initialize(state, x.data(), x_lower.data(), x_upper.data()) == 0; + success *= generator.initialize(x.data()) == 0; + success *= isEqual(x[0], ZERO) && isEqual(x[1], ZERO); + + const auto& lower = generator.variableLower(); + const auto& upper = generator.variableUpper(); - success *= isEqual(x_lower[0], PMIN) && isEqual(x_upper[0], PMAX); - success *= isEqual(x_lower[1], QMIN) && isEqual(x_upper[1], QMAX); + success *= isEqual(lower[0], PMIN) && isEqual(upper[0], PMAX); + success *= isEqual(lower[1], QMIN) && isEqual(upper[1], QMAX); x = GENERATOR_X; const RealT p = x[0]; @@ -218,26 +191,25 @@ namespace GridKit return success.report(__func__); } - /// An offline generator is fixed at zero with no cost and the same entries - TestOutcome offlineGenerator() + /// An out-of-service generator is fixed at zero with no cost and the same entries + TestOutcome outOfServiceGenerator() { TestStatus success = true; - Model::StateData state; - state.devices["gen_1"].flags["online"] = false; + auto data = generatorData(); + data.in_service = false; - OPF::Generator generator(generatorData()); - std::vector x(generator.size()); - std::vector x_lower(generator.size()); - std::vector x_upper(generator.size()); + OPF::Generator generator(data); numberLocally(generator); - generator.initialize(state, x.data(), x_lower.data(), x_upper.data()); - success *= isEqual(x_lower[0], ZERO) && isEqual(x_upper[0], ZERO); - success *= isEqual(x_lower[1], ZERO) && isEqual(x_upper[1], ZERO); + const auto& lower = generator.variableLower(); + const auto& upper = generator.variableUpper(); - x = GENERATOR_X; - RealT f = ZERO; + success *= isEqual(lower[0], ZERO) && isEqual(upper[0], ZERO); + success *= isEqual(lower[1], ZERO) && isEqual(upper[1], ZERO); + + std::vector x = GENERATOR_X; + RealT f = ZERO; generator.evaluateObjective(x.data(), f); success *= isEqual(f, ZERO); @@ -250,7 +222,7 @@ namespace GridKit return success.report(__func__); } - /// Shunt derivatives in closed form + /// Shunt derivatives in closed form, and no power out of service TestOutcome shunt() { TestStatus success = true; @@ -262,7 +234,7 @@ namespace GridKit data.parameters[OPF::ShuntParameters::B] = SHUNT_B; OPF::Shunt shunt(data); - const auto x = variables(shunt, Model::StateData{}, SHUNT_X); + const auto x = variables(shunt, SHUNT_X); const RealT vr = x[0]; const RealT vi = x[1]; @@ -283,17 +255,21 @@ namespace GridKit success *= isEqual(sum(shunt.hessian()), EntryMap{{{0, 0}, hessian}, {{1, 1}, hessian}}); + data.in_service = false; + OPF::Shunt out_of_service(data); + const auto x_out = variables(out_of_service, SHUNT_X); + std::vector g_out(out_of_service.sizeConstraints(), ZERO); + out_of_service.evaluateConstraints(x_out.data(), g_out.data()); + success *= isEqual(g_out[0], ZERO) && isEqual(g_out[1], ZERO); + return success.report(__func__); } - /// Bus rows follow the limits and the reference and infinite settings + /// Bus rows follow the limits, and a reference bus fixes its imaginary voltage at zero TestOutcome bus() { TestStatus success = true; - Model::StateData state; - state.buses[Model::busKey(3)].values = {{"vr", BUS_VR}, {"vi", BUS_VI}}; - OPF::BusData data; data.number = 3; data.parameters[OPF::BusParameters::Vmin] = VMIN; @@ -301,15 +277,13 @@ namespace GridKit OPF::Bus bus(data); std::vector x(bus.size()); - std::vector x_lower(bus.size()); - std::vector x_upper(bus.size()); numberLocally(bus); - bus.initialize(state, x.data(), x_lower.data(), x_upper.data()); - success *= isEqual(x[0], BUS_VR) && isEqual(x[1], BUS_VI); - for (IdxT j = 0; j < bus.size(); ++j) + bus.initialize(x.data()); + success *= isEqual(x[0], ONE) && isEqual(x[1], ZERO); + for (IdxT j = 0; j < bus.sizeInternalVariables(); ++j) { - success *= std::isinf(x_lower[j]) && std::isinf(x_upper[j]); + success *= std::isinf(bus.variableLower()[j]) && std::isinf(bus.variableUpper()[j]); } const auto& lower = bus.constraintLower(); @@ -318,70 +292,58 @@ namespace GridKit success *= isEqual(lower[0], ZERO) && isEqual(upper[0], ZERO); success *= isEqual(lower[1], ZERO) && isEqual(upper[1], ZERO); success *= isEqual(lower[2], VMIN * VMIN) && isEqual(upper[2], VMAX * VMAX); - success *= std::isinf(lower[3]) && std::isinf(upper[3]); - - bus.setReference(); - success *= isEqual(lower[3], ZERO) && isEqual(upper[3], ZERO); x = BUS_X; std::vector g(bus.sizeConstraints()); bus.evaluateConstraints(x.data(), g.data()); success *= isEqual(g[2], x[0] * x[0] + x[1] * x[1]); - success *= isEqual(g[3], BUS_VR * x[1] - BUS_VI * x[0]); bus.evaluateJacobian(x.data()); - success *= isEqual(sum(bus.jacobian()), - EntryMap{{{2, 0}, TWO * x[0]}, {{2, 1}, TWO * x[1]}, {{3, 0}, -BUS_VI}, {{3, 1}, BUS_VR}}); + success *= isEqual(sum(bus.jacobian()), EntryMap{{{2, 0}, TWO * x[0]}, {{2, 1}, TWO * x[1]}}); bus.evaluateHessian(x.data(), ONE, BUS_LAMBDA.data()); const RealT hessian = TWO * BUS_LAMBDA[2]; success *= isEqual(sum(bus.hessian()), EntryMap{{{0, 0}, hessian}, {{1, 1}, hessian}}); - data.infinite = true; - OPF::Bus infinite(data); - numberLocally(infinite); - infinite.initialize(state, x.data(), x_lower.data(), x_upper.data()); - success *= isEqual(x_lower[0], BUS_VR) && isEqual(x_upper[0], BUS_VR); - success *= isEqual(x_lower[1], BUS_VI) && isEqual(x_upper[1], BUS_VI); - for (IdxT i = 0; i < infinite.sizeConstraints(); ++i) - { - success *= std::isinf(infinite.constraintLower()[i]) && std::isinf(infinite.constraintUpper()[i]); - } + data.reference = true; + OPF::Bus reference(data); + success *= std::isinf(reference.variableLower()[0]) && std::isinf(reference.variableUpper()[0]); + success *= isEqual(reference.variableLower()[1], ZERO) && isEqual(reference.variableUpper()[1], ZERO); return success.report(__func__); } - /// Load demand comes from the state, with no entries + /// Load demand comes from its parameters, with no entries, and is zero + /// out of service TestOutcome load() { TestStatus success = true; - Model::StateData state; - state.buses[Model::busKey(2)].values = {{"vr", 1.01}, {"vi", -0.05}}; - Model::setTerminalCurrent(state, "load_2", 2, 0, 1, -0.6, -0.2); - OPF::LoadData data; - data.id = "load_2"; - data.buses[OPF::LoadBuses::bus] = 2; + data.id = "load_2"; + data.buses[OPF::LoadBuses::bus] = 2; + data.parameters[OPF::LoadParameters::P] = LOAD_P; + data.parameters[OPF::LoadParameters::Q] = LOAD_Q; OPF::Load load(data); - std::vector x = {1.0, 0.0}; - numberLocally(load); - success *= load.initialize(state, x.data(), nullptr, nullptr) == 0; + const auto x = variables(load, LOAD_X); std::vector g(load.sizeConstraints(), ZERO); load.evaluateConstraints(x.data(), g.data()); - success *= isEqual(g[0], -0.6) && isEqual(g[1], -0.2); + success *= isEqual(g[0], -LOAD_P) && isEqual(g[1], -LOAD_Q); const std::vector lambda(load.sizeConstraints(), ONE); load.evaluateJacobian(x.data()); load.evaluateHessian(x.data(), ONE, lambda.data()); success *= load.jacobian().values.empty() && load.hessian().values.empty(); - OPF::Load missing(data); - numberLocally(missing); - success *= missing.initialize(Model::StateData{}, x.data(), nullptr, nullptr) != 0; + data.in_service = false; + OPF::Load out_of_service(data); + const auto x_out = variables(out_of_service, LOAD_X); + std::vector g_out(out_of_service.sizeConstraints(), ZERO); + out_of_service.evaluateConstraints(x_out.data(), g_out.data()); + success *= isEqual(g_out[0], ZERO) && isEqual(g_out[1], ZERO); return success.report(__func__); } @@ -389,16 +351,21 @@ namespace GridKit private: static constexpr const char* BRANCH_ID = "branch_1_2"; - static constexpr RealT R = 0.02; - static constexpr RealT X = 0.15; - static constexpr RealT G = 0.01; - static constexpr RealT B = 0.3; - static constexpr RealT GMAG = 0.004; - static constexpr RealT BMAG = -0.02; - static constexpr RealT TAP = 1.05; - static constexpr RealT PHASE = 0.1; + static constexpr RealT R = 0.1; + static constexpr RealT X = 0.1; + static constexpr RealT G = 0.2; + static constexpr RealT B = 0.4; + static constexpr RealT GMAG = 0.05; + static constexpr RealT BMAG = 0.1; + static constexpr RealT TAP = 2.0; + static constexpr RealT PHASE = std::numbers::pi / 2.0; static constexpr RealT SMAX = 1.2; + /// Admittances g_k1, b_k1, g_k2, b_k2 of the current into bus k: series + /// admittance 5 - j5, tap 2 at 90 degrees, and the shunts + static constexpr std::array BUS1_ADMITTANCE = {-1.4, 0.95, 2.5, 2.5}; + static constexpr std::array BUS2_ADMITTANCE = {-2.5, -2.5, -5.1, 4.8}; + static constexpr IdxT BRANCH_JACOBIAN_SIZE = 24; static constexpr IdxT BRANCH_HESSIAN_SIZE = 10; @@ -414,11 +381,13 @@ namespace GridKit static constexpr RealT SHUNT_G = 0.05; static constexpr RealT SHUNT_B = 0.3; - static constexpr RealT VMIN = 0.9; - static constexpr RealT VMAX = 1.1; - static constexpr RealT BUS_VR = 0.99; - static constexpr RealT BUS_VI = 0.1; + static constexpr RealT VMIN = 0.9; + static constexpr RealT VMAX = 1.1; + static constexpr RealT LOAD_P = 0.6; + static constexpr RealT LOAD_Q = 0.2; + + static inline const std::vector POWER_X = {1.0, 0.0, 0.0, 1.0}; static inline const std::vector BRANCH_X = {1.02, 0.12, 0.96, -0.08}; static inline const std::vector BRANCH_LAMBDA = {0.3, -0.2, 1.5, -0.7, 2.1, 0.4}; static inline const std::vector FLAT_START = {1.0, 0.0, 1.0, 0.0}; @@ -426,14 +395,15 @@ namespace GridKit static inline const std::vector SHUNT_X = {0.98, 0.1}; static inline const std::vector SHUNT_LAMBDA = {1.3, -0.6}; static inline const std::vector BUS_X = {1.02, -0.05}; - static inline const std::vector BUS_LAMBDA = {0.7, -0.4, 1.3, 0.5}; + static inline const std::vector BUS_LAMBDA = {0.7, -0.4, 1.3}; + static inline const std::vector LOAD_X = {1.01, -0.05}; // Allow roundoff in the independent power and derivative references. static constexpr RealT POWER_TOL = 2 * std::numeric_limits::epsilon(); - static constexpr RealT JACOBIAN_TOL = 64 * std::numeric_limits::epsilon(); - static constexpr RealT HESSIAN_TOL = 64 * std::numeric_limits::epsilon(); + static constexpr RealT JACOBIAN_TOL = 2 * std::numeric_limits::epsilon(); + static constexpr RealT HESSIAN_TOL = 6 * std::numeric_limits::epsilon(); - static OPF::BranchData opfBranchData() + static OPF::BranchData branchData() { OPF::BranchData data; data.id = BRANCH_ID; @@ -466,48 +436,6 @@ namespace GridKit return data; } - /** - * @brief Currents into bus 1 and bus 2 from `PhasorDynamics::Branch` - */ - static void pdCurrents(RealT vr1, - RealT vi1, - RealT vr2, - RealT vi2, - RealT& ir1, - RealT& ii1, - RealT& ir2, - RealT& ii2) - { - PD::BranchData data; - data.parameters[PD::BranchParameters::R] = R; - data.parameters[PD::BranchParameters::X] = X; - data.parameters[PD::BranchParameters::G] = G; - data.parameters[PD::BranchParameters::B] = B; - data.parameters[PD::BranchParameters::Gmag] = GMAG; - data.parameters[PD::BranchParameters::Bmag] = BMAG; - data.parameters[PD::BranchParameters::tap] = TAP; - data.parameters[PD::BranchParameters::phase] = PHASE; - - PD::Bus bus1(vr1, vi1); - PD::Bus bus2(vr2, vi2); - bus1.allocate(); - bus1.initialize(); - bus1.evaluateResidual(); - bus2.allocate(); - bus2.initialize(); - bus2.evaluateResidual(); - - PD::Branch branch(&bus1, &bus2, data); - branch.allocate(); - branch.initialize(); - branch.evaluateResidual(); - - ir1 = bus1.Ir(); - ii1 = bus1.Ii(); - ir2 = bus2.Ir(); - ii2 = bus2.Ii(); - } - /// Local indices are global indices template static void numberLocally(ComponentT& component) @@ -524,17 +452,13 @@ namespace GridKit /// Initialized component variables set to `values`, tracked by index template - static std::vector variables(ComponentT& component, - const Model::StateData& state, - const std::vector& values) + static std::vector variables(ComponentT& component, const std::vector& values) { using ScalarT = typename ComponentT::ScalarT; numberLocally(component); std::vector x(values.size()); - std::vector x_lower(values.size()); - std::vector x_upper(values.size()); - component.initialize(state, x.data(), x_lower.data(), x_upper.data()); + component.initialize(x.data()); for (IdxT j = 0; j < values.size(); ++j) { diff --git a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp index a2449cc908..bb13d32a68 100644 --- a/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/SystemTests.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -14,7 +15,6 @@ #include #include #include -#include #include #include #include @@ -41,17 +41,17 @@ namespace GridKit using TrackedT = OPF::SystemModel; public: - /// Balance and magnitude rows at every bus, one reference row, and flow rows at the rated branch only + /// Balance and magnitude rows at every bus, and flow rows at the rated branch only TestOutcome allocation() { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); success *= system.allocate() == 0; // Three buses and two generators with two variables each success *= system.size() == 10; - success *= system.sizeConstraints() == 12; + success *= system.sizeConstraints() == 11; const RealT* g_lower = system.gLower().getData(); const RealT* g_upper = system.gUpper().getData(); @@ -63,21 +63,23 @@ namespace GridKit { success *= isEqual(g_lower[i], VMIN * VMIN) && isEqual(g_upper[i], VMAX * VMAX); } - success *= isEqual(g_lower[REFERENCE_ROW], ZERO) && isEqual(g_upper[REFERENCE_ROW], ZERO); for (const IdxT i : FLOW_ROWS) { success *= std::isinf(g_lower[i]) && isEqual(g_upper[i], SMAX * SMAX); } + // The imaginary voltage of reference bus 1 is fixed at zero + success *= isEqual(system.xLower().getData()[1], ZERO) && isEqual(system.xUpper().getData()[1], ZERO); + return success.report(__func__); } - /// The lowest-numbered bus keeps its state angle, and the others move + /// The reference bus keeps zero imaginary voltage, and the others move TestOutcome reference() { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); system.allocate(); success *= optimize(system); @@ -94,13 +96,13 @@ namespace GridKit { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); system.allocate(); setVariables(system); system.evaluateJacobian(); const auto enzyme = MapFromCsr(system.getCsrJacobian()); - TrackedT tracked(data(), state()); + TrackedT tracked(data()); tracked.allocate(); setVariables(tracked); tracked.evaluateConstraints(); @@ -121,12 +123,12 @@ namespace GridKit { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); system.allocate(); setVariables(system); system.evaluateGradient(); - TrackedT tracked(data(), state()); + TrackedT tracked(data()); tracked.allocate(); setVariables(tracked); tracked.evaluateObjective(); @@ -147,7 +149,7 @@ namespace GridKit { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); system.allocate(); setVariables(system); @@ -178,7 +180,7 @@ namespace GridKit { TestStatus success = true; - SystemT system(data(), state()); + SystemT system(data()); system.allocate(); success *= optimize(system); @@ -198,83 +200,78 @@ namespace GridKit return success.report(__func__); } - /// The solution state restarts the model at the solution - TestOutcome solutionState() + /// Data with an island without a reference bus, or with a repeated bus, is rejected + TestOutcome configuration() { TestStatus success = true; - SystemT system(data(), state()); - system.allocate(); - optimize(system); + auto no_reference = data(); + no_reference.bus[0].reference = false; - SystemT restarted(data(), system.solutionState()); - success *= restarted.allocate() == 0; + success *= configurationRejected([&]() + { return SystemT(no_reference).verify(); }); - const RealT* x = system.x().getData(); - const RealT* x_restart = restarted.x().getData(); - for (IdxT j = 0; j < system.size(); ++j) - { - success *= isEqual(x_restart[j], x[j], STATE_TOL); - } + // Out-of-service branches 2-3 and 1-3 leave bus 3 an island without a reference bus + auto island = data(); + island.branch[1].in_service = false; + island.branch[2].in_service = false; - return success.report(__func__); - } + success *= configurationRejected([&]() + { return SystemT(island).verify(); }); - /// Rows end at `;` or the line end, and scalars, cell arrays, and comments are skipped - TestOutcome parseMatpowerData() - { - TestStatus success = true; + auto repeated = data(); + repeated.bus[1].number = 1; - const OPF::MatpowerData matpower = parse(R"(function mpc = test - mpc.baseMVA = 100.0; - mpc.bus_name = { - 'ONE'; - }; - mpc.gen = [ % ] 1 2 3; - % - 1 2.5 3; - 4 5 6; 7 8 9]; - mpc.gencost = [2 0.5 0.25 2 1 0]; - )"); - - success *= matpower.matrices.size() == 2; - success *= matpower.matrix("gen") == OPF::MatpowerMatrix{{1.0, 2.5, 3.0}, {4.0, 5.0, 6.0}, {7.0, 8.0, 9.0}}; - success *= matpower.matrix("gencost") == OPF::MatpowerMatrix{{2.0, 0.5, 0.25, 2.0, 1.0, 0.0}}; - - success *= throws([&] - { matpower.matrix("branch"); }); - success *= throws(parse, "mpc.bus = [\n 1 Inf;\n];"); - success *= throws(parse, "mpc.bus = [\n 1 2;\n"); + success *= throws([&]() + { SystemT system(repeated); }); return success.report(__func__); } /** - * @brief Buses match by number, in-service branches by their buses in - * order, and in-service generators in order at buses with generators + * @brief MATPOWER rows become components on the system base * - * Branch 2-3 is listed as 3-2, and branch 1-3 has no rating. The - * generator at bus 2 is a static injection, and the first one at bus 3 - * is out of service. + * Branch 2 and generator 2 are out of service, and branch 3 is a + * phase-shifting transformer with line charging. */ - TestOutcome applyMatpowerData() + TestOutcome parseMatpowerCase() { TestStatus success = true; - OPF::SystemModelData network = data(); - network.branch[0].parameters.erase(OPF::BranchParameters::Smax); - network.branch[2].parameters[OPF::BranchParameters::Smax] = 0.25; - OPF::applyMatpowerData(network, parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, MATPOWER_GENCOST))); + const auto data = parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GENCOST)); + + success *= isEqual(data.va_base, 100.0e6); + success *= data.bus.size() == 3; + success *= data.bus[0].reference && !data.bus[1].reference && !data.bus[2].reference; + success *= isEqual(data.bus[1].parameters.at(OPF::BusParameters::Vmin), 0.95); + success *= isEqual(data.bus[1].parameters.at(OPF::BusParameters::Vmax), 1.05); + + success *= data.load.size() == 1 && data.load[0].id == "load_2"; + success *= isEqual(data.load[0].parameters.at(OPF::LoadParameters::P), 1.2); + success *= isEqual(data.load[0].parameters.at(OPF::LoadParameters::Q), 0.3); + success *= data.shunt.size() == 1 && data.shunt[0].id == "shunt_3"; + success *= isEqual(data.shunt[0].parameters.at(OPF::ShuntParameters::B), 0.1); + + success *= data.branch.size() == 3 && data.branch[2].id == "branch_3"; + success *= data.branch[0].in_service && !data.branch[1].in_service && data.branch[2].in_service; + + const auto& line = data.branch[0].parameters; - success *= isEqual(network.bus[0].parameters.at(OPF::BusParameters::Vmin), 0.94); - success *= isEqual(network.bus[0].parameters.at(OPF::BusParameters::Vmax), 1.06); - success *= isEqual(network.bus[1].parameters.at(OPF::BusParameters::Vmin), 0.95); + success *= isEqual(line.at(OPF::BranchParameters::tap), ONE); + success *= isEqual(line.at(OPF::BranchParameters::Bmag), ZERO); + success *= isEqual(line.at(OPF::BranchParameters::Smax), 0.6); - success *= isEqual(network.branch[0].parameters.at(OPF::BranchParameters::Smax), 0.6); - success *= isEqual(network.branch[1].parameters.at(OPF::BranchParameters::Smax), 0.9); - success *= !network.branch[2].parameters.contains(OPF::BranchParameters::Smax); + const auto& transformer = data.branch[2].parameters; - const auto& gen_1 = network.generator[0].parameters; + success *= isEqual(transformer.at(OPF::BranchParameters::tap), 1.05); + success *= isEqual(transformer.at(OPF::BranchParameters::phase), std::numbers::pi / 18.0); + success *= isEqual(transformer.at(OPF::BranchParameters::Bmag), 0.01 / (1.05 * 1.05) - 0.01); + success *= !transformer.contains(OPF::BranchParameters::Smax); + + success *= data.generator.size() == 3 && data.generator[2].id == "gen_3"; + success *= data.generator[0].in_service && !data.generator[1].in_service && data.generator[2].in_service; + + const auto& gen_1 = data.generator[0].parameters; success *= isEqual(gen_1.at(OPF::GeneratorParameters::Pmin), 0.1); success *= isEqual(gen_1.at(OPF::GeneratorParameters::Pmax), 1.5); @@ -284,78 +281,56 @@ namespace GridKit success *= isEqual(gen_1.at(OPF::GeneratorParameters::c1), 1200.0); success *= isEqual(gen_1.at(OPF::GeneratorParameters::c2), 100.0); - const auto& gen_3 = network.generator[1].parameters; + const auto& gen_3 = data.generator[2].parameters; - success *= isEqual(gen_3.at(OPF::GeneratorParameters::Pmin), 0.3); - success *= isEqual(gen_3.at(OPF::GeneratorParameters::Pmax), 1.8); success *= isEqual(gen_3.at(OPF::GeneratorParameters::c0), 7.0); success *= isEqual(gen_3.at(OPF::GeneratorParameters::c1), 1400.0); success *= isEqual(gen_3.at(OPF::GeneratorParameters::c2), 200.0); - auto duplicate = parse(matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, MATPOWER_GENCOST)); - duplicate.matrices.at("bus")[1] = duplicate.matrices.at("bus")[0]; - success *= throws([&]() - { - auto invalid = data(); - OPF::applyMatpowerData(invalid, duplicate); }); - - // Extra and missing branches and generators, a piecewise-linear cost, and a cubic cost - const std::string branch_extra = MATPOWER_BRANCH + "\n1 2 0.01 0.1 0 0 0 0 0 0 1"; - const std::string branch_short = "1 2 0.01 0.1 0.02 60 0 0 0 0 1"; - const std::string gen_extra = "1 0 0 50 -50 1 100 1 150 10\n3 0 0 80 -40 1 100 1 90 0\n3 0 0 80 -40 1 100 1 180 30"; - const std::string gen_short = "1 0 0 50 -50 1 100 1 150 10"; - const std::string costs = "2 0 0 3 0.01 12 5;\n2 0 0 2 20 0;\n2 0 0 2 20 0"; - const std::string piecewise = "1 0 0 2 0 0 100 10;\n2 0 0 2 20 0;\n2 0 0 2 20 0;\n2 0 0 2 14 7"; - const std::string cubic = "2 0 0 3 0.01 12 5;\n2 0 0 2 20 0;\n2 0 0 2 20 0;\n2 0 0 4 1 0 14 7"; - - success *= throws(apply, matpowerCase(branch_extra, MATPOWER_GEN, MATPOWER_GENCOST)); - success *= throws(apply, matpowerCase(branch_short, MATPOWER_GEN, MATPOWER_GENCOST)); - success *= throws(apply, matpowerCase(MATPOWER_BRANCH, gen_extra, costs)); - success *= throws(apply, matpowerCase(MATPOWER_BRANCH, gen_short, costs)); - success *= throws(apply, matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, piecewise)); - success *= throws(apply, matpowerCase(MATPOWER_BRANCH, MATPOWER_GEN, cubic)); + // An isolated bus, angle-difference limits, a piecewise-linear cost, a cubic cost, and a missing cost + const std::string isolated = MATPOWER_BUS + "\n4 4 0 0 0 0 1 1 0 230 1 1.04 0.96"; + const std::string angle_limits = MATPOWER_BRANCH + "\n1 3 0.02 0.2 0 0 0 0 0 0 1 -30 30"; + const std::string piecewise = "1 0 0 2 0 0 100 1000;\n2 0 0 2 20 0;\n2 0 0 2 14 7"; + const std::string cubic = "2 0 0 4 1 0.02 14 7;\n2 0 0 2 20 0;\n2 0 0 2 14 7"; + const std::string missing = "2 0 0 3 0.01 12 5;\n2 0 0 2 20 0"; + + success *= throws(parse, matpowerCase(MATPOWER_BRANCH, MATPOWER_GENCOST, isolated)); + success *= throws(parse, matpowerCase(angle_limits, MATPOWER_GENCOST)); + success *= throws(parse, matpowerCase(MATPOWER_BRANCH, piecewise)); + success *= throws(parse, matpowerCase(MATPOWER_BRANCH, cubic)); + success *= throws(parse, matpowerCase(MATPOWER_BRANCH, missing)); return success.report(__func__); } private: - static OPF::MatpowerData parse(const std::string& text) + static OPF::SystemModelData parse(const std::string& text) { std::istringstream input(text); - return OPF::parseMatpowerData(input); + return OPF::parseMatpowerCase(input); } - static void apply(const std::string& text) + /// MATPOWER case with the given branch, cost, and bus rows + static std::string matpowerCase(const std::string& branch, const std::string& gencost, const std::string& bus = MATPOWER_BUS) { - OPF::SystemModelData network = data(); - OPF::applyMatpowerData(network, parse(text)); + return "mpc.version = '2';\nmpc.baseMVA = 100;\nmpc.bus = [\n" + bus + "\n];\nmpc.gen = [\n" + MATPOWER_GEN + + "\n];\nmpc.branch = [\n" + branch + "\n];\nmpc.gencost = [\n" + gencost + "\n];\n"; } - /// MATPOWER case of the `data()` network with the given branch, generator, and cost rows - static std::string matpowerCase(const std::string& branch, const std::string& gen, const std::string& gencost) - { - return "mpc.bus = [\n" - "1 3 0 0 0 0 1 1 0 230 1 1.06 0.94;\n" - "2 1 120 30 0 0 1 1 0 230 1 1.05 0.95;\n" - "3 2 0 0 0 0 1 1 0 230 1 1.04 0.96;\n" - "];\n" - "mpc.branch = [\n" - + branch + "\n];\nmpc.gen = [\n" + gen + "\n];\nmpc.gencost = [\n" + gencost + "\n];\n"; - } - - static inline const std::string MATPOWER_BRANCH = "1 2 0.01 0.1 0.02 60 0 0 0 0 1\n" - "3 2 0.01 0.1 0 90 0 0 0 0 1\n" - "1 3 0.02 0.2 0 0 0 0 0 0 1\n" - "1 3 0.02 0.2 0 50 0 0 0 0 0"; + static inline const std::string MATPOWER_BUS = "1 3 0 0 0 0 1 1 0 230 1 1.06 0.94;\n" + "2 1 120 30 0 0 1 1 0 230 1 1.05 0.95;\n" + "3 2 0 0 0 10 1 1 0 230 1 1.04 0.96;"; static inline const std::string MATPOWER_GEN = "1 0 0 50 -50 1 100 1 150 10\n" - "2 20 0 0 0 1 100 1 20 20\n" "3 0 0 80 -40 1 100 0 90 0\n" "3 0 0 80 -40 1 100 1 180 30"; - static inline const std::string MATPOWER_GENCOST = "2 0 0 3 0.01 12 5;\n" + static inline const std::string MATPOWER_BRANCH = "1 2 0.01 0.1 0 60 0 0 0 0 1 -360 360\n" + "2 3 0.01 0.1 0 90 0 0 0 0 0 -360 360\n" + "1 3 0.02 0.2 0.02 0 0 0 1.05 10 1 0 0"; + + static inline const std::string MATPOWER_GENCOST = "2 0.0 0.0 3 0.01 12 5;\n" "2 0 0 2 20 0;\n" - "2 0 0 3 0 0 0;\n" "2 0 0 4 0 0.02 14 7"; /// Values within `tol` relative to one plus the reference magnitude @@ -401,17 +376,13 @@ namespace GridKit static constexpr RealT SIGMA = 0.7; static constexpr RealT LAMBDA_SCALE = 0.25; - // Measured worst errors: Jacobian 7.0 eps, gradient and Hessian exact, - // solved balance 5.4e-13, restart 0.3 eps static constexpr RealT DERIVATIVE_TOL = 8 * std::numeric_limits::epsilon(); static constexpr RealT BALANCE_TOL = 1.0e-12; - static constexpr RealT STATE_TOL = std::numeric_limits::epsilon(); /// Rows of the buses in order, then of the rated branch - static inline const std::vector BALANCE_ROWS = {0, 1, 4, 5, 7, 8}; - static inline const std::vector MAGNITUDE_ROWS = {2, 6, 9}; - static constexpr IdxT REFERENCE_ROW = 3; - static inline const std::vector FLOW_ROWS = {10, 11}; + static inline const std::vector BALANCE_ROWS = {0, 1, 3, 4, 6, 7}; + static inline const std::vector MAGNITUDE_ROWS = {2, 5, 8}; + static inline const std::vector FLOW_ROWS = {9, 10}; /// A point away from the flat start static inline const std::vector POINT = {1.02, 0.0, 0.97, -0.07, 1.01, -0.03, 0.8, 0.2, 0.4, -0.1}; @@ -424,6 +395,7 @@ namespace GridKit { auto& bus = data.bus.emplace_back(); bus.number = number; + bus.reference = number == 1; bus.parameters[OPF::BusParameters::Vmin] = VMIN; bus.parameters[OPF::BusParameters::Vmax] = VMAX; } @@ -436,9 +408,11 @@ namespace GridKit addGenerator(data, "gen_1", 1, 10.0); addGenerator(data, "gen_3", 3, 20.0); - auto& load = data.load.emplace_back(); - load.id = "load_2"; - load.buses[OPF::LoadBuses::bus] = 2; + auto& load = data.load.emplace_back(); + load.id = "load_2"; + load.buses[OPF::LoadBuses::bus] = 2; + load.parameters[OPF::LoadParameters::P] = LOAD_P; + load.parameters[OPF::LoadParameters::Q] = LOAD_Q; auto& shunt = data.shunt.emplace_back(); shunt.id = "shunt_3"; @@ -478,18 +452,6 @@ namespace GridKit generator.parameters[OPF::GeneratorParameters::c2] = 0.01; } - /// Flat start with the load demand - static Model::StateData state() - { - Model::StateData state; - for (IdxT number = 1; number <= 3; ++number) - { - state.buses[Model::busKey(number)].values = {{"vr", ONE}, {"vi", ZERO}}; - } - Model::setTerminalCurrent(state, "load_2", 2, 0, 1, -LOAD_P, -LOAD_Q); - return state; - } - /// Move the variables to `POINT` template static void setVariables(ModelT& system) diff --git a/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp b/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp index c97a53d1d0..98361e7dc8 100644 --- a/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp +++ b/tests/UnitTests/OptimalPowerFlow/runComponentTests.cpp @@ -10,7 +10,7 @@ int main() result += test.branchHessian(); result += test.branchPattern(); result += test.generator(); - result += test.offlineGenerator(); + result += test.outOfServiceGenerator(); result += test.shunt(); result += test.bus(); result += test.load(); diff --git a/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp b/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp index 6af059d253..4f7c1084dc 100644 --- a/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp +++ b/tests/UnitTests/OptimalPowerFlow/runSystemTests.cpp @@ -11,9 +11,8 @@ int main() result += test.gradient(); result += test.hessian(); result += test.solve(); - result += test.solutionState(); - result += test.parseMatpowerData(); - result += test.applyMatpowerData(); + result += test.configuration(); + result += test.parseMatpowerCase(); return result.summary(); } From d5c7d68b903aa4846a1b9889c78eab12f181cc52 Mon Sep 17 00:00:00 2001 From: lukelowry Date: Thu, 15 Oct 2026 02:54:39 -0500 Subject: [PATCH 10/10] platofrm dependent correction --- GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp | 3 ++- tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp index be5f759a88..61149f9b34 100644 --- a/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp +++ b/GridKit/Model/OptimalPowerFlow/SystemModelImpl.hpp @@ -230,7 +230,8 @@ namespace GridKit for (const auto& component : components_) { - for (const auto& error : component->verify().errors()) + const auto component_checks = component->verify(); + for (const auto& error : component_checks.errors()) { checks.fail(std::format("{}: {}", component->id(), error)); } diff --git a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp index 20a55ec8d6..954038ba6c 100644 --- a/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp +++ b/tests/UnitTests/OptimalPowerFlow/ComponentTests.hpp @@ -401,7 +401,7 @@ namespace GridKit // Allow roundoff in the independent power and derivative references. static constexpr RealT POWER_TOL = 2 * std::numeric_limits::epsilon(); static constexpr RealT JACOBIAN_TOL = 2 * std::numeric_limits::epsilon(); - static constexpr RealT HESSIAN_TOL = 6 * std::numeric_limits::epsilon(); + static constexpr RealT HESSIAN_TOL = 9 * std::numeric_limits::epsilon(); static OPF::BranchData branchData() {