diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b94fcacf2..84b55c146 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,7 +61,7 @@ jobs: - name: cache extlib id: cache-extlib - uses: actions/cache@v3 + uses: actions/cache@v4 with: key: extlib-${{ runner.os }}-${{ hashFiles('./ExtLibraries/**') }}-${{ matrix.build_bit }} path: ./ExtLibraries @@ -90,6 +90,7 @@ jobs: working-directory: ./ExtLibraries run: | cmake --install . + - name: check extlib shell: powershell working-directory: ./ExtLibraries @@ -99,17 +100,27 @@ jobs: ls cspice/include ls cspice/generic_kernels ls nrlmsise00 - ls nrlmsise00/table ls nrlmsise00/lib* ls nrlmsise00/lib*/libnrlmsise00.lib ls nrlmsise00/src + - name: copy to settings + if: steps.cache-extlib.outputs.cache-hit == 'true' + shell: powershell + run: | + ls ./settings/environment/cspice + cp -r "./ExtLibraries/cspice/generic_kernels" "./settings/environment/cspice" + ls ./settings/environment/cspice + ls ./settings/environment/cspice/generic_kernels/lsk + ls ./settings/environment/cspice/generic_kernels/pck + ls ./settings/environment/cspice/generic_kernels/spk + - name: build 32bit if: matrix.build_bit == 'BUILD_64BIT=OFF' shell: cmd run: | cl.exe - cmake -G "Visual Studio 17 2022" -A Win32 -DCMAKE_CONFIGURATION_TYPES:STRING="Debug" -DEXT_LIB_DIR=./ExtLibraries -DFLIGHT_SW_DIR=./c2a-core -DC2A_NAME=Examples/minimum_user -D${{ matrix.use_c2a }} -D${{ matrix.build_bit }} + cmake -G "Visual Studio 17 2022" -A Win32 -DCMAKE_CONFIGURATION_TYPES:STRING="Debug" -DSETTINGS_DIR_FROM_EXE=./settings -DCORE_DIR_FROM_EXE=./ -DEXT_LIB_DIR=./ExtLibraries -DEXT_LIB_DIR_FROM_EXE=./ExtLibraries -DFLIGHT_SW_DIR=./c2a-core -DC2A_NAME=Examples/minimum_user -D${{ matrix.use_c2a }} -D${{ matrix.build_bit }} cmake --build . - name: build 64bit @@ -117,20 +128,20 @@ jobs: shell: cmd run: | cl.exe - cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_CONFIGURATION_TYPES:STRING="Debug" -DEXT_LIB_DIR=./ExtLibraries -DFLIGHT_SW_DIR=./c2a-core -DC2A_NAME=Examples/minimum_user -D${{ matrix.use_c2a }} -D${{ matrix.build_bit }} + cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_CONFIGURATION_TYPES:STRING="Debug" -DSETTINGS_DIR_FROM_EXE=./settings -DCORE_DIR_FROM_EXE=./ -DEXT_LIB_DIR=./ExtLibraries -DEXT_LIB_DIR_FROM_EXE=./ExtLibraries -DFLIGHT_SW_DIR=./c2a-core -DC2A_NAME=Examples/minimum_user -D${{ matrix.use_c2a }} -D${{ matrix.build_bit }} cmake --build . - name: fix simulation config shell: bash - working-directory: ./data/sample/initialize_files + working-directory: ./settings run: | - find . -type f -name '*.ini' -exec sed -i 's/..\/..\/..\/ExtLibraries/..\/..\/ExtLibraries/g' {} \; + find . -type f -name '*.ini' -exec sed -i 's/..\/..\/logs/.\/logs/g' {} \; - name: run simulation(SampleSat) if: matrix.build_bit == 'BUILD_64BIT=OFF' || (matrix.build_bit == 'BUILD_64BIT=ON' && matrix.use_c2a == 'USE_C2A=OFF') - working-directory: ./data/sample + working-directory: ./ run: | - ..\..\Debug\S2E.exe + .\Debug\S2E.exe build_s2e_linux: name: Build on Linux @@ -149,8 +160,8 @@ jobs: run: | COMPILER="${{ matrix.compiler }}" read -r -a COMPILER <<< "$COMPILER" - echo "::set-output name=CC::${COMPILER[0]}" - echo "::set-output name=CXX::${COMPILER[1]}" + echo "CC=${COMPILER[0]}" >> "$GITHUB_OUTPUT" + echo "CXX=${COMPILER[1]}" >> "$GITHUB_OUTPUT" - name: install deps run: | @@ -174,7 +185,7 @@ jobs: - name: cache extlib id: cache-extlib - uses: actions/cache@v3 + uses: actions/cache@v4 with: key: extlib-${{ runner.os }}-${{ hashFiles('./ExtLibraries/**') }}-${{ matrix.build_bit }} path: ExtLibraries @@ -190,6 +201,7 @@ jobs: working-directory: ./ExtLibraries run: | cmake --install . + - name: check extlib working-directory: ./ExtLibraries run: | @@ -198,35 +210,45 @@ jobs: ls cspice/include ls cspice/generic_kernels ls nrlmsise00 - ls nrlmsise00/table ls nrlmsise00/lib* ls nrlmsise00/lib*/libnrlmsise00.a ls nrlmsise00/src + - name: copy to settings + if: steps.cache-extlib.outputs.cache-hit == 'true' + run: | + ls ./settings/environment/cspice + cp -r "./ExtLibraries/cspice/generic_kernels" "./settings/environment/cspice" + ls ./settings/environment/cspice + ls ./settings/environment/cspice/generic_kernels/lsk + ls ./settings/environment/cspice/generic_kernels/pck + ls ./settings/environment/cspice/generic_kernels/spk + + - name: build env: CC: ${{ steps.compiler.outputs.CC }} CXX: ${{ steps.compiler.outputs.CXX }} run: | - cmake . -DEXT_LIB_DIR=./ExtLibraries -D${{ matrix.build_bit }} + cmake . -DEXT_LIB_DIR=./ExtLibraries -DEXT_LIB_DIR_FROM_EXE=./ExtLibraries -DSETTINGS_DIR_FROM_EXE=./settings -DCORE_DIR_FROM_EXE=./ -D${{ matrix.build_bit }} cmake --build . - name: fix simulation config - working-directory: ./data/sample/initialize_files + working-directory: ./settings run: | - find . -type f -name '*.ini' -exec sed -i 's/..\/..\/..\/ExtLibraries/..\/..\/ExtLibraries/g' {} \; + find . -type f -name '*.ini' -exec sed -i 's/..\/..\/logs/.\/logs/g' {} \; - name: run simulation(SampleSat) - working-directory: ./data/sample + working-directory: ./ run: | - ../../S2E + ./S2E - name: generate graph working-directory: ./scripts/Plot run: | sudo apt-get install -y gnuplot pip3 install yq - LOG=$(ls ../../data/sample/logs/logs_*/*.csv) + LOG=$(ls ../../logs/logs_*/*.csv) echo "plot $LOG" ./gen_graph.sh "${LOG}" ls @@ -239,7 +261,7 @@ jobs: ver=$(grep python_version ./Pipfile | sed -e 's/^python_version\s=\s"\(.*\)"$/\1/') echo "version=$ver" >> "$GITHUB_OUTPUT" - - uses: actions/setup-python@v5.0.0 + - uses: actions/setup-python@v5.2.0 with: python-version: ${{ steps.python-version.outputs.version }} @@ -248,6 +270,7 @@ jobs: run: | pip install pipenv pipenv install + pipenv run pip list pipenv run python plot_gs_visibility.py --no-gui ls ./*_gs_visibility.png diff --git a/.github/workflows/google-test.yml b/.github/workflows/google-test.yml index 9be934200..aa36bc177 100644 --- a/.github/workflows/google-test.yml +++ b/.github/workflows/google-test.yml @@ -61,7 +61,7 @@ jobs: - name: cache extlib id: cache-extlib - uses: actions/cache@v3 + uses: actions/cache@v4 with: key: extlib-${{ runner.os }}-${{ hashFiles('./ExtLibraries/**') }}} path: ExtLibraries @@ -85,7 +85,6 @@ jobs: ls cspice/include ls cspice/generic_kernels ls nrlmsise00 - ls nrlmsise00/table ls nrlmsise00/lib* ls nrlmsise00/lib*/libnrlmsise00.a ls nrlmsise00/src diff --git a/.github/workflows/validate-scripts.yml b/.github/workflows/validate-scripts.yml index 97973876c..29a154f98 100644 --- a/.github/workflows/validate-scripts.yml +++ b/.github/workflows/validate-scripts.yml @@ -28,7 +28,7 @@ jobs: ver=$(grep python_version ./Pipfile | sed -e 's/^python_version\s=\s"\(.*\)"$/\1/') echo "version=${ver}" >> "$GITHUB_OUTPUT" - - uses: actions/setup-python@v5.0.0 + - uses: actions/setup-python@v5.2.0 with: python-version: ${{ steps.python-version.outputs.version }} diff --git a/.gitignore b/.gitignore index 2429be973..f88fd866e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ src/.vscode/ build/ # Log files -data/**/logs/ +**/logs/ # CSIPCE scripts/tmp_cspice/ @@ -34,3 +34,9 @@ Icon # Python __pycache__/ + +# Setting files +settings/environment/cspice +settings/environment/space_weather +settings/environment/gravity_field +settings/environment/star_catalogue diff --git a/CMakeLists.txt b/CMakeLists.txt index 390c70bda..19144b325 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.13) project(S2E LANGUAGES CXX DESCRIPTION "S2E: Spacecraft Simulation Environment" - VERSION 7.2.9 + VERSION 8.0.0 ) # build config @@ -41,8 +41,8 @@ if(NOT DEFINED C2A_NAME) endif() ## Directory path for ini files -if(NOT DEFINED INI_FILE_DIR_FROM_EXE) - set(INI_FILE_DIR_FROM_EXE ../../data/sample/initialize_files) +if(NOT DEFINED SETTINGS_DIR_FROM_EXE) + set(SETTINGS_DIR_FROM_EXE ../../settings) endif() if(NOT DEFINED EXT_LIB_DIR_FROM_EXE) @@ -89,7 +89,11 @@ add_subdirectory(src/environment/local) add_subdirectory(src/dynamics) add_subdirectory(src/disturbances) add_subdirectory(src/components) -add_subdirectory(src/library) +add_subdirectory(src/math_physics) +add_subdirectory(src/setting_file_reader) +add_subdirectory(src/logger) +add_subdirectory(src/utilities) +add_subdirectory(ExtLibraries/inih) set(SOURCE_FILES src/s2e.cpp @@ -178,13 +182,14 @@ endif() #target_link_libraries(${PROJECT_NAME} ${NRLMSISE00_LIB}) # Initialize link -target_link_libraries(COMPONENT DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT LIBRARY) -target_link_libraries(DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT SIMULATION LIBRARY) -target_link_libraries(DISTURBANCE DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT LIBRARY) -target_link_libraries(SIMULATION DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT DISTURBANCE LIBRARY) -target_link_libraries(GLOBAL_ENVIRONMENT ${CSPICE_LIB} LIBRARY) -target_link_libraries(LOCAL_ENVIRONMENT GLOBAL_ENVIRONMENT ${CSPICE_LIB} LIBRARY) -target_link_libraries(LIBRARY ${NRLMSISE00_LIB}) +target_link_libraries(COMPONENT DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT MATH_PHYSICS SETTING_FILE_READER LOGGER UTILITIES) +target_link_libraries(DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT SIMULATION MATH_PHYSICS) +target_link_libraries(DISTURBANCE DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT MATH_PHYSICS) +target_link_libraries(SIMULATION DYNAMICS GLOBAL_ENVIRONMENT LOCAL_ENVIRONMENT DISTURBANCE MATH_PHYSICS) +target_link_libraries(GLOBAL_ENVIRONMENT ${CSPICE_LIB} MATH_PHYSICS) +target_link_libraries(LOCAL_ENVIRONMENT GLOBAL_ENVIRONMENT ${CSPICE_LIB} MATH_PHYSICS) +target_link_libraries(MATH_PHYSICS ${NRLMSISE00_LIB}) +target_link_libraries(SETTING_FILE_READER INIH) target_link_libraries(${PROJECT_NAME} DYNAMICS) target_link_libraries(${PROJECT_NAME} DISTURBANCE) @@ -235,7 +240,7 @@ if(GOOGLE_TEST) add_executable(${TEST_PROJECT_NAME} ${TEST_FILES}) target_link_libraries(${TEST_PROJECT_NAME} gtest gtest_main gmock) - target_link_libraries(${TEST_PROJECT_NAME} LIBRARY) + target_link_libraries(${TEST_PROJECT_NAME} MATH_PHYSICS) include_directories(${TEST_PROJECT_NAME}) add_test(NAME s2e-test COMMAND ${TEST_PROJECT_NAME}) enable_testing() diff --git a/ExtLibraries/CMakeLists.txt b/ExtLibraries/CMakeLists.txt index d4b66fba9..1723ecb87 100644 --- a/ExtLibraries/CMakeLists.txt +++ b/ExtLibraries/CMakeLists.txt @@ -16,12 +16,16 @@ if(NOT DEFINED EXT_LIB_DIR) set(EXT_LIB_DIR "${CMAKE_CURRENT_LIST_DIR}/../../ExtLibraries/") endif() +if(NOT DEFINED SETTINGS_DIR) + set(SETTINGS_DIR "${CMAKE_CURRENT_LIST_DIR}/../settings/") +endif() + # windows path string(REPLACE "\\" "/" EXT_LIB_DIR ${EXT_LIB_DIR}) +string(REPLACE "\\" "/" SETTINGS_DIR ${SETTINGS_DIR}) message("ExtLibraries install dir: ${EXT_LIB_DIR}") add_subdirectory(nrlmsise00) add_subdirectory(cspice) -add_subdirectory(GeoPotential) add_subdirectory(lunar_gravity_field) diff --git a/ExtLibraries/GeoPotential/CMakeLists.txt b/ExtLibraries/GeoPotential/CMakeLists.txt deleted file mode 100644 index 037c56652..000000000 --- a/ExtLibraries/GeoPotential/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -project(geopotential) - -cmake_minimum_required(VERSION 3.13) - - -set(GEOPOTENTIAL_INSTALL_DIR ${EXT_LIB_DIR}/GeoPotential/) - -## install table -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/egm96_to360.ascii - DESTINATION ${GEOPOTENTIAL_INSTALL_DIR} -) diff --git a/ExtLibraries/cspice/CMakeLists.txt b/ExtLibraries/cspice/CMakeLists.txt index 43b879ee9..68247c39b 100644 --- a/ExtLibraries/cspice/CMakeLists.txt +++ b/ExtLibraries/cspice/CMakeLists.txt @@ -8,6 +8,8 @@ include(FetchContent) set(CSPICE_INSTALL_DIR ${EXT_LIB_DIR}/cspice) set(GENERIC_KERNEL_URL_BASE https://naif.jpl.nasa.gov/pub/naif/generic_kernels) +set(GENERIC_KERNEL_INSTALL_DIR ${SETTINGS_DIR}/environment/cspice) + if(WIN32) # Windows if(BUILD_64BIT) @@ -118,5 +120,5 @@ configure_file( ) install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generic_kernels - DESTINATION ${CSPICE_INSTALL_DIR} + DESTINATION ${GENERIC_KERNEL_INSTALL_DIR} ) diff --git a/ExtLibraries/inih/CMakeLists.txt b/ExtLibraries/inih/CMakeLists.txt new file mode 100644 index 000000000..4b18a7051 --- /dev/null +++ b/ExtLibraries/inih/CMakeLists.txt @@ -0,0 +1,9 @@ +project(INIH) +cmake_minimum_required(VERSION 3.13) + +add_library(${PROJECT_NAME} STATIC + ini.c + cpp/INIReader.cpp +) + +include(../../common.cmake) diff --git a/src/library/external/inih/LICENSE.txt b/ExtLibraries/inih/LICENSE.txt similarity index 100% rename from src/library/external/inih/LICENSE.txt rename to ExtLibraries/inih/LICENSE.txt diff --git a/src/library/external/inih/README.md b/ExtLibraries/inih/README.md similarity index 100% rename from src/library/external/inih/README.md rename to ExtLibraries/inih/README.md diff --git a/src/library/external/inih/cpp/INIReader.cpp b/ExtLibraries/inih/cpp/INIReader.cpp similarity index 100% rename from src/library/external/inih/cpp/INIReader.cpp rename to ExtLibraries/inih/cpp/INIReader.cpp diff --git a/src/library/external/inih/cpp/INIReader.h b/ExtLibraries/inih/cpp/INIReader.h similarity index 100% rename from src/library/external/inih/cpp/INIReader.h rename to ExtLibraries/inih/cpp/INIReader.h diff --git a/src/library/external/inih/ini.c b/ExtLibraries/inih/ini.c similarity index 100% rename from src/library/external/inih/ini.c rename to ExtLibraries/inih/ini.c diff --git a/src/library/external/inih/ini.h b/ExtLibraries/inih/ini.h similarity index 100% rename from src/library/external/inih/ini.h rename to ExtLibraries/inih/ini.h diff --git a/ExtLibraries/lunar_gravity_field/CMakeLists.txt b/ExtLibraries/lunar_gravity_field/CMakeLists.txt index 35a6f92dc..271b1faa9 100644 --- a/ExtLibraries/lunar_gravity_field/CMakeLists.txt +++ b/ExtLibraries/lunar_gravity_field/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.18) include(FetchContent) -set(LUNAR_GRAVITY_FIELD_INSTALL_DIR ${EXT_LIB_DIR}/lunar_gravity_field) +set(LUNAR_GRAVITY_FIELD_INSTALL_DIR ${SETTINGS_DIR}/environment/gravity_field) set(LUNAR_GRAVITY_FIELD_URL_BASE https://pds-geosciences.wustl.edu/grail/grail-l-lgrs-5-rdr-v1/grail_1001/shadr) set(LUNAR_GRAVITY_FIELD_FILE gggrx_1200a_sha.tab) diff --git a/ExtLibraries/nrlmsise00/CMakeLists.txt b/ExtLibraries/nrlmsise00/CMakeLists.txt index 82d3d3787..83502b9c3 100644 --- a/ExtLibraries/nrlmsise00/CMakeLists.txt +++ b/ExtLibraries/nrlmsise00/CMakeLists.txt @@ -6,6 +6,7 @@ include(ExternalProject) include(FetchContent) set(NRLMSISE_INSTALL_DIR ${EXT_LIB_DIR}/nrlmsise00) +set(TABLE_FILE_INSTALL_DIR ${SETTINGS_DIR}/environment/space_weather) set(NRLMSISE_TABLE_URL_BASE ftp://ftp.agi.com/pub/DynamicEarthData) set(NRLMSISE_TABLE_FILE SpaceWeather-v1.2.txt) @@ -90,5 +91,5 @@ install(FILES ${NRLMSISE_TMP_DIR}/nrlmsise-00_data.c ## install table install(FILES ${NRLMSISE_TMP_DIR}/${NRLMSISE_TABLE_FILE} - DESTINATION ${NRLMSISE_INSTALL_DIR}/table + DESTINATION ${TABLE_FILE_INSTALL_DIR} ) diff --git a/common.cmake b/common.cmake index fcc983a70..84163c86a 100644 --- a/common.cmake +++ b/common.cmake @@ -8,7 +8,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${S2E_DIR}/src) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) # Directory path setting -target_compile_definitions(${PROJECT_NAME} PRIVATE "INI_FILE_DIR_FROM_EXE=\"${INI_FILE_DIR_FROM_EXE}\"") +target_compile_definitions(${PROJECT_NAME} PRIVATE "SETTINGS_DIR_FROM_EXE=\"${SETTINGS_DIR_FROM_EXE}\"") target_compile_definitions(${PROJECT_NAME} PRIVATE "EXT_LIB_DIR_FROM_EXE=\"${EXT_LIB_DIR_FROM_EXE}\"") target_compile_definitions(${PROJECT_NAME} PRIVATE "CORE_DIR_FROM_EXE=\"${CORE_DIR_FROM_EXE}\"") diff --git a/data/sample/initialize_files/components/gnss_receiver.ini b/data/sample/initialize_files/components/gnss_receiver.ini deleted file mode 100644 index a17ed683e..000000000 --- a/data/sample/initialize_files/components/gnss_receiver.ini +++ /dev/null @@ -1,43 +0,0 @@ -[GNSS_RECEIVER_1] -prescaler = 10 - -// Position of antenna at body frame [m] -antenna_position_b_m(0) = 0.0125 -antenna_position_b_m(1) = 0.0000 -antenna_position_b_m(2) = 0.1815 - -// Quaternion from body frame to component frame -quaternion_b2c(0) = 0.0 -quaternion_b2c(1) = 0.0 -quaternion_b2c(2) = 0.0 -quaternion_b2c(3) = 1.0 - -// Antenna model -// 0... simple model : GNSS sats are visible when antenna directs anti-earth direction -// 1... cone model : GNSS sats visible when a sat is in a cone -antenna_model = 0 - -// Antenna half width [deg] -antenna_half_width_deg = 60 - -// Number of channels -maximum_channel = 8 - -// GNSS ID -// G...GPS -// R...GLONASS -// E...Galileo -// C...Beidou -// J...QZSS -// if your receiver is compatible with all kind of gnss satellites : GRECJ -// if your receiver is compatible with GPS and QZSS : GJ -gnss_id = G - -//Random noise [m] -white_noise_standard_deviation_eci_m(0) = 10000.0 -white_noise_standard_deviation_eci_m(1) = 1000.0 -white_noise_standard_deviation_eci_m(2) = 1000.0 - -[POWER_PORT] -minimum_voltage_V = 3.3 -assumed_power_consumption_W = 1.0 diff --git a/data/sample/initialize_files/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini b/data/sample/initialize_files/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini deleted file mode 100644 index 0d8a2811e..000000000 --- a/data/sample/initialize_files/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini +++ /dev/null @@ -1,5 +0,0 @@ -[WINGS_COMMAND_SENDER_TO_C2A] -command_send_enable = ENABLE -prescaler = 1 -c2a_command_database_file = ../../data/initialize_files/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv -wings_operation_file = ../../data/initialize_files/components/wings_command_sender_to_c2a/example.ops diff --git a/data/sample/initialize_files/sample_gnss.ini b/data/sample/initialize_files/sample_gnss.ini deleted file mode 100644 index 12eba4b07..000000000 --- a/data/sample/initialize_files/sample_gnss.ini +++ /dev/null @@ -1,67 +0,0 @@ -[GNSS_SATELLITES] -directory_path = EXT_LIB_DIR_FROM_EXE/sp3/ -calculation = DISABLE - -// Choose from IGS, CODE_Final, JAXA_Final, QZSS_Final -true_position_file_sort = IGS - -// As small as possible within the range. -true_position_first = igs21610.sp3 -true_position_last = igs21613.sp3 - -// Choose from 0: Lagrange, 1: Trigonometric : temporarily, only Trigonometric is valid, Lagrange is not yet implemented. -true_position_interpolation_method = 1 - -// If you chose Trigonometric as interpolation method, you must choose odds number here. -true_position_interpolation_number = 9 - -// Choose frome .sp3, .clk_30s or .clk -true_clock_file_extension = .clk_30s - -// Choose from IGS, CODE_Final, JAXA_Final, QZSS_Final -// If you choose clk_30s, should choose the one equivalent to final, if you choose clk should choose the one equivalent to rapid. -true_clock_file_sort = IGS - -// As small as possible within the range. -true_clock_first = igs21610.clk_30s -true_clock_last = igs21613.clk_30s -// The method is fixed with Lagrange interpolation, 3 (quadratic) recommended -true_clock_interpolation_number = 3 - -// -// Estimated value -// -// choose from IGS, IGR, IGU, -// CODE_Final, CODE_Rapid -// JAXA_Final, JAXA_Rapid, JAXA_Ultra_rapid, madocaRT, -// QZSS_Final, QZSS_Rapid, QZSS_Ultra_rapid -estimate_position_file_sort = madocaRT - -// As small as possible within the range. -estimate_position_first = madoca21610.sp3 -estimate_position_last = madoca21613.sp3 - -// choose from 0: Lagrange, 1: Trigonometric : temporarily, only Trigonometric is valid, Lagrange is not yet implemented. -estimate_position_interpolation_method = 1 - -// if you chose Trigonometric as interpolation method, you must choose odds number here. -estimate_position_interpolation_number = 9 - -// choose from IGS, IGR, IGU, -// CODE_Final, CODE_Rapid -// JAXA_Final, JAXA_Rapid, JAXA_Ultra_rapid, madocaRT, -// QZSS_Final, QZSS_Rapid, QZSS_Ultra_rapid -estimate_clock_file_sort = madocaRT - -// choose frome .sp3, .clk_30s or .clk -estimate_clock_file_extension = .sp3 - -// As small as possible within the range. -estimate_clock_first = madoca21610.sp3 -estimate_clock_last = madoca21613.sp3 - -// The method is fixed with Lagrange interpolation, 3 (quadratic) recommended -estimate_clock_interpolation_number = 3 - -// when you use Ultra Rapid Product, you can choose "observe" or "predict" -estimate_ur_observe_or_predict = observe diff --git a/data/sample/initialize_files/sample_ground_station.ini b/data/sample/initialize_files/sample_ground_station.ini deleted file mode 100644 index ab57e1164..000000000 --- a/data/sample/initialize_files/sample_ground_station.ini +++ /dev/null @@ -1,12 +0,0 @@ -[GROUND_STATION_0] -// Position of the ground station -latitude_deg = 26.140837 -longitude_deg = 127.661483 -height_m = 3.4 - -// The minimum limit of elevation to work the station -elevation_limit_angle_deg = 5.0 - -[COMPONENT_FILES] -ground_station_antenna_file = INI_FILE_DIR_FROM_EXE/components/ground_station_antenna.ini -ground_station_calculator_file = INI_FILE_DIR_FROM_EXE/components/ground_station_calculator.ini diff --git a/data/sample/logs/.gitkeep b/logs/.gitkeep similarity index 100% rename from data/sample/logs/.gitkeep rename to logs/.gitkeep diff --git a/scripts/Common/download_HIPcatalogue.sh b/scripts/Common/download_HIPcatalogue.sh index 84f5f00ed..8afea5f12 100755 --- a/scripts/Common/download_HIPcatalogue.sh +++ b/scripts/Common/download_HIPcatalogue.sh @@ -2,8 +2,8 @@ cd `dirname $0` #set variables -DIR_TMP=../../../ExtLibraries/tmp_hipcatalogue/ -DIR_HIPCATALOGUE=../../../ExtLibraries/HipparcosCatalogue/ +DIR_TMP=./tmp_hipcatalogue/ +DIR_HIPCATALOGUE=../../settings/environment/star_catalogue/ mkdir -p $DIR_TMP mkdir -p $DIR_HIPCATALOGUE diff --git a/scripts/Plot/Pipfile b/scripts/Plot/Pipfile index 0ac47709e..4b2737a08 100644 --- a/scripts/Plot/Pipfile +++ b/scripts/Plot/Pipfile @@ -4,13 +4,13 @@ verify_ssl = true name = "pypi" [packages] -basemap = "==1.3.8" +basemap = "==1.4.1" matplotlib = "==3.7.2" numpy = "==1.24.3" pandas = "==2.0.3" -numpy-stl = "==3.0.1" -numpy-quaternion = "*" -python-utils = "*" +numpy-stl = "==3.1.2" +numpy-quaternion = "==2023.0.4" +python-utils = "==3.5.2" [dev-packages] diff --git a/scripts/Plot/Pipfile.lock b/scripts/Plot/Pipfile.lock index ac3234fd8..426831690 100644 --- a/scripts/Plot/Pipfile.lock +++ b/scripts/Plot/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "357494dffe97400cf2bc676a3b06b4f956da6ee0af7c0063f76efac2c8a67e5a" + "sha256": "c94693aa0122b4dd9d16b46736bce49f6d7b910a0b1765e86dc1ba5b3274bd8a" }, "pipfile-spec": 6, "requires": { @@ -18,43 +18,55 @@ "default": { "basemap": { "hashes": [ - "sha256:023685d28026edf9dde9cf9657a6b679e50b56e59e9472e707031488d3d60005", - "sha256:09de25d4c3203764eeb1080bfea287c4faf4727e4c4975d5d3408be4d19531d9", - "sha256:0e83a5296df52fa49dbf5b5a99cd8bb8ae255c0ead732efc29d74b9f7c5fec67", - "sha256:1fb16ef8fec2f030869254b7f899784cbbfdb84958bc29978d0a1f82d998486e", - "sha256:21eaa5ac3f7b9d4cba3fe9e929b370882bd42f0eab0ab8136e41eed4dea9627d", - "sha256:338d013ac6e2e7c6c823ddfae47a45793e0591a28bdaf33817701413b74beae6", - "sha256:374a5409afa4bc2890a1caccd552c1e01beec533853113980661f302d32aaee8", - "sha256:39c6f86dc17507a5a5c704fa9287841cf09fbbb44d00987888202a5811b471e6", - "sha256:419f610eb5e60749b61c4916d5635bbd3a35e5c23ab2596bc28e54ec212cfc36", - "sha256:4955cfce26bc23e0d69f0cc899cbeea72a7a4a59564d535309b16ea189a2d8bc", - "sha256:4c954a2b6d584e38f27ac9488740db71c3bed63defe3d8535a6a5023f835492c", - "sha256:4febd21e387fef09a188dc21af71f64bf30c765a003a698298e23bb8eaa8278c", - "sha256:5a3f4df4f21fd7e6a3d9c58b24b88067335f6187d1ee13d0c836472c5cddd290", - "sha256:5f3479a0207d40a61165702d5890a0313c16f84f16320353044b51e8b1ca1df3", - "sha256:712ae874daa5f172d135b98202e5bdd4ff23e37a52ae20c39a76d14165d569c5", - "sha256:8046ea3f8c3bc0ba8edba10bf4e81138cc29ad10b78b5912434eb61faa1e4906", - "sha256:8354c97ff3475372e36ae45409c4b1ccd28f3d85d1d50378fad380321d804cf2", - "sha256:8420bbc53ebf5371eefa41edb8feb222e0da2962697238c612118cf2e90ce579", - "sha256:87673784f9b1f0fde499c3d39cd8f2a0c3d750b04aab735cb07aebd08b324c44", - "sha256:8ac329b4e8e9d68ed163113906817945bcc22d1c9f7584f801e74ba3bb0b70d1", - "sha256:9288bd57ceb8e25a905f49cb188ceea9878b92d8662bb317084ebd9f267c619c", - "sha256:9d8273d86565ad3d1fc41cb3109c22f86e0e6c74f395d71ffcfc0e32299bdf0d", - "sha256:a602013ecbe75a0169f827c983ad467e01d3794df545d8b5a044d113cc5f121f", - "sha256:ac54a6d58fc79be8d2df2bbf13aa8700e3e9921dc80633ae41d8cd53a60a6f96", - "sha256:aeabd63727be00145594936c4341f5aabc699ab2c4c53fd49147cc12e39e5471", - "sha256:b004e5d1d1b2335f49099b8ca6799418bf617f12a98d32e45a4d45b6efe13f5c", - "sha256:b2392c83d047a28d6e48d5ac6217916be898abbc4ca2baba4fb5e340337769cc", - "sha256:b541a357dac7770916841fa2b0382330a724b16aa7570edfcd1ad1f476775ca0", - "sha256:b76a24606d4633b453f6953cd81c17f0aa49dcf26d011d104f144af9fac73a74", - "sha256:bec93bf7d19bc9e8427c5d0ba8644d43b10f236dc72f1ff2af5d747b2f41a214", - "sha256:c3362f1cb8139f95a2c849001de361fe2e57714393353982ba892f87e93f6c02", - "sha256:d3ab86726a2a1f8067740ba71051b1c539adbb2972aa970e5dc65def90b25c09", - "sha256:efdb669ff0b84511f1d12e78139fff7069260b30baeff36019f56915d9e9e7fb" + "sha256:1cb70fe82ea9f49ee6df2ecafeade1e9ef4d5654a3e5c2b6f1b50bbfcfada33a", + "sha256:20644986a63d57c9d94afb8aba180d5362c1bd08d61d4537aa6221a70e3df762", + "sha256:22793cf731d6cc06e11cf2760fd2875cd18b2980ce1c5ba15f6ebd9e224b1a1d", + "sha256:2985d8d937427a20868dc18cd677bd6a6b4b94efc1b33ab29706d4e0dac418cf", + "sha256:2e198e442bae7ad0d25f529788fcb5802192d844d856fa966f6018a46648a375", + "sha256:353b2d02bd70fd48b3d0e146a028862b7d9e09ffb7995c70151fb80607a2df25", + "sha256:355c984cbde3f098cac49f41e2ab0bbbd49091770eeb58486a001f9ee865f725", + "sha256:3752eec899129a6645170fb1e7a16d0263f8ed2691f9f37916ecb19a2947ab72", + "sha256:427a2050dcfbbde5bb4421f87b3f594852160029f8bbdf8d0fff81ad554de2f4", + "sha256:4fb6763f4f2bb904fea0afbd8194f14af0b01fb52d719be35dd4b423e8d8dca2", + "sha256:500a3d314166057d0b3c065e63147042c996ead1af5d59e319f813b83d4ea220", + "sha256:509bb451ce26f1f7651cc19d27ef049935304c7795a141cfbe05582802554226", + "sha256:51a5e8f2183e7505f4dfbb965048348c2f1e501283b13ad9950409c3da9655f6", + "sha256:5c50fa14a71d115a7614b3a659f14d1e65dbf43dbcbedae0c901058860806f5b", + "sha256:650e9b2170579193cb89bea2c328740fc13c0327b8ea55173490f760d0f04f8c", + "sha256:669d89621f8c7899c061fcf37bc32df24ebeaf5eb0a02b9d9b9896ca6698f6de", + "sha256:6822d3d08c11cdc443e3ed01d61d512e7cf62d4b40bbc1d235f0a898f2c54a7a", + "sha256:6e0a13ba17ca011c55db44fab9210363154bc67482776d3b149a3ef1b4b01bad", + "sha256:7b58e500413dbe655127bbe9da82c9d175eadd130ed66b6a9efea8d46b65881b", + "sha256:7f99f3da41fc3e6bfb726f0fbd3302939a3b03e353ccd2be5ebd7bc09b84c386", + "sha256:84918a6e030adc9aedee92fe622adde8b54cc81051a6ce6723c04987081d92f4", + "sha256:87091beba0e5f6cfc416d1847a582645b2447cd6bf1e8c4ceaabd98d3493ef41", + "sha256:8818fbb5e1133f0955a62ea159a3792124fc06f9b37ea4427612f6def923b711", + "sha256:91d03458343d73f6a5e4d42e79df59cf57eba699094b71ce7c57ec40c8de9f59", + "sha256:a6860ab68a461cd36b6eda5d3973bfa1e3a4fdeaf608e8dd4b324b08e8561eed", + "sha256:a8786f23e3f456ab402b8160efb7b8b1c3780d6b84154dfcfdcd3f0401ef3285", + "sha256:ad169a9ca573752867b136b62ac70cc12ab0ce86e3c69d57e924eaa21b5f5ec7", + "sha256:b196ae9446183deaaedfbd2e757d3edf23225584ce1a47b795cba96febd6acdf", + "sha256:b64f000374a41bf19ac8f8b39cbd2a3b244c79673cd686c9eb507c19daef9e78", + "sha256:b9679c4cacc9af04d9cedb9afd01b9c85bc12df1c8f9685147500e91a33ad5a8", + "sha256:be103ef8c2cb1e7363e3ab48ae633ec2643f0b8a9226d119ec8681096b81335c", + "sha256:c4d80330f00728acfd88be78e0485fd688984db873853f9c75647ec78e653203", + "sha256:c76d77ac21b6fb5008ca0283c6f86d24bf7ed6d0d18867edcfc534748cf348b5", + "sha256:c93beda915b0b68e74a8eec986313e4758a0caa1bd57fee8660362c82f78b26f", + "sha256:d1600576b21a37883992d5bff0c4485e5468a14fe2df7616e08824103b21465d", + "sha256:d273b628adb276200eb9b97f6175f9145b8a280d55d995869ec4bb3c561021c2", + "sha256:d56d7ed588a5ca5d364b42c73c933258d394c10b3c4dc224e7d31bb41a6fbef5", + "sha256:e20adfa6e77f367567d0389fb1da8ed6ea0ca9e871fd9fec7cfdc2de78495b99", + "sha256:e3345544d530248fa4b4fb89f4b9f93219bffa5983b83f00e42b55b5abf615e8", + "sha256:e6b8430a4f73485fcdb766cd2acb9e766cdacc67adca7757e7a2915b685d8461", + "sha256:f448cfeb0090d4f53f1381c8019c3841e621b7b14df3816172ee72385c35b8b0", + "sha256:f88ecab0468121d94e67e9497329cd2207dd2c7bf9a4779433cedc9cf6ab86f4", + "sha256:ff588f63f35d0b58607c9642cc2cf68967b464ee7aa27a6d87db2ec8edc910e2", + "sha256:ff7b29d1920c77da51386d5767674c498bbdea822a1b51fda3d25a3be8c066d2", + "sha256:ffe185bc4be347b0dc8ad68d2085ec699a558357d6019b5daf6465b6bbdf793d" ], "index": "pypi", - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", - "version": "==1.3.8" + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '3.13'", + "version": "==1.4.1" }, "basemap-data": { "hashes": [ @@ -66,11 +78,11 @@ }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2024.7.4" }, "contourpy": { "hashes": [ @@ -132,67 +144,67 @@ }, "cycler": { "hashes": [ - "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947", - "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a" + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" ], "markers": "python_version >= '3.8'", - "version": "==0.12.0" + "version": "==0.12.1" }, "fonttools": { "hashes": [ - "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836", - "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38", - "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a", - "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef", - "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e", - "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803", - "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f", - "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe", - "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92", - "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1", - "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7", - "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92", - "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662", - "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186", - "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da", - "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c", - "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69", - "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348", - "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb", - "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213", - "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e", - "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f", - "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3", - "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3", - "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3", - "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646", - "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef", - "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126", - "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce", - "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9", - "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1", - "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a", - "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e", - "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84", - "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544", - "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465", - "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd", - "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289", - "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384", - "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1", - "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64", - "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f" + "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", + "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", + "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", + "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", + "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", + "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", + "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", + "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", + "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", + "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", + "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", + "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", + "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", + "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", + "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", + "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", + "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", + "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", + "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", + "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", + "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", + "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", + "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", + "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", + "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", + "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", + "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", + "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", + "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", + "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", + "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", + "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", + "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", + "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", + "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", + "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", + "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", + "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", + "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", + "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", + "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", + "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" ], "markers": "python_version >= '3.8'", - "version": "==4.43.0" + "version": "==4.53.1" }, "importlib-resources": { "hashes": [ - "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9", - "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83" + "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c", + "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145" ], "markers": "python_version < '3.10'", - "version": "==6.1.0" + "version": "==6.4.0" }, "kiwisolver": { "hashes": [ @@ -389,66 +401,74 @@ }, "numpy-quaternion": { "hashes": [ - "sha256:0fc5aed22a2170eb2c65aa3a0d10c08883ec9fdc35d10c110d38811f736d609a", - "sha256:158df059771f5c2baa2fa43f166be30c0507aacea7df1c6fd67eb4c404b3fae3", - "sha256:1a82205a785be37c1a2ae28dd13c02a6aaf43e7a1f3ac4cb57f6efc2d2e5d8a1", - "sha256:1ebd03fb341ae3f837d6d9d96df25b1c4bc0dafd9ffcb562eebdae29496f175e", - "sha256:2ebb925346ee4a7c1ac3d9d00383950ad610d7cc672445b7b7f67e0a3a03df40", - "sha256:334376b88dcede4263f1338b4ab40e1124c7a8fc8f81e3c3e1070cc0f5da10a7", - "sha256:364c142af3ba8aac3ee6de9ab652a409133d23d81642c18fae150585b006cf85", - "sha256:3c7de12e8270e6b4fa7da9da372134a56a85eebbb1b1d81e8419e8315cea7227", - "sha256:4605a23c57fead0c20623e55b473fa233b082b5ed4d83553da6c2cb83541f428", - "sha256:4b685200964fd9e654c12cc298d5d086ef0a0313ee2b17d6b9ff29a3a880d803", - "sha256:4f07823341642943d24cddc10f07cb4e32e10f5cc033fb42aa2f181e8bf0699f", - "sha256:53bcaa3c0fb245623a092eb43224e30b883882b3460143487cccf9797fc865ae", - "sha256:556c32f082bb97aab9f41f7154b4d7f004a22c3187f056e78d17bf818644804f", - "sha256:5d9e6bec15afeba28022b7a44fdf28da27fd0422075b76be99c5be70969d52e6", - "sha256:71a5f6fbf64001369f178168a46287dce33157947272073258d20e846b0f40a4", - "sha256:75c734f4b3f887f465da3571afeff924781f53dbf39c8da199fb860b9f4dc3ec", - "sha256:7cfec847bca62ff2ff50b190fb0e7c733a0f7f42ce6ac6385166bf6c814d5b15", - "sha256:7d97d22a082caa924f2ebd998563437884e1f578c5cdb8ba001abc60d2909922", - "sha256:7e7c36d949d09e07bd091bae1cb7c56b7dcedfb2c570f89e75be6de9f37d44a6", - "sha256:8761f80fc4f510147bf690d494668f0944a2d590e2c5ada9d7c62af6a46e81ad", - "sha256:8d635131afbd49dafa9463c78bf1a298c9de35cc759e6008647c714780e68de7", - "sha256:9a7fcf818691aec1250f53c99c7958f57e09489e5ce1371b3a5342b65439da9d", - "sha256:9b17ebddb0bd3fe646fc56b0e8693a92561e704be541bc3dcb4282988ebb01ed", - "sha256:9ebf377c7174f4b32e1078e4607afbb3c4e0d0365dc633d43654f01e3703e800", - "sha256:a0aaa74a13799e13bb9b6a65964401260f7a5482d2f7e50f5e564c8866f8b96f", - "sha256:a3b4ed4ca225c7f5965ddc18a8cba0f7ea8406a869872d18d1f9900420ebdd38", - "sha256:a4db146a130d53cea5d74543950e5ebd01dd7603dfe5a42d4f3ebc76539551bb", - "sha256:accbe7758561a4bb3bd486b5f754b9983bc1be17ee517feb715d7e363833407f", - "sha256:c403eeddfc19cb3b400abbd6daabd9aec9843344e9b9c739f080d27291e3d75e", - "sha256:c521e6ee255c74f1ef604bd8ebdfdc32225d9ac7ce52c731562d4b4e01358793", - "sha256:c5f13b7faa8b9859fba94f1425d9ac6478d74fa2b26f5cb0b8258a48365ee49b", - "sha256:ca29e8f961673932d123a8b2520ef7ded9fee4e426aed628d90ced0749608285", - "sha256:ca37256f544a7e587ab08c1841a30e34aa7b85c7c9663527c61d77fbcad9dda7", - "sha256:ca743f7ca7a86b555cfc7e9f72acb7eb50fd56ec28834432b54b00896ba6363a", - "sha256:ccf9b0fc0e6b2a1f6c5a0bf2e5affbc588cc09d5ba585d176bd92e9f4bdfd7a1", - "sha256:ce50c414e884d8d18615cb6b5c928929e9dcff2f98f4606b2cc7a5b4dd5f5fb4", - "sha256:d35e7bdc02025601d21830c6419e1317059083e1a3ccab68df5113b167e3fc61", - "sha256:ded4c4122481b465e46374d9087da280d712d7ea500b34fc03ae854cfc3c86b5", - "sha256:e34ed9c325dcd631b67dcf30b6f493528228622bc8b8b9abfaf68166fc367151", - "sha256:e4b28a372b1362b75a23d3abf08fcc5a77c950aa554136137c5f2cd5d3a45edb", - "sha256:f9a7ed1ee9954e06e81847600eefa11d162e9cbbd386a0c693f0f681ec731133" + "sha256:0d3003987bfb309aa2cad3ca47e74845abd7cce350d04f0e15d122d4d327b26f", + "sha256:0dfc980395e230b3ec0ab764ee9417c580efc38e6cb1774f8c81385ecf562e8d", + "sha256:16c13173031d7fa4570418078c63e4a83119c863c5e0201f366738a551c6799d", + "sha256:2154b5e96a3214aab3949215216800a101fc5ad9740ab647d0f0790bca5c0213", + "sha256:217d8a93e52ebd765409729818988d752254e1fe850702069901516d8ea4c4bf", + "sha256:22ad06898f7179320043f7c8d1937cca7ffd982e8ed39e4e2cb39392e52bf302", + "sha256:25bae3075737cf9a37445b3bff792aefd87f7626aeafe399a5c5ab0c8e56df61", + "sha256:3148f93231ff80d32772bbea78d223ce1766acf69227bd64ca8667ad41ffd6f0", + "sha256:31e910858a344f1cf03f3ed3ee05bfd156c7a58db0d09cbadd4581aee163000b", + "sha256:342d0d7c12e657adee7898b299c20dc75e1f5ea50dbd38b5df7f146304808d5b", + "sha256:4925a1b1f4e59c2977fffe5098de0cfed0fa72fe4c2335499abd3c8e6a068fb3", + "sha256:4ab31a89c9c36b2bc147181e2dda8192cb92f53bd722af41667bb3d472270719", + "sha256:4b17971d99fb69d9491ef0642a8e08197ea73e786cb0f3020ae072358829e726", + "sha256:4b7b97c2be631ea2aa4b8a1061d06562839ae92f4b27c7e66315121ceaeef438", + "sha256:55ed2432c0d4b2fb713f0508db49970b13f73082887267b84c75a29a816abd77", + "sha256:5853f768f368d8f5f5048043ee8bef8a950a3ec6b092b5a161d77fa335356419", + "sha256:619d708553394062b22089e7d89b5918f4df3d77c9c3a9906f0c80590b1221eb", + "sha256:65c7c100cb673c67f56e8457800c6e183013c7b68e940f03ad02a8f254704f2b", + "sha256:6953697db28fa26df84dbc484abd827ac0d258055c14387ebd0592b1e3d36ae0", + "sha256:6c9dff45ba0a7825ffa27bce13ffa5ca09e5353a4e86a3168d58726780241495", + "sha256:6e6ca6f7d0de9499ba33c62a606ddeb625cad146ddd987c8045d35d85c104d08", + "sha256:71406dc86f741d3f8edcd14a0713b4cbda676d151b77feb640110a5c8642977c", + "sha256:752289acf14e3261e201f11fab9a0d0dedc0c6fa192d3e1d61758a50d3781391", + "sha256:7c8640368cf93a78939e0998aad147ab8f644dc12e4ac096b3cb431874e1c12b", + "sha256:7f764215c381c2b9d03706023a2a2971fa802af9c2f1c54bfe23cdfe5053c14a", + "sha256:880895358b8905a25e6c7e9db76ca03e9e0e91f1b36574d148b4c04c9e0a6dfd", + "sha256:8902b9244cd1a71fb2a0aca1c756450cf876cddf2e2677ece1796dddad3d4146", + "sha256:8e2d87f24a1ec916a8ee708bd067e1ee8dbaa6c472c65e58e2446728462bcec4", + "sha256:98ac68abe59cd716c6cdf56a525af81d8acc6f01d410f386f46898413b0d5591", + "sha256:9ae88f756e247ed5a5e0eca2d106f11b5764360c23536ba91616b7ad36194082", + "sha256:a5d03e5f11247acd55425b28bc855905bbe1ea7e564d60782252708ea1721383", + "sha256:aa33960c7ae0a203f1d04d3ed3458200f56be76d81d2d6124c969b1262376d05", + "sha256:b0bee91d05e276d216c8bd4b63e9f798e3a913e84d50975745cfa30b0b36b25a", + "sha256:b57fdc1b3fc1dd0961430518ea0929a6ab671cc786942377fbf34f748f6308c7", + "sha256:b6001d43b3ef6f15ba402cfeec5cabe654c87b458e8b899852b59be60ccddb2f", + "sha256:b80103dd3bc0d02d5cc13003fb721bc14e234595c2dd796f799971c02889f001", + "sha256:bf08ab32d8f8b05c9c00b28aea0f83ae6eae7773d4a6218575223f8de3a92908", + "sha256:c6fd1f8c8f74637cc1660e1f8b6121b640c2061aac0237cf32021960d80e4d5e", + "sha256:c9726d8d7bfde2ccf1b4b74922d3e59f96c7592591f92b6bea6f7d28d55edbd6", + "sha256:caff96a569605051c5cd485c933d0ae6ee5edc2332cc2004982d7066376defb8", + "sha256:cc68674de1090f2000dce84c5a807294e286136accb2509a8df205e479a79bcd", + "sha256:d03b38f95e33198bb1c2aa055faa7b1998cf83e4ea65d4071016c9fb78fe2ad0", + "sha256:d157e4eadb1eedbc050b98110748fa09af11dd0bcffd9c3ccf93fe7b3b98ce1e", + "sha256:d4401fd3310853a49198a44e88b2c9d4e064538b9d8c7326fe407d3a448cb780", + "sha256:d85ce3c582569d52d5133c29a9b63e12ec457ba47dd188133b7b30857db4f1a8", + "sha256:e90fcf750786ea3e55e33e52e5e2baac334a1102a8719b2d06cff71a96b34c3c", + "sha256:ebaf1b7f5b1fce8b0fbc0ff1a48abede595f2f734168f1a48843a77ae617113f", + "sha256:fa427d0e309ff3d97fbe03c7e23024f601ddf5dc5b7ca1e7ace644d77aafae85", + "sha256:fac5766180b2098488d84490a49ea21c835d786ab7a068f9791ed848d806973c" ], "index": "pypi", - "version": "==2022.4.3" + "version": "==2023.0.4" }, "numpy-stl": { "hashes": [ - "sha256:cd2c4b0032756bb1488559d507825b0dd8d5c2ac4a68638c2145387b2f804691", - "sha256:dd4da1a379d2632f168518be8dcd9cddd7edc6c3238094fd8d21476b3586a0bc" + "sha256:72b46950dfa3642df1c7b873cfa78a548533724b907478c567db42fdf57ee3d2", + "sha256:a55288340c837378bf44753a1c595c6823312995acda97f27ed04db4ff1d25f3" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.0.1" + "version": "==3.1.2" }, "packaging": { "hashes": [ "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], - "markers": "python_version >= '3.7'", + "markers": "python_version >= '3.5'", "version": "==23.2" }, "pandas": { @@ -485,64 +505,89 @@ }, "pillow": { "hashes": [ - "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff", - "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f", - "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21", - "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635", - "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a", - "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f", - "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1", - "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d", - "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db", - "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849", - "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7", - "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876", - "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3", - "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317", - "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91", - "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d", - "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b", - "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd", - "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed", - "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500", - "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7", - "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a", - "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a", - "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0", - "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf", - "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f", - "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1", - "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088", - "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971", - "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a", - "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205", - "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54", - "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08", - "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21", - "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d", - "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08", - "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e", - "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf", - "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b", - "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145", - "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2", - "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d", - "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d", - "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf", - "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad", - "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d", - "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1", - "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4", - "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2", - "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19", - "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37", - "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4", - "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68", - "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1" + "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", + "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", + "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", + "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", + "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", + "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", + "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", + "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", + "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", + "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", + "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", + "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", + "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", + "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", + "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", + "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", + "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", + "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", + "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", + "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", + "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", + "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", + "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", + "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", + "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", + "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", + "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", + "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", + "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", + "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", + "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", + "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", + "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", + "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", + "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", + "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", + "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", + "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", + "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", + "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", + "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", + "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", + "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", + "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", + "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", + "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", + "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", + "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", + "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", + "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", + "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", + "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", + "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", + "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", + "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", + "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", + "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", + "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", + "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", + "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", + "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", + "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", + "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", + "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", + "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", + "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", + "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", + "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", + "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", + "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", + "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", + "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", + "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", + "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", + "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", + "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", + "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", + "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", + "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", + "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" ], - "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==10.0.1" + "version": "==10.4.0" }, "pyparsing": { "hashes": [ @@ -603,27 +648,27 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "python-utils": { "hashes": [ - "sha256:1970468fff1c0adbd60b9a751e6a786223a9f0373c954571912d9cf4be49b552", - "sha256:e31c1187168c314c984932e99c2d3f973465443493869ae041dd9e2e18e998aa" + "sha256:68198854fc276bc4b2403b261703c218e01ef564dcb072a7096ed9ea7aa5130c", + "sha256:8bfefc3430f1c48408fa0e5958eee51d39840a5a987c2181a579e99ab6fe5ca6" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.7.0" + "markers": "python_version >= '3.7'", + "version": "==3.5.2" }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "version": "==2023.3.post1" + "version": "==2024.1" }, "six": { "hashes": [ @@ -633,29 +678,21 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "typing-extensions": { - "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" - ], - "markers": "python_version >= '3.8'", - "version": "==4.8.0" - }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" ], "markers": "python_version >= '2'", - "version": "==2023.3" + "version": "==2024.1" }, "zipp": { "hashes": [ - "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", - "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" + "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" ], "markers": "python_version < '3.10'", - "version": "==3.17.0" + "version": "==3.19.2" } }, "develop": {} diff --git a/scripts/Plot/common.py b/scripts/Plot/common.py index d53e6a8a3..c8a3510cb 100644 --- a/scripts/Plot/common.py +++ b/scripts/Plot/common.py @@ -53,7 +53,7 @@ def read_scalar_from_csv(read_file_name, header_name): return vector def add_log_file_arguments(aparser): - aparser.add_argument('--logs-dir', type=str, help='logs directory like "../../data/sample/logs"', default='../../data/sample/logs') + aparser.add_argument('--logs-dir', type=str, help='logs directory like "../../logs"', default='../../logs') aparser.add_argument('--file-tag', type=str, help='log file tag like 220627_142946') return aparser diff --git a/scripts/Plot/plot_euler_angle_cantilever_observer.py b/scripts/Plot/plot_euler_angle_cantilever_observer.py new file mode 100644 index 000000000..975d7fc7f --- /dev/null +++ b/scripts/Plot/plot_euler_angle_cantilever_observer.py @@ -0,0 +1,75 @@ +# +# Plot Euler Angle of Cantilever Observer +# +# arg[1] : read_file_tag : time tag for default CSV output log file. ex. 220627_142946 +# + +# +# Import +# +# plots +import matplotlib.pyplot as plt +# local function +from common import find_latest_log_tag +from common import add_log_file_arguments +from common import read_3d_vector_from_csv +from common import read_scalar_from_csv +# arguments +import argparse + +# Arguments +aparser = argparse.ArgumentParser() +aparser = add_log_file_arguments(aparser) +aparser.add_argument('--no-gui', action='store_true') +args = aparser.parse_args() + +# +# Read Arguments +# +# log file path +path_to_logs = args.logs_dir + +read_file_tag = args.file_tag +if read_file_tag == None: + print("file tag does not found. use latest.") + read_file_tag = find_latest_log_tag(path_to_logs) + +print("log: " + read_file_tag) + +# +# CSV file name +# +read_file_name = path_to_logs + '/' + 'logs_' + read_file_tag + '/' + read_file_tag + '_default.csv' + +# +# Data read and edit +# +# Read S2E CSV +time = read_scalar_from_csv(read_file_name, 'elapsed_time[s]') + +euler_angle_cantilever_rad = read_3d_vector_from_csv(read_file_name, 'euler_angular_cantilever_c', 'rad') + +# +# Plot +# +unit = ' rad' + +fig, axis = plt.subplots(3, 1, squeeze = False, tight_layout = True, sharex = True) +axis[0, 0].plot(time[0][0:1200], euler_angle_cantilever_rad[0][0:1200], c="orange", label="TRUE-X") +axis[0, 0].legend(loc = 'upper right') + +axis[1, 0].plot(time[0][0:1200], euler_angle_cantilever_rad[1][0:1200], c="green", label="TRUE-Y") +axis[1, 0].legend(loc = 'upper right') + +axis[2, 0].plot(time[0][0:1200], euler_angle_cantilever_rad[2][0:1200], c="blue", label="TRUE-Z") +axis[2, 0].legend(loc = 'upper right') + +fig.suptitle("Euler Angle Observer") +fig.supylabel("Euler Angle [" + unit + "]") +fig.supxlabel("Time [s]") + +# Data save +if args.no_gui: + plt.savefig(read_file_tag + "_angular_velocity_observer.png") # save last figure only +else: + plt.show() diff --git a/scripts/Plot/plot_gnss_receiver.py b/scripts/Plot/plot_gnss_receiver.py index d650c18b3..430a17f3c 100644 --- a/scripts/Plot/plot_gnss_receiver.py +++ b/scripts/Plot/plot_gnss_receiver.py @@ -49,14 +49,14 @@ # Read S2E CSV time = read_scalar_from_csv(read_file_name, 'elapsed_time[s]') -measured_position_eci_m = read_3d_vector_from_csv(read_file_name, 'gnss_receiver1_measured_position_eci', 'm') -true_position_eci_m = read_3d_vector_from_csv(read_file_name, 'spacecraft_position_i', 'm') +measured_position_ecef_m = read_3d_vector_from_csv(read_file_name, 'gnss_receiver1_measured_position_ecef', 'm') +true_position_ecef_m = read_3d_vector_from_csv(read_file_name, 'spacecraft_position_ecef', 'm') number_of_visible_satellites = read_scalar_from_csv(read_file_name, 'gnss_receiver1_number_of_visible_satellites') satellite_visible_flag = read_scalar_from_csv(read_file_name, 'gnss_receiver1_satellite_visible_flag') # Statistics -error_m = measured_position_eci_m[:, 1:] - true_position_eci_m[:, 1:] +error_m = measured_position_ecef_m[:, 1:] - true_position_ecef_m[:, 1:] average = [0.0, 0.0, 0.0] standard_deviation = [0.0, 0.0, 0.0] for i in range(3): @@ -68,20 +68,20 @@ # unit = ' m' fig, axis = plt.subplots(5, 1, squeeze = False, tight_layout = True, sharex = True) -axis[0, 0].plot(time[0], measured_position_eci_m[0], marker=".", c="red", label="MEASURED-X") -axis[0, 0].plot(time[0], true_position_eci_m[0], marker=".", c="orange", label="TRUE-X") +axis[0, 0].plot(time[0], measured_position_ecef_m[0], marker=".", c="red", label="MEASURED-X") +axis[0, 0].plot(time[0], true_position_ecef_m[0], marker=".", c="orange", label="TRUE-X") axis[0, 0].text(0.01, 0.99, "Error average:" + format(average[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) axis[0, 0].text(0.01, 0.79, "Standard deviation:" + format(standard_deviation[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) axis[0, 0].legend(loc = 'upper right') -axis[1, 0].plot(time[0], measured_position_eci_m[1], marker=".", c="green", label="MEASURED-Y") -axis[1, 0].plot(time[0], true_position_eci_m[1], marker=".", c="yellow", label="TRUE-Y") +axis[1, 0].plot(time[0], measured_position_ecef_m[1], marker=".", c="green", label="MEASURED-Y") +axis[1, 0].plot(time[0], true_position_ecef_m[1], marker=".", c="yellow", label="TRUE-Y") axis[1, 0].text(0.01, 0.99, "Error average:" + format(average[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) axis[1, 0].text(0.01, 0.79, "Standard deviation:" + format(standard_deviation[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) axis[1, 0].legend(loc = 'upper right') -axis[2, 0].plot(time[0], measured_position_eci_m[2], marker=".", c="blue", label="MEASURED-Z") -axis[2, 0].plot(time[0], true_position_eci_m[2], marker=".", c="purple", label="TRUE-Z") +axis[2, 0].plot(time[0], measured_position_ecef_m[2], marker=".", c="blue", label="MEASURED-Z") +axis[2, 0].plot(time[0], true_position_ecef_m[2], marker=".", c="purple", label="TRUE-Z") axis[2, 0].text(0.01, 0.99, "Error average:" + format(average[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) axis[2, 0].text(0.01, 0.79, "Standard deviation:" + format(standard_deviation[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) axis[2, 0].legend(loc = 'upper right') @@ -94,7 +94,7 @@ axis[4, 0].legend(loc = 'upper right') axis[4, 0].set_ylim(0, max(number_of_visible_satellites[0]) + 2) -fig.suptitle("GNSS Receiver Spacecraft position @ ECI") +fig.suptitle("GNSS Receiver Spacecraft position @ ECEF") fig.supylabel("Position [m]") fig.supxlabel("Time [s]") diff --git a/scripts/Plot/plot_gnss_satellites.py b/scripts/Plot/plot_gnss_satellites.py index 570e071e0..e9f817578 100644 --- a/scripts/Plot/plot_gnss_satellites.py +++ b/scripts/Plot/plot_gnss_satellites.py @@ -66,12 +66,12 @@ plt.figure(1) for gps_idx in range(32): gps_str = 'GPS' + str(gps_idx) - clock = read_scalar_from_csv(read_file_name, gps_str + '_clock_offset[m]') + clock = read_scalar_from_csv(read_file_name, gps_str + '_clock_offset[s]') plt.plot(time[0], clock[0], marker=".", label=gps_str) plt.title("GPS Clock Offset") plt.xlabel("Time [s]") -plt.ylabel("Clock Offset [m]") +plt.ylabel("Clock Offset [s]") plt.legend(fontsize=7, loc="upper right") # Data save diff --git a/scripts/Plot/plot_gs_visibility.py b/scripts/Plot/plot_gs_visibility.py index 1cd0ee8cc..ff218a93a 100644 --- a/scripts/Plot/plot_gs_visibility.py +++ b/scripts/Plot/plot_gs_visibility.py @@ -43,7 +43,7 @@ print("log: " + read_file_tag) # Read Gound Station position from the ini file in the logs directory -gs_ini_file_name = path_to_logs + '/' + 'logs_' + read_file_tag + "/sample_ground_station.ini" +gs_ini_file_name = path_to_logs + '/' + 'logs_' + read_file_tag + "/ground_station.ini" configur = ConfigParser(comment_prefixes=('#', ';', '//'), inline_comment_prefixes=('#', ';', '//')) configur.read(gs_ini_file_name) gs_lat_deg = configur.getfloat('GROUND_STATION_0', 'latitude_deg') diff --git a/scripts/Plot/plot_orbit_observer.py b/scripts/Plot/plot_orbit_observer.py new file mode 100644 index 000000000..b84c02830 --- /dev/null +++ b/scripts/Plot/plot_orbit_observer.py @@ -0,0 +1,126 @@ +# +# Plot orbit observer +# +# arg[1] : read_file_tag : time tag for default CSV output log file. ex. 220627_142946 +# + +# +# Import +# +# plots +import matplotlib.pyplot as plt +# numpy +import numpy as np +# local function +from common import find_latest_log_tag +from common import add_log_file_arguments +from common import read_3d_vector_from_csv +from common import read_scalar_from_csv +# arguments +import argparse + +# Arguments +aparser = argparse.ArgumentParser() +aparser = add_log_file_arguments(aparser) +aparser.add_argument('--no-gui', action='store_true') +args = aparser.parse_args() + +# +# Read Arguments +# +# log file path +path_to_logs = args.logs_dir + +read_file_tag = args.file_tag +if read_file_tag == None: + print("file tag does not found. use latest.") + read_file_tag = find_latest_log_tag(path_to_logs) + +print("log: " + read_file_tag) + +# +# CSV file name +# +read_file_name = path_to_logs + '/' + 'logs_' + read_file_tag + '/' + read_file_tag + '_default.csv' + +# +# Data read and edit +# +# Read S2E CSV +time = read_scalar_from_csv(read_file_name, 'elapsed_time[s]') + +measured_position_eci_m = read_3d_vector_from_csv(read_file_name, 'orbit_observer_position_i', 'm') +true_position_eci_m = read_3d_vector_from_csv(read_file_name, 'spacecraft_position_i', 'm') + +measured_velocity_eci_m_s = read_3d_vector_from_csv(read_file_name, 'orbit_observer_velocity_i', 'm/s') +true_velocity_eci_m_s = read_3d_vector_from_csv(read_file_name, 'spacecraft_velocity_i', 'm/s') + +# Statistics +position_error_m = measured_position_eci_m[:, 1:] - true_position_eci_m[:, 1:] +position_average = [0.0, 0.0, 0.0] +position_standard_deviation = [0.0, 0.0, 0.0] +velocity_error_m = measured_velocity_eci_m_s[:, 1:] - true_velocity_eci_m_s[:, 1:] +velocity_average = [0.0, 0.0, 0.0] +velocity_standard_deviation = [0.0, 0.0, 0.0] +for i in range(3): + position_average[i] = position_error_m[i].mean() + position_standard_deviation[i] = position_error_m[i].std() + velocity_average[i] = velocity_error_m[i].mean() + velocity_standard_deviation[i] = velocity_error_m[i].std() + +# +# Plot +# +unit = ' m' +fig, axis = plt.subplots(3, 1, squeeze = False, tight_layout = True, sharex = True) +axis[0, 0].plot(time[0], measured_position_eci_m[0], marker=".", c="red", label="MEASURED-X") +axis[0, 0].plot(time[0], true_position_eci_m[0], marker=".", c="orange", label="TRUE-X") +axis[0, 0].text(0.01, 0.99, "Error average:" + format(position_average[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) +axis[0, 0].text(0.01, 0.79, "Standard deviation:" + format(position_standard_deviation[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) +axis[0, 0].legend(loc = 'upper right') + +axis[1, 0].plot(time[0], measured_position_eci_m[1], marker=".", c="green", label="MEASURED-Y") +axis[1, 0].plot(time[0], true_position_eci_m[1], marker=".", c="yellow", label="TRUE-Y") +axis[1, 0].text(0.01, 0.99, "Error average:" + format(position_average[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) +axis[1, 0].text(0.01, 0.79, "Standard deviation:" + format(position_standard_deviation[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) +axis[1, 0].legend(loc = 'upper right') + +axis[2, 0].plot(time[0], measured_position_eci_m[2], marker=".", c="blue", label="MEASURED-Z") +axis[2, 0].plot(time[0], true_position_eci_m[2], marker=".", c="purple", label="TRUE-Z") +axis[2, 0].text(0.01, 0.99, "Error average:" + format(position_average[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) +axis[2, 0].text(0.01, 0.79, "Standard deviation:" + format(position_standard_deviation[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) +axis[2, 0].legend(loc = 'upper right') + +fig.suptitle("Orbit observer position results @ ECI") +fig.supylabel("Position [m]") +fig.supxlabel("Time [s]") + +unit = ' m/s' +fig, axis = plt.subplots(3, 1, squeeze = False, tight_layout = True, sharex = True) +axis[0, 0].plot(time[0], measured_velocity_eci_m_s[0], marker=".", c="red", label="MEASURED-X") +axis[0, 0].plot(time[0], true_velocity_eci_m_s[0], marker=".", c="orange", label="TRUE-X") +axis[0, 0].text(0.01, 0.99, "Error average:" + format(velocity_average[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) +axis[0, 0].text(0.01, 0.79, "Standard deviation:" + format(velocity_standard_deviation[0], '+.2e') + unit, verticalalignment = 'top', transform = axis[0, 0].transAxes) +axis[0, 0].legend(loc = 'upper right') + +axis[1, 0].plot(time[0], measured_velocity_eci_m_s[1], marker=".", c="green", label="MEASURED-Y") +axis[1, 0].plot(time[0], true_velocity_eci_m_s[1], marker=".", c="yellow", label="TRUE-Y") +axis[1, 0].text(0.01, 0.99, "Error average:" + format(velocity_average[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) +axis[1, 0].text(0.01, 0.79, "Standard deviation:" + format(velocity_standard_deviation[1], '+.2e') + unit, verticalalignment = 'top', transform = axis[1, 0].transAxes) +axis[1, 0].legend(loc = 'upper right') + +axis[2, 0].plot(time[0], measured_velocity_eci_m_s[2], marker=".", c="blue", label="MEASURED-Z") +axis[2, 0].plot(time[0], true_velocity_eci_m_s[2], marker=".", c="purple", label="TRUE-Z") +axis[2, 0].text(0.01, 0.99, "Error average:" + format(velocity_average[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) +axis[2, 0].text(0.01, 0.79, "Standard deviation:" + format(velocity_standard_deviation[2], '+.2e') + unit, verticalalignment = 'top', transform = axis[2, 0].transAxes) +axis[2, 0].legend(loc = 'upper right') + +fig.suptitle("Orbit observer velocity results @ ECI") +fig.supylabel("Velocity [m/s]") +fig.supxlabel("Time [s]") + +# Data save +if args.no_gui: + plt.savefig(read_file_tag + "_orbit_observer.png") # save last figure only +else: + plt.show() diff --git a/data/sample/initialize_files/sample_inter_satellite_communication.ini b/settings/environment/cspice/.gitkeep similarity index 100% rename from data/sample/initialize_files/sample_inter_satellite_communication.ini rename to settings/environment/cspice/.gitkeep diff --git a/settings/environment/gnss/final_products/.gitkeep b/settings/environment/gnss/final_products/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ExtLibraries/GeoPotential/egm96_to360.ascii b/settings/environment/gravity_field/egm96_to360.ascii similarity index 100% rename from ExtLibraries/GeoPotential/egm96_to360.ascii rename to settings/environment/gravity_field/egm96_to360.ascii diff --git a/src/library/external/igrf/igrf11.coef b/settings/environment/magnetic_field/igrf11.coef similarity index 100% rename from src/library/external/igrf/igrf11.coef rename to settings/environment/magnetic_field/igrf11.coef diff --git a/src/library/external/igrf/igrf12.coef b/settings/environment/magnetic_field/igrf12.coef similarity index 100% rename from src/library/external/igrf/igrf12.coef rename to settings/environment/magnetic_field/igrf12.coef diff --git a/src/library/external/igrf/igrf13.coef b/settings/environment/magnetic_field/igrf13.coef similarity index 100% rename from src/library/external/igrf/igrf13.coef rename to settings/environment/magnetic_field/igrf13.coef diff --git a/settings/environment/sample_gnss.ini b/settings/environment/sample_gnss.ini new file mode 100644 index 000000000..875e031cf --- /dev/null +++ b/settings/environment/sample_gnss.ini @@ -0,0 +1,36 @@ +[GNSS_SATELLITES] +directory_path = SETTINGS_DIR_FROM_EXE/environment/gnss/final_products/ +calculation = DISABLE +logging = DISABLE + +// Supporting the following products +// - IGS precise orbits and clocks final products for GPS and GLONASS +// - https://igs.org/products/#orbits_clocks +// - MGEX precise orbits and clocks final products for all navigation satellite systems +// - https://igs.org/mgex/data-products/#orbit_clock +// We use new long file name. +// - Orbit file: [file_name_header]_YYYYDDD0000_01D_[orbit_data_period]_ORB.SP3 +// - Clock file: [file_name_header]_YYYYDDD0000_01D_[clock_file_name_hooter] +// - Users can also use clock information in the orbit SP3 file + +// Header information of the reference files +// Choose from ***0OPSFIN or ***0MGXFIN +// ***: ID of the analysis center or IGS +file_name_header = IGS0OPSFIN + +// Data period in the orbit reference files +// - bbb: Period of the data in the file (ex. 15M = 15 mins.) +orbit_data_period = 15M + +// Footer information of the clock reference files +// bbb_ccc.ddd +// - bbb: Period of the data in the file (ex. 15M = 15 mins.) +// - ccc.ddd: ORB.SP3 or CLK.CLK +clock_file_name_footer = 15M_ORB.SP3 // or 30S_CLK.CLK or 05M_CLK.CLK + +// Duration of the input product files +// YYYYDDD +// - YYYY: Year +// - DDD: Day of year +start_date = 2023126 +end_date = 2023129 diff --git a/settings/environment/space_weather/.gitkeep b/settings/environment/space_weather/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/settings/environment/star_catalogue/.gitkeep b/settings/environment/star_catalogue/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/data/sample/initialize_files/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv b/settings/sample_ground_station/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv similarity index 100% rename from data/sample/initialize_files/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv rename to settings/sample_ground_station/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv diff --git a/data/sample/initialize_files/components/ground_station_antenna.ini b/settings/sample_ground_station/components/ground_station_antenna.ini similarity index 88% rename from data/sample/initialize_files/components/ground_station_antenna.ini rename to settings/sample_ground_station/components/ground_station_antenna.ini index 37c50a680..efba3beae 100644 --- a/data/sample/initialize_files/components/ground_station_antenna.ini +++ b/settings/sample_ground_station/components/ground_station_antenna.ini @@ -37,7 +37,7 @@ tx_antenna_gain_model = ISOTROPIC tx_gain_dBi = 12.0 // Antenna radiation pattern CSV file path -tx_antenna_radiation_pattern_file = INI_FILE_DIR_FROM_EXE/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv +tx_antenna_radiation_pattern_file = SETTINGS_DIR_FROM_EXE/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv // General information of the CSV file tx_length_theta = 360 tx_length_phi = 181 @@ -65,7 +65,7 @@ rx_antenna_gain_model = ISOTROPIC rx_gain_dBi = 43.27 // Antenna radiation pattern CSV file path -rx_antenna_radiation_pattern_file = INI_FILE_DIR_FROM_EXE/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv +rx_antenna_radiation_pattern_file = SETTINGS_DIR_FROM_EXE/sample_ground_station/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv // General information of the CSV file rx_length_theta = 360 rx_length_phi = 181 diff --git a/data/sample/initialize_files/components/ground_station_calculator.ini b/settings/sample_ground_station/components/ground_station_calculator.ini similarity index 100% rename from data/sample/initialize_files/components/ground_station_calculator.ini rename to settings/sample_ground_station/components/ground_station_calculator.ini diff --git a/settings/sample_ground_station/ground_station.ini b/settings/sample_ground_station/ground_station.ini new file mode 100644 index 000000000..d4b20b69e --- /dev/null +++ b/settings/sample_ground_station/ground_station.ini @@ -0,0 +1,12 @@ +[GROUND_STATION_0] +// Position of the ground station +latitude_deg = 26.140837 +longitude_deg = 127.661483 +height_m = 3.4 + +// The minimum limit of elevation to work the station +elevation_limit_angle_deg = 5.0 + +[COMPONENT_FILES] +ground_station_antenna_file = SETTINGS_DIR_FROM_EXE/sample_ground_station/components/ground_station_antenna.ini +ground_station_calculator_file = SETTINGS_DIR_FROM_EXE/sample_ground_station/components/ground_station_calculator.ini diff --git a/settings/sample_inter_satellite_communication.ini b/settings/sample_inter_satellite_communication.ini new file mode 100644 index 000000000..e69de29bb diff --git a/data/sample/initialize_files/components/angular_velocity_observer.ini b/settings/sample_satellite/components/angular_velocity_observer.ini similarity index 100% rename from data/sample/initialize_files/components/angular_velocity_observer.ini rename to settings/sample_satellite/components/angular_velocity_observer.ini diff --git a/settings/sample_satellite/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv b/settings/sample_satellite/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv new file mode 100644 index 000000000..4d9c8a515 --- /dev/null +++ b/settings/sample_satellite/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv @@ -0,0 +1,360 @@ +-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286,-44.23151286 +-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199,-35.83994199 +-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948,-28.30746948 +-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814,-24.33666814 +-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255,-21.62374255 +-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483,-19.56161483 +-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426,-17.89851426 +-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918,-16.5054918 +-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832,-15.30759832 +-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458,-14.25739458 +-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442,-13.3229442 +-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753,-12.48171753 +-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563,-11.71722563 +-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695,-11.01703695 +-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658,-10.37154658 +-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795,-9.7731795 +-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619,-9.21585619 +-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323,-8.69462323 +-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142,-8.20539142 +-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586,-7.74474586 +-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547,-7.30980547 +-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735,-6.89811735 +-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599,-6.50757599 +-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073,-6.13636073 +-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667,-5.78288667 +-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575,-5.44576575 +-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755,-5.1237755 +-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384,-4.81583384 +-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839,-4.52097839 +-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958,-4.23834958 +-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656,-3.96717656 +-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547,-3.70676547 +-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962,-3.45648962 +-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112,-3.21578112 +-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386,-2.98412386 +-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746,-2.76104746 +-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209,-2.54612209 +-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401,-2.33895401 +-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171,-2.13918171 +-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257,-1.94647257 +-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199,-1.7605199 +-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042,-1.58104042 +-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196,-1.40777196 +-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153,-1.24047153 +-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352,-1.07891352 +-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817,-0.92288817 +-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018,-0.77220018 +-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748,-0.62666748 +-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013,-0.48612013 +-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934,-0.35039934 +-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657,-0.21935657 +-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273,-0.09285273 +0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252,0.02924252 +0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142,0.14705142 +0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887,0.2606887 +0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213,0.37026213 +0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299,0.47587299 +0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648,0.57761648 +0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218,0.67558218 +0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437,0.76985437 +0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238,0.86051238 +0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087,0.94763087 +1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017,1.03128017 +1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647,1.11152647 +1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207,1.18843207 +1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562,1.26205562 +1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231,1.33245231 +1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403,1.39967403 +1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954,1.46376954 +1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466,1.52478466 +1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237,1.58276237 +1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295,1.63774295 +1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412,1.68976412 +1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111,1.73886111 +1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681,1.78506681 +1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181,1.82841181 +1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454,1.86892454 +1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128,1.90663128 +1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631,1.94155631 +1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219,1.9737219 +2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842,2.00314842 +2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437,2.02985437 +2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643,2.05385643 +2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695,2.0751695 +2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676,2.09380676 +2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965,2.10977965 +2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797,2.12309797 +2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984,2.13376984 +2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175,2.14180175 +2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859,2.14719859 +2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363,2.14996363 +2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855,2.15009855 +2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342,2.14760342 +2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673,2.14247673 +2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538,2.13471538 +2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466,2.12431466 +2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822,2.11126822 +2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812,2.09556812 +2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474,2.07720474 +2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679,2.05616679 +2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129,2.03244129 +2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351,2.00601351 +1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695,1.97686695 +1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833,1.9449833 +1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424,1.9103424 +1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215,1.87292215 +1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851,1.83269851 +1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538,1.78964538 +1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457,1.74373457 +1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571,1.69493571 +1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616,1.64321616 +1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091,1.58854091 +1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253,1.53087253 +1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099,1.47017099 +1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936,1.4063936 +1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484,1.33949484 +1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625,1.26942625 +1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627,1.19613627 +1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006,1.11957006 +1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934,1.03966934 +0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218,0.95637218 +0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128,0.8696128 +0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132,0.77932132 +0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353,0.68542353 +0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059,0.58784059 +0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875,0.48648875 +0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899,0.38127899 +0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669,0.27211669 +0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122,0.15890122 +0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551,0.04152551 +-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445,-0.08012445 +-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009,-0.20617009 +-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091,-0.33674091 +-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505,-0.47197505 +-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004,-0.61202004 +-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359,-0.75703359 +-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446,-0.90718446 +-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342,-1.06265342 +-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436,-1.22363436 +-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549,-1.39033549 +-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072,-1.56298072 +-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112,-1.7418112 +-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703,-1.92708703 +-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922,-2.11908922 +-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196,-2.31812196 +-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508,-2.52451508 +-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697,-2.73862697 +-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479,-2.9608479 +-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038,-3.1916038 +-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066,-3.43136066 +-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965,-3.68062965 +-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303,-3.93997303 +-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111,-4.2100111 +-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304,-4.4914304 +-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338,-4.78499338 +-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991,-5.09154991 +-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108,-5.41205108 +-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582,-5.74756582 +-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011,-6.0993011 +-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267,-6.4686267 +-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565,-6.85710565 +-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237,-7.26653237 +-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051,-7.69898051 +-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398,-8.15686398 +-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554,-8.64301554 +-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954,-9.16078954 +-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823,-9.71419823 +-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574,-10.30809574 +-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126,-10.94843126 +-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514,-11.64260514 +-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282,-12.39998282 +-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584,-13.2326584 +-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955,-14.15662955 +-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191,-15.19368191 +-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686,-16.3745686 +-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605,-17.74472605 +-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284,-19.37542284 +-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739,-21.38802739 +-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132,-24.01580132 +-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577,-27.80558577 +-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542,-34.6893542 +-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754,-48.2754 +-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389,-31.65296389 +-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681,-26.29935681 +-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265,-23.01355265 +-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789,-20.63723789 +-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304,-18.77547304 +-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596,-17.24538596 +-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588,-15.9471588 +-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642,-14.82028642 +-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812,-13.82530812 +-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467,-12.93505467 +-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048,-12.13002048 +-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757,-11.39572757 +-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376,-10.72113376 +-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496,-10.09762496 +-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517,-9.5183517 +-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799,-8.97777799 +-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562,-8.47136562 +-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809,-7.99534809 +-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503,-7.54656503 +-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889,-7.12233889 +-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141,-6.72038141 +-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173,-6.33872173 +-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038,-5.97565038 +-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508,-5.62967508 +-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555,-5.29948555 +-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513,-4.98392513 +-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776,-4.68196776 +-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991,-4.3926991 +-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097,-4.11530097 +-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841,-3.84903841 +-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881,-3.59324881 +-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328,-3.3473328 +-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655,-3.11074655 +-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515,-2.88299515 +-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702,-2.66362702 +-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902,-2.45222902 +-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233,-2.24842233 +-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878,-2.05185878 +-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773,-1.86221773 +-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033,-1.6792033 +-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193,-1.50254193 +-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029,-1.33198029 +-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834,-1.1672834 +-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293,-1.00823293 +-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578,-0.85462578 +-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273,-0.70627273 +-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728,-0.56299728 +-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461,-0.42463461 +-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063,-0.29103063 +-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112,-0.16204112 +-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103,-0.03753103 +0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628,0.08262628 +0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962,0.19854962 +0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053,0.31035053 +0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338,0.4181338 +0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795,0.52199795 +0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356,0.6220356 +0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391,0.71833391 +0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489,0.81097489 +0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576,0.90003576 +0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919,0.98558919 +1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362,1.06770362 +1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347,1.14644347 +1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938,1.22186938 +1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842,1.29403842 +1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427,1.36300427 +1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742,1.42881742 +1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527,1.49152527 +1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236,1.55117236 +1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044,1.60780044 +1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862,1.66144862 +1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535,1.7121535 +1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925,1.75994925 +1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677,1.8048677 +1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848,1.84693848 +1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904,1.88618904 +1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475,1.92264475 +1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898,1.95632898 +1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315,1.98726315 +2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678,2.01546678 +2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755,2.04095755 +2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132,2.06375132 +2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224,2.08386224 +2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268,2.10130268 +2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336,2.11608336 +2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331,2.12821331 +2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993,2.13769993 +2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899,2.14454899 +2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464,2.14876464 +2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833,2.14904833 +2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271,2.14510271 +2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402,2.13852402 +2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826,2.12930826 +2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984,2.11744984 +2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152,2.10294152 +2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444,2.08577444 +2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807,2.06593807 +2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019,2.04342019 +2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684,2.01820684 +1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235,1.99028235 +1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921,1.95962921 +1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281,1.9262281 +1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779,1.89005779 +1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513,1.85109513 +1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495,1.80931495 +1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469,1.76469 +1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909,1.7171909 +1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604,1.66678604 +1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415,1.6134415 +1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092,1.55712092 +1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548,1.49778548 +1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367,1.43539367 +1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128,1.36990128 +1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117,1.30126117 +1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321,1.22942321 +1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403,1.15433403 +1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694,1.07593694 +0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165,0.99417165 +0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416,0.90897416 +0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644,0.82027644 +0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626,0.72800626 +0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869,0.6320869 +0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685,0.53243685 +0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948,0.42896948 +0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276,0.32159276 +0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879,0.21020879 +0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344,0.09471344 +-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411,-0.02500411 +-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189,-0.14906189 +-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572,-0.27758572 +-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976,-0.41070976 +-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725,-0.54857725 +-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123,-0.69134123 +-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538,-0.83916538 +-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495,-0.99222495 +-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781,-1.15070781 +-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558,-1.31481558 +-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494,-1.48476494 +-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912,-1.66078912 +-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947,-1.84313947 +-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737,-2.03208737 +-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632,-2.22792632 +-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743,-2.4309743 +-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651,-2.64157651 +-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847,-2.86010847 +-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961,-3.08697961 +-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736,-3.32263736 +-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194,-3.56757194 +-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188,-3.82232188 +-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051,-4.08748051 +-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355,-4.36370355 +-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808,-4.65171808 +-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319,-4.95233319 +-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268,-5.26645268 +-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033,-5.59509033 +-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843,-5.93938843 +-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029,-6.30064029 +-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803,-6.68031803 +-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698,-7.08010698 +-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881,-7.50194881 +-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621,-7.94809621 +-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293,-8.42118293 +-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468,-8.92431468 +-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901,-9.46118901 +-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573,-10.03625573 +-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576,-10.65493576 +-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577,-11.32392577 +-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269,-12.05163269 +-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042,-12.84881042 +-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369,-13.72952369 +-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385,-14.71266385 +-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577,-15.82444577 +-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241,-17.10276241 +-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073,-18.60535073 +-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388,-20.4266388 +-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071,-22.73742071 +-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663,-25.89882663 +-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585,-30.92474585 \ No newline at end of file diff --git a/data/sample/initialize_files/components/attitude_observer.ini b/settings/sample_satellite/components/attitude_observer.ini similarity index 100% rename from data/sample/initialize_files/components/attitude_observer.ini rename to settings/sample_satellite/components/attitude_observer.ini diff --git a/data/sample/initialize_files/components/battery.ini b/settings/sample_satellite/components/battery.ini similarity index 100% rename from data/sample/initialize_files/components/battery.ini rename to settings/sample_satellite/components/battery.ini diff --git a/data/sample/initialize_files/components/component_interference.ini b/settings/sample_satellite/components/component_interference.ini similarity index 100% rename from data/sample/initialize_files/components/component_interference.ini rename to settings/sample_satellite/components/component_interference.ini diff --git a/data/sample/initialize_files/components/force_generator.ini b/settings/sample_satellite/components/force_generator.ini similarity index 100% rename from data/sample/initialize_files/components/force_generator.ini rename to settings/sample_satellite/components/force_generator.ini diff --git a/settings/sample_satellite/components/gnss_receiver.ini b/settings/sample_satellite/components/gnss_receiver.ini new file mode 100644 index 000000000..a558caaa0 --- /dev/null +++ b/settings/sample_satellite/components/gnss_receiver.ini @@ -0,0 +1,38 @@ +[GNSS_RECEIVER_1] +prescaler = 10 + +// Position of antenna at body frame [m] +antenna_position_b_m(0) = 0.0125 +antenna_position_b_m(1) = 0.0000 +antenna_position_b_m(2) = 0.1815 + +// Quaternion from body frame to component frame of the antenna +// Note: The antenna boresight direction is +Z direction at the component frame +quaternion_b2c(0) = 0.0 +quaternion_b2c(1) = 0.0 +quaternion_b2c(2) = 0.0 +quaternion_b2c(3) = 1.0 + +// Antenna model +// SIMPLE: We assume that GNSS satellites are visible when antenna directs anti-earth direction +// CONE: We calculate the number of GNSS satellites in the antenna, +// and the position is observable when more than 4 satellites are in the antenna. +// Note : We need to enable the GNSS satellite calculation when we use this mode. +// All satellites managed in the GnssSatellite class are used in this model. +antenna_model = SIMPLE + +// Antenna half width [deg] +antenna_half_width_deg = 60 + +// Random noise for simple position observation +white_noise_standard_deviation_position_ecef_m(0) = 2000.0 +white_noise_standard_deviation_position_ecef_m(1) = 1000.0 +white_noise_standard_deviation_position_ecef_m(2) = 1500.0 + +white_noise_standard_deviation_velocity_ecef_m_s(0) = 1.0 +white_noise_standard_deviation_velocity_ecef_m_s(1) = 1.5 +white_noise_standard_deviation_velocity_ecef_m_s(2) = 2.0 + +[POWER_PORT] +minimum_voltage_V = 3.3 +assumed_power_consumption_W = 1.0 diff --git a/data/sample/initialize_files/components/gyro_sensor.ini b/settings/sample_satellite/components/gyro_sensor.ini similarity index 100% rename from data/sample/initialize_files/components/gyro_sensor.ini rename to settings/sample_satellite/components/gyro_sensor.ini diff --git a/data/sample/initialize_files/components/magnetometer.ini b/settings/sample_satellite/components/magnetometer.ini similarity index 100% rename from data/sample/initialize_files/components/magnetometer.ini rename to settings/sample_satellite/components/magnetometer.ini diff --git a/data/sample/initialize_files/components/magnetorquer.ini b/settings/sample_satellite/components/magnetorquer.ini similarity index 100% rename from data/sample/initialize_files/components/magnetorquer.ini rename to settings/sample_satellite/components/magnetorquer.ini diff --git a/settings/sample_satellite/components/orbit_observer.ini b/settings/sample_satellite/components/orbit_observer.ini new file mode 100644 index 000000000..1c27ecf57 --- /dev/null +++ b/settings/sample_satellite/components/orbit_observer.ini @@ -0,0 +1,19 @@ +[ORBIT_OBSERVER] +// Noise definition frame +// INERTIAL: Inertial frame +// RTN: RTN frame +noise_frame = INERTIAL + +// Standard deviation of position and velocity noise [m, m/s] +// The frame definition can be selected above +noise_standard_deviation(0) = 1000 // Position-X +noise_standard_deviation(1) = 2000 // Position-Y +noise_standard_deviation(2) = 3000 // Position-Z +noise_standard_deviation(3) = 30 // Velocity-X +noise_standard_deviation(4) = 20 // Velocity-Y +noise_standard_deviation(5) = 10 // Velocity-Z + + +[COMPONENT_BASE] +// Prescaler with respect to the component update period +prescaler = 1 diff --git a/data/sample/initialize_files/components/pcu_initial_study.ini b/settings/sample_satellite/components/pcu_initial_study.ini similarity index 100% rename from data/sample/initialize_files/components/pcu_initial_study.ini rename to settings/sample_satellite/components/pcu_initial_study.ini diff --git a/data/sample/initialize_files/components/reaction_wheel.ini b/settings/sample_satellite/components/reaction_wheel.ini similarity index 87% rename from data/sample/initialize_files/components/reaction_wheel.ini rename to settings/sample_satellite/components/reaction_wheel.ini index 89f35cba3..25c687e00 100644 --- a/data/sample/initialize_files/components/reaction_wheel.ini +++ b/settings/sample_satellite/components/reaction_wheel.ini @@ -56,8 +56,8 @@ jitter_logging = DISABLE // prescaler for calculation of RW jitter // To calculate the jitter, set the update cycle to about 0.1 ms. fast_prescaler = 1 -radial_force_harmonics_coefficient_file = INI_FILE_DIR_FROM_EXE/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv -radial_torque_harmonics_coefficient_file = INI_FILE_DIR_FROM_EXE/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv +radial_force_harmonics_coefficient_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv +radial_torque_harmonics_coefficient_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv harmonics_degree = 12 considers_structural_resonance = DISABLE structural_resonance_frequency_Hz = 585.0 //[Hz] diff --git a/data/sample/initialize_files/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv b/settings/sample_satellite/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv similarity index 100% rename from data/sample/initialize_files/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv rename to settings/sample_satellite/components/rw_disturbance_csv_files/radial_force_harmonics_coefficients.csv diff --git a/data/sample/initialize_files/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv b/settings/sample_satellite/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv similarity index 100% rename from data/sample/initialize_files/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv rename to settings/sample_satellite/components/rw_disturbance_csv_files/radial_torque_harmonics_coefficients.csv diff --git a/data/sample/initialize_files/components/solar_array_panel.ini b/settings/sample_satellite/components/solar_array_panel.ini similarity index 100% rename from data/sample/initialize_files/components/solar_array_panel.ini rename to settings/sample_satellite/components/solar_array_panel.ini diff --git a/data/sample/initialize_files/components/spacecraft_antenna.ini b/settings/sample_satellite/components/spacecraft_antenna.ini similarity index 83% rename from data/sample/initialize_files/components/spacecraft_antenna.ini rename to settings/sample_satellite/components/spacecraft_antenna.ini index 49bf43bc0..4464043ba 100644 --- a/data/sample/initialize_files/components/spacecraft_antenna.ini +++ b/settings/sample_satellite/components/spacecraft_antenna.ini @@ -37,7 +37,7 @@ tx_antenna_gain_model = RADIATION_PATTERN_CSV tx_gain_dBi = 8.0 // Antenna radiation pattern CSV file path -tx_antenna_radiation_pattern_file = INI_FILE_DIR_FROM_EXE/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv +tx_antenna_radiation_pattern_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv // General information of the CSV file tx_length_theta = 360 tx_length_phi = 181 @@ -65,7 +65,7 @@ rx_antenna_gain_model = RADIATION_PATTERN_CSV rx_gain_dBi = 43.27 // Antenna radiation pattern CSV file path -rx_antenna_radiation_pattern_file = INI_FILE_DIR_FROM_EXE/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv +rx_antenna_radiation_pattern_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/antenna_radiation_pattern_csv_files/sample_antenna_radiation_pattern.csv // General information of the CSV file rx_length_theta = 360 rx_length_phi = 181 diff --git a/data/sample/initialize_files/components/star_sensor.ini b/settings/sample_satellite/components/star_sensor.ini similarity index 100% rename from data/sample/initialize_files/components/star_sensor.ini rename to settings/sample_satellite/components/star_sensor.ini diff --git a/data/sample/initialize_files/components/sun_sensor.ini b/settings/sample_satellite/components/sun_sensor.ini similarity index 100% rename from data/sample/initialize_files/components/sun_sensor.ini rename to settings/sample_satellite/components/sun_sensor.ini diff --git a/data/sample/initialize_files/components/telescope.ini b/settings/sample_satellite/components/telescope.ini similarity index 100% rename from data/sample/initialize_files/components/telescope.ini rename to settings/sample_satellite/components/telescope.ini diff --git a/data/sample/initialize_files/components/thermal_components.ini b/settings/sample_satellite/components/thermal_components.ini similarity index 100% rename from data/sample/initialize_files/components/thermal_components.ini rename to settings/sample_satellite/components/thermal_components.ini diff --git a/data/sample/initialize_files/components/thruster.ini b/settings/sample_satellite/components/thruster.ini similarity index 100% rename from data/sample/initialize_files/components/thruster.ini rename to settings/sample_satellite/components/thruster.ini diff --git a/data/sample/initialize_files/components/torque_generator.ini b/settings/sample_satellite/components/torque_generator.ini similarity index 100% rename from data/sample/initialize_files/components/torque_generator.ini rename to settings/sample_satellite/components/torque_generator.ini diff --git a/data/sample/initialize_files/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv b/settings/sample_satellite/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv similarity index 100% rename from data/sample/initialize_files/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv rename to settings/sample_satellite/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv diff --git a/data/sample/initialize_files/components/wings_command_sender_to_c2a/example.ops b/settings/sample_satellite/components/wings_command_sender_to_c2a/example.ops similarity index 100% rename from data/sample/initialize_files/components/wings_command_sender_to_c2a/example.ops rename to settings/sample_satellite/components/wings_command_sender_to_c2a/example.ops diff --git a/settings/sample_satellite/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini b/settings/sample_satellite/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini new file mode 100644 index 000000000..99aedf387 --- /dev/null +++ b/settings/sample_satellite/components/wings_command_sender_to_c2a/wings_command_sender_to_c2a.ini @@ -0,0 +1,5 @@ +[WINGS_COMMAND_SENDER_TO_C2A] +command_send_enable = ENABLE +prescaler = 1 +c2a_command_database_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/wings_command_sender_to_c2a/SAMPLE_MOBC_CMD_DB_CMD_DB.csv +wings_operation_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/wings_command_sender_to_c2a/example.ops diff --git a/data/sample/initialize_files/sample_disturbance.ini b/settings/sample_satellite/disturbance.ini similarity index 87% rename from data/sample/initialize_files/sample_disturbance.ini rename to settings/sample_satellite/disturbance.ini index 21bb68c1f..0c98d04e2 100644 --- a/data/sample/initialize_files/sample_disturbance.ini +++ b/settings/sample_satellite/disturbance.ini @@ -3,14 +3,14 @@ calculation = DISABLE logging = ENABLE degree = 4 -coefficients_file_path = EXT_LIB_DIR_FROM_EXE/GeoPotential/egm96_to360.ascii +coefficients_file_path = SETTINGS_DIR_FROM_EXE/environment/gravity_field/egm96_to360.ascii [LUNAR_GRAVITY_FIELD] // Enable only when the center object is defined as the Moon calculation = DISABLE logging = ENABLE degree = 10 -coefficients_file_path = EXT_LIB_DIR_FROM_EXE/LunarGravityField/gggrx_1200a_sha.tab +coefficients_file_path = SETTINGS_DIR_FROM_EXE/environment/gravity_field/gggrx_1200a_sha.tab [MAGNETIC_DISTURBANCE] diff --git a/data/sample/initialize_files/sample_local_environment.ini b/settings/sample_satellite/local_environment.ini similarity index 79% rename from data/sample/initialize_files/sample_local_environment.ini rename to settings/sample_satellite/local_environment.ini index fce7453c5..f0bc9dd1a 100644 --- a/data/sample/initialize_files/sample_local_environment.ini +++ b/settings/sample_satellite/local_environment.ini @@ -1,7 +1,7 @@ [MAGNETIC_FIELD_ENVIRONMENT] calculation = ENABLE logging = ENABLE -coefficient_file = CORE_DIR_FROM_EXE/src/library/external/igrf/igrf13.coef +coefficient_file = SETTINGS_DIR_FROM_EXE/environment/magnetic_field/igrf13.coef magnetic_field_random_walk_standard_deviation_nT = 10.0 magnetic_field_random_walk_limit_nT = 400.0 magnetic_field_white_noise_standard_deviation_nT = 50.0 @@ -17,6 +17,12 @@ number_of_third_shadow_source_ = 1 third_shadow_source_name(0) = MOON +[EARTH_ALBEDO] +calculation = DISABLE +// Earth albedo factor: Percentage of sunlight reflected off the Earth surface. Value between 0.0 and 1.0 +earth_albedo_factor = 0.3 + + [ATMOSPHERE] calculation = ENABLE logging = ENABLE @@ -26,7 +32,7 @@ logging = ENABLE // NRLMSISE00: NRLMSISE00 model // HARRIS_PRIESTER: Harris-Priester model model = STANDARD -nrlmsise00_table_file = EXT_LIB_DIR_FROM_EXE/nrlmsise00/table/SpaceWeather-v1.2.txt +nrlmsise00_table_file = SETTINGS_DIR_FROM_EXE/environment/space_weather/SpaceWeather-v1.2.txt // Whether using user-defined f10.7 and ap value // Ref of f10.7: https://www.swpc.noaa.gov/phenomena/f107-cm-radio-emissions // Ref of ap: http://wdc.kugi.kyoto-u.ac.jp/kp/kpexp-j.html diff --git a/settings/sample_satellite/orbit_files/time_series_orbit.csv b/settings/sample_satellite/orbit_files/time_series_orbit.csv new file mode 100644 index 000000000..fd1519f45 --- /dev/null +++ b/settings/sample_satellite/orbit_files/time_series_orbit.csv @@ -0,0 +1,101 @@ +ephemeris_time[s],position_i_x[m],position_i_y[m],position_i_z[m],velocity_i_x[m/s],velocity_i_y[m/s],velocity_i_z[m/s] +715564027.4963,156763245.9386,-190393643.02541184,95564270.4990822,731.5280577804,-634.4221281717596,132.98336504802236 +715571341.8627,162023931.9353,-194926426.171367,96482978.8459601,707.0923875188,-605.2501479322574,118.38289214154844 +715580751.2772,168534730.9544,-200453013.18907884,97513617.99116926,677.0422627965,-569.8108622115121,100.91295380644247 +715590160.6918,174769366.715,-205656058.9727065,98386069.09765702,648.3616956122,-536.4329528434344,84.7281405526448 +715599570.1063,180739888.6927,-210553699.56114495,99111594.6969217,620.8775450338,-504.85673407112046,69.65780767685317 +715608979.5209,186456843.2569,-215161841.20328796,99700000.18021005,594.4424482704001,-474.86616912323746,55.56158368780805 +715618388.9354,191929490.2049,-219494526.00593194,100159885.85031083,568.9295652003,-446.2798086423517,42.32279056985807 +715627798.35,197165976.2691,-223564224.29542544,100498846.07077189,544.2285178062,-418.9439729044354,29.843540226644436 +715637207.7645,202173474.02679998,-227382069.5892678,100723627.25093108,520.2421941061,-392.7275481649419,18.04101995931441 +715646617.1791,206958294.75550002,-230958052.53263763,100840256.581833,496.8841910615,-367.5179816098753,6.844649817128101 +715656026.5936,211525978.5704,-234301179.1254007,100854145.55012357,474.07671709209995,-343.2181614827633,-3.8061286693342566 +715665436.0082,215881367.1176,-237419604.4866989,100770176.03567857,451.7488351665,-319.7439821497691,-13.96358251603398 +715674845.4227,220028660.7715,-240320745.87434497,100592771.62384214,429.83494299179995,-297.02243841836514,-23.673057026772398 +715684254.8373,223971462.3471,-243011379.84516898,100325957.4025372,408.2734078304,-274.99014433466795,-32.97406764251687 +715688959.5445,225867149.03579998,-244279720.14154235,100160183.10136902,397.6062824546,-264.21500341268177,-37.48237256388195 +715691311.8982,226796212.94709998,-244894970.75910285,100069395.43673636,392.297964188,-258.88492536648516,-39.702727329505976 +715692488.075,227256066.9413,-245197905.28111902,100022049.44062343,389.6497239813,-256.2339385142843,-40.80466121931643 +715693076.1634,227484826.4524,-245348204.6453093,99997891.21608691,388.3270347076,-254.9119194651607,-41.35359225787661 +715693370.2076,227598914.58020002,-245423062.94782877,99985691.14557286,387.6660416699,-254.25177379105472,-41.62755187427055 +715693517.2297,227655885.7672,-245460419.32818958,99979560.91408469,387.3356322875,-253.92191632922396,-41.76440558805807 +715693590.7408,227684353.1452,-245479079.33489326,99976488.2546943,387.170449285,-253.75704136909724,-41.83280096885237 +715693627.4963,227698582.2808,-245488404.79353058,99974950.03975518,387.0878631942,-253.67461732285636,-41.866990796088785 +715693664.2518,227712808.3809,-245497727.22272977,99973410.56821942,387.0052807057,-253.59220222884773,-41.901175383526976 +715693737.7629,227741251.4755,-245516362.99438584,99970327.85625659,386.8401265214,-253.42739888672298,-41.969528845763975 +715693884.785,227798101.2453,-245553598.1997845,99964147.36202367,386.5098612305,-253.09789951499374,-42.10617296672511 +715694178.8292,227911655.13709998,-245627923.33201766,99951726.13516967,385.84950219539996,-252.43932944253976,-42.37921037220819 +715694766.9176,228138180.5633,-245775993.06951877,99926643.07149409,384.529464206,-251.12389936513614,-42.924284844681424 +715695943.0944,228588903.8329,-246069815.11524853,99875517.23990135,381.89205969790004,-248.49984289609012,-44.0104563161382 +715698295.448,229481054.37669998,-246648226.5915791,99769448.4335765,376.6275455973,-243.2786576436546,-46.16707754877926 +715703000.1553,231228279.27940002,-247768410.98403248,99542212.3891322,366.136563127,-232.9417901124887,-50.41889406757497 +715712409.5699,234575175.5498,-249864486.83715355,99028658.11156674,345.2814878306,-212.67380519741258,-58.68783219796623 +715721818.9844,237726448.8571,-251772294.0294614,98438697.0304816,324.5462401355,-192.91972373071175,-66.66304911845108 +715731228.399,240682937.04799998,-253496537.78884944,97774993.95556167,303.868495393,-173.65301628832583,-74.36512371635561 +715740637.8135,243444866.7706,-255041707.11874443,97040032.32399485,283.1802123355,-154.8543379394204,-81.81207590839726 +715749106.2866,245763897.3543,-256282842.75216284,96319565.32200795,264.48839461250003,-138.32610684141042,-88.30922299688848 +715756727.9124,247715273.24989998,-257281433.5083567,95624729.78376344,247.5516651684,-123.76515172840581,-93.99913165250393 +715763199.9172,249270550.2093,-258043076.82122195,95001040.2375045,233.0418097246,-111.63700398060271,-98.71860716753693 +715764453.2564,249560857.14790002,-258181540.37345752,94876746.62104207,230.2148028968,-109.31384644207176,-99.62097507452441 +715771045.722,251029266.2951,-258862240.34528878,94204497.3168601,215.232889982,-97.234187173782,-104.3069613908248 +715777638.1876,252398186.8889,-259464101.56689993,93501684.48945048,200.0225271461,-85.39821942497376,-108.89374333768635 +715780934.4204,253044820.92339998,-259735980.8259846,93139018.80778934,192.3118091493,-79.57642059676128,-111.15085981087223 +715784230.6533,253665904.8978,-259988780.5035829,92768952.32047178,184.518245749,-73.82209623673718,-113.38426428282429 +715787526.8861,254261148.2185,-260222727.98699337,92391562.61257419,176.6309866243,-68.13835213318855,-115.59430630330104 +715790823.1189,254830222.2022,-260438061.79940674,92006926.1074329,168.6377250352,-62.52885248353386,-117.78134367421778 +715794119.3517,255372754.8073,-260635033.57938743,91615118.01604319,160.52441371449999,-56.99790610783423,-119.94575581908697 +715797415.5845,255888324.3511,-260813910.3695098,91216212.23908782,152.2749120883,-51.55056962428947,-122.08796230464964 +715800711.8173,256376451.9055,-260974977.27944264,90810281.19393465,143.87054530359998,-46.192771301132986,-124.20844851937845 +715804008.0501,256836592.063,-261118540.5973533,90397395.54176973,135.2895478114,-40.93146018687843,-126.30780158925195 +715807304.2829,257268121.6288,-261244931.44170713,89977623.77370559,126.50635469939999,-35.77478615038925,-128.38676097337967 +715810600.5157,257670325.659,-261354510.06713092,89551031.59705815,117.49068989189999,-30.73231766504652,-130.44629034520545 +715813896.7486,258042380.0688,-261447670.9613115,89117681.03791566,108.206379992,-25.81530548050535,-132.48768068750726 +715815544.865,258216808.5207,-261488228.86425632,88898489.42981765,103.4501919854,-23.40789854246432,-133.50210214083344 +715817192.9814,258383329.7337,-261524848.89902028,88677629.12981617,98.60979273507999,-21.037001521689067,-134.5126997642903 +715818841.0978,258541799.28509998,-261557592.8894342,88455106.17566317,93.67822167639001,-18.70464658689187,-135.51980491408028 +715820489.2142,258692060.6556,-261586526.15264535,88230926.00746208,88.64775394707,-16.413043019068255,-136.52381157986744 +715822137.3306,258833943.8937,-261611717.80392477,88005093.35591441,83.50979066097,-14.164593385801247,-137.5251899165017 +715823785.447,258967264.0687,-261633241.08914226,87777612.10270293,78.25473014546,-11.961910974625866,-138.5245028738693 +715825433.5634,259091819.49580002,-261651173.74773768,87548485.11151291,72.87181577874,-9.80783838926299,-139.5224268191313 +715827081.6798,259207389.6891,-261665598.40631473,87317714.02060133,67.34895543604,-7.705467117967636,-140.51977721816513 +715827905.738,259261730.7033,-261671522.49707922,87201712.05298126,64.53084943674001,-6.6747085835792745,-141.01853795069 +715828729.7962,259313732.9874,-261676603.0056241,87085298.98802114,61.672506264389995,-5.658157717396243,-141.51754076888784 +715829553.8544,259363362.5727,-261680851.83007234,86968474.56262626,58.77193596654,-4.656279945320279,-142.01694239527401 +715830377.9126,259410583.7969,-261684281.26050836,86851238.37816466,55.82701663589,-3.6695599897578433,-142.51691587513807 +715831201.9708,259455359.1909,-261686903.99414158,86733589.88585323,52.8354832813,-2.6985024255133254,-143.01765247378125 +715831613.9999,259476817.469,-261687916.9332046,86674610.80802988,51.32148640578,-2.21901027313298,-143.26837221964138 +715832026.029,259497649.357,-261688733.15267596,86615528.3713341,49.794915539479994,-1.7436321819907548,-143.51936382592152 +715832438.0581,259517849.6065,-261689354.36199412,86556342.45768659,48.25544164811,-1.2724370189009235,-143.77065732636473 +715832850.0872,259537412.8313,-261689782.29894945,86497052.93615556,46.70272422018,-0.8054949711101358,-144.02228434826574 +715833056.1018,259546953.8373,-261689924.34130937,86467369.27788354,45.921289506849995,-0.5736411618520876,-144.1482332724574 +715833159.109,259551663.88189998,-261689977.47855306,86452517.71606982,45.52928349582,-0.45812251262906756,-144.21124346344493 +715833262.1163,259556333.5023,-261690018.73064944,86437659.66249217,45.13641076078,-0.3428775532437385,-144.2742782075543 +715833365.1236,259560962.6091,-261690048.1258378,86422795.11461459,44.742665523279996,-0.22790742978757095,-144.33733806403418 +715833416.6272,259563261.9418,-261690058.38588107,86415360.40446058,44.54546389627,-0.17052579110550425,-144.36887758619264 +715833442.3791,259564407.798,-261690062.40815455,86411642.44022457,44.44678051046,-0.14186089067985108,-144.38464977703632 +715833455.255,259564979.773,-261690064.14249927,86409783.30576524,44.397418134279995,-0.12753492808685252,-144.39253648380785 +715833461.6929,259565265.5221,-261690064.94046167,86408853.70044641,44.37273177024,-0.12037356969516821,-144.39647999052403 +715833468.1309,259565551.1122,-261690065.692413,86407924.06977254,44.34804195369,-0.11321329362032628,-144.40042359965884 +715833474.5688,259565836.5434,-261690066.39826164,86406994.4137039,44.32334868322,-0.10605410012540517,-144.4043673113163 +715833481.0068,259566121.8157,-261690067.05791566,86406064.73220064,44.29865195737,-0.09889598951320977,-144.40831112569202 +715833493.8827,259566691.883,-261690068.23919868,86404205.29311073,44.24924813399,-0.08458301799844037,-144.4161990630102 +715833519.6345,259567830.109,-261690070.04887435,86400486.11015661,44.15039895917,-0.05597008191628561,-144.43197617613603 +715833571.1381,259570098.92069998,-261690071.45888916,86393046.52529849,43.952534172890005,0.0012036988839412288,-144.46353538829288 +715833674.1454,259574605.9433,-261690065.4539999,86378162.47852196,43.55613624739,0.11534238591767121,-144.5266740119086 +715833777.1527,259579072.08789998,-261690047.70624298,86363271.92656122,43.15884219222,0.22920160051508986,-144.58984006005144 +715833880.16,259583497.262,-261690018.24472678,86348374.86663583,42.760645969399995,0.34278017059822474,-144.65303412985975 +715834086.1745,259592224.32450002,-261689924.29597896,86318561.21100996,41.96152259995,0.5690906628459516,-144.7795087632807 +715834498.2036,259609182.6575,-261689597.1146299,86258855.67113212,40.35217808225,1.018291759624887,-145.0328214742402 +715834910.2327,259625474.78980002,-261689085.79922697,86199045.65358807,38.72769666999,1.462868825843202,-145.2866532927219 +715835322.2618,259641094.39819998,-261688392.27123213,86139130.93565343,37.08765741761,1.9027436874575798,-145.54104762892348 +715835734.2909,259656034.9829,-261687518.48431313,86079111.27613047,35.4316237578,2.3378368583625644,-145.79605029732784 +715836558.3491,259683852.1585,-261685238.1146352,85958756.06963718,32.069744452870005,3.193353728244979,-146.30807681567416 +715837382.4073,259708870.53019997,-261682260.99020875,85837977.6974602,28.63822505694,4.0287580804102845,-146.82315341840265 +715838206.4655,259731031.0285,-261678603.9638992,85716773.4561057,25.1329309837,4.843369248123992,-147.34174987416105 +715839030.5237,259750271.04270002,-261674284.45738718,85595140.23262888,21.54939685128,5.636488761209044,-147.8643916997928 +715839854.5819,259766524.1342,-261669320.47416422,85473074.4553026,17.88279303661,6.407402465571494,-148.39166769450065 +715840678.6401,259779719.7196,-261663730.61178052,85350572.03771636,14.12788822914,7.155383391159113,-148.92423861411308 +715841502.6984,259789782.72980002,-261657534.07106,85227628.3170478,10.27900705214,7.879695636643433,-149.46284729622104 +715843150.8148,259800185.9332,-261643400.80021977,84980394.98085491,2.2741037471439998,9.254357245190995,-150.56163132943067 +715844634.1195,259797975.8742,-261628811.0746532,84756314.34089553,-5.31953792671,10.40324886362125,-151.5807702951432 +715845969.0938,259786114.5769,-261614274.80887884,84553328.72959259,-12.510306223079999,11.362263826441371,-152.5288019697381 diff --git a/data/sample/initialize_files/sample_satellite.ini b/settings/sample_satellite/satellite.ini similarity index 66% rename from data/sample/initialize_files/sample_satellite.ini rename to settings/sample_satellite/satellite.ini index 62991f053..3a89dc56f 100644 --- a/data/sample/initialize_files/sample_satellite.ini +++ b/settings/sample_satellite/satellite.ini @@ -1,12 +1,13 @@ [ATTITUDE] // Attitude propagation mode // RK4 : Attitude Propagation with RK4 including disturbances and control torque +// CANTILEVER_VIBRATION : Attitude Propagation with the consideration of the cantilever vibration (flexible structure) including disturbances and control torque. // CONTROLLED : Attitude Calculation with Controlled Attitude mode. All disturbances and control torque are ignored. propagate_mode = RK4 // Initialize Attitude mode // MANUAL : Initialize Quaternion_i2b manually below -// CONTROLLED : Initialize attitude with given condition. Valid only when Attitude propagation mode is RK4. +// CONTROLLED : Initialize attitude with given condition. Valid except when Attitude propagation mode is CONTROLLED. initialize_mode = MANUAL // Initial angular velocity at body frame [rad/s] @@ -33,6 +34,7 @@ initial_torque_b_Nm(2) = 0.000 // SUN_POINTING // EARTH_CENTER_POINTING // VELOCITY_DIRECTION_POINTING +// GROUND_SPEED_DIRECTION_POINTING // ORBIT_NORMAL_POINTING main_mode = INERTIAL_STABILIZE sub_mode = SUN_POINTING @@ -58,6 +60,7 @@ logging = ENABLE // RELATIVE : Relative dynamics (for formation flying simulation) // KEPLER : Kepler orbit propagation without disturbances and thruster maneuver // ENCKE : Encke orbit propagation with disturbances and thruster maneuver +// TIME_SERIES_FILE : Orbit propagation with time series file propagate_mode = RK4 // Orbit initialize mode for RK4, KEPLER, and ENCKE @@ -121,31 +124,42 @@ reference_satellite_id = 1 error_tolerance = 0.0001 /////////////////////////////////////////////////////////////////////////////// +// Settings for orbit propagation with time series file /////////// +time_series_file_path = SETTINGS_DIR_FROM_EXE/sample_satellite/orbit_files/time_series_orbit.csv +number_of_interpolation = 5 +// Interpolation method +0: POLYNOMIAL +1: TRIGONOMETRIC +interpolation_method = 0 +orbital_period_correction_s = 86659.2 // Only used for trigonometric method. This sample value is used for the gnss satellits (24 * 60 * 60 * 1.003). +/////////////////////////////////////////////////////////////////////////////// + [THERMAL] calculation = DISABLE debug = DISABLE solar_calc_setting = DISABLE -thermal_file_directory = INI_FILE_DIR_FROM_EXE/thermal_csv_files/ +thermal_file_directory = SETTINGS_DIR_FROM_EXE/sample_satellite/thermal_csv_files/ [SETTING_FILES] -local_environment_file = INI_FILE_DIR_FROM_EXE/sample_local_environment.ini -disturbance_file = INI_FILE_DIR_FROM_EXE/sample_disturbance.ini -structure_file = INI_FILE_DIR_FROM_EXE/sample_structure.ini +local_environment_file = SETTINGS_DIR_FROM_EXE/sample_satellite/local_environment.ini +disturbance_file = SETTINGS_DIR_FROM_EXE/sample_satellite/disturbance.ini +structure_file = SETTINGS_DIR_FROM_EXE/sample_satellite/structure.ini [COMPONENT_FILES] -gyro_file = INI_FILE_DIR_FROM_EXE/components/gyro_sensor.ini -magnetometer_file = INI_FILE_DIR_FROM_EXE/components/magnetometer.ini -stt_file = INI_FILE_DIR_FROM_EXE/components/star_sensor.ini -ss_file = INI_FILE_DIR_FROM_EXE/components/sun_sensor.ini -gnss_file = INI_FILE_DIR_FROM_EXE/components/gnss_receiver.ini -magnetorquer_file = INI_FILE_DIR_FROM_EXE/components/magnetorquer.ini -rw_file = INI_FILE_DIR_FROM_EXE/components/reaction_wheel.ini -thruster_file = INI_FILE_DIR_FROM_EXE/components/thruster.ini -force_generator_file = INI_FILE_DIR_FROM_EXE/components/force_generator.ini -torque_generator_file = INI_FILE_DIR_FROM_EXE/components/torque_generator.ini -angular_velocity_observer_file = INI_FILE_DIR_FROM_EXE/components/angular_velocity_observer.ini -attitude_observer_file = INI_FILE_DIR_FROM_EXE/components/attitude_observer.ini -antenna_file = INI_FILE_DIR_FROM_EXE/components/spacecraft_antenna.ini -component_interference_file = INI_FILE_DIR_FROM_EXE/components/component_interference.ini -telescope_file = INI_FILE_DIR_FROM_EXE/components/telescope.ini +gyro_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/gyro_sensor.ini +magnetometer_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/magnetometer.ini +stt_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/star_sensor.ini +ss_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/sun_sensor.ini +gnss_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/gnss_receiver.ini +magnetorquer_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/magnetorquer.ini +rw_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/reaction_wheel.ini +thruster_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/thruster.ini +force_generator_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/force_generator.ini +torque_generator_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/torque_generator.ini +angular_velocity_observer_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/angular_velocity_observer.ini +attitude_observer_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/attitude_observer.ini +orbit_observer_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/orbit_observer.ini +antenna_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/spacecraft_antenna.ini +component_interference_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/component_interference.ini +telescope_file = SETTINGS_DIR_FROM_EXE/sample_satellite/components/telescope.ini diff --git a/data/sample/initialize_files/sample_structure.ini b/settings/sample_satellite/structure.ini similarity index 78% rename from data/sample/initialize_files/sample_structure.ini rename to settings/sample_satellite/structure.ini index b7c707cb5..62bc8c4ac 100644 --- a/data/sample/initialize_files/sample_structure.ini +++ b/settings/sample_satellite/structure.ini @@ -24,6 +24,25 @@ center_of_gravity_b_m(0) = 0.01 center_of_gravity_b_m(1) = 0.01 center_of_gravity_b_m(2) = 0.01 +[CANTILEVER_PARAMETERS] +// Currently, the cantilever frame has the same coordinate system as the body frame of the satellite +// Inertia Tensor of cantilever (flexible structure) @ body fixed frame [kg・m2] +inertia_tensor_cantilever_kgm2(0) = 0.1 // I_xx +inertia_tensor_cantilever_kgm2(1) = 0.0 // I_xy +inertia_tensor_cantilever_kgm2(2) = 0.0 // I_xz +inertia_tensor_cantilever_kgm2(3) = 0.0 // I_yx +inertia_tensor_cantilever_kgm2(4) = 0.1 // I_yy +inertia_tensor_cantilever_kgm2(5) = 0.0 // I_yz +inertia_tensor_cantilever_kgm2(6) = 0.0 // I_zx +inertia_tensor_cantilever_kgm2(7) = 0.0 // I_zy +inertia_tensor_cantilever_kgm2(8) = 0.1 // I_zz + +// Damping ratio of the cantilever +damping_ratio_cantilever = 0.01 + +// Intrinsic angular velocity of the cantilever [rad/s] +intrinsic_angular_velocity_cantilever_rad_s = 25.5097 // 4.06 Hz + [SURFACES] number_of_surfaces = 6 diff --git a/data/sample/initialize_files/thermal_csv_files/cij.csv b/settings/sample_satellite/thermal_csv_files/cij.csv similarity index 100% rename from data/sample/initialize_files/thermal_csv_files/cij.csv rename to settings/sample_satellite/thermal_csv_files/cij.csv diff --git a/data/sample/initialize_files/thermal_csv_files/heaters.csv b/settings/sample_satellite/thermal_csv_files/heaters.csv similarity index 100% rename from data/sample/initialize_files/thermal_csv_files/heaters.csv rename to settings/sample_satellite/thermal_csv_files/heaters.csv diff --git a/data/sample/initialize_files/thermal_csv_files/heatload.csv b/settings/sample_satellite/thermal_csv_files/heatload.csv similarity index 100% rename from data/sample/initialize_files/thermal_csv_files/heatload.csv rename to settings/sample_satellite/thermal_csv_files/heatload.csv diff --git a/data/sample/initialize_files/thermal_csv_files/node.csv b/settings/sample_satellite/thermal_csv_files/node.csv similarity index 100% rename from data/sample/initialize_files/thermal_csv_files/node.csv rename to settings/sample_satellite/thermal_csv_files/node.csv diff --git a/data/sample/initialize_files/thermal_csv_files/rij.csv b/settings/sample_satellite/thermal_csv_files/rij.csv similarity index 100% rename from data/sample/initialize_files/thermal_csv_files/rij.csv rename to settings/sample_satellite/thermal_csv_files/rij.csv diff --git a/data/sample/initialize_files/sample_simulation_base.ini b/settings/sample_simulation_base.ini similarity index 85% rename from data/sample/initialize_files/sample_simulation_base.ini rename to settings/sample_simulation_base.ini index 46762b380..891544bd6 100644 --- a/data/sample/initialize_files/sample_simulation_base.ini +++ b/settings/sample_simulation_base.ini @@ -115,15 +115,15 @@ rotation_mode(10) = DISABLE [CSPICE_KERNELS] // CSPICE Kernel files definition -tls = EXT_LIB_DIR_FROM_EXE/cspice/generic_kernels/lsk/naif0010.tls -tpc1 = EXT_LIB_DIR_FROM_EXE/cspice/generic_kernels/pck/de-403-masses.tpc -tpc2 = EXT_LIB_DIR_FROM_EXE/cspice/generic_kernels/pck/gm_de431.tpc -tpc3 = EXT_LIB_DIR_FROM_EXE/cspice/generic_kernels/pck/pck00010.tpc -bsp = EXT_LIB_DIR_FROM_EXE/cspice/generic_kernels/spk/planets/de430.bsp +tls = SETTINGS_DIR_FROM_EXE/environment/cspice/generic_kernels/lsk/naif0010.tls +tpc1 = SETTINGS_DIR_FROM_EXE/environment/cspice/generic_kernels/pck/de-403-masses.tpc +tpc2 = SETTINGS_DIR_FROM_EXE/environment/cspice/generic_kernels/pck/gm_de431.tpc +tpc3 = SETTINGS_DIR_FROM_EXE/environment/cspice/generic_kernels/pck/pck00010.tpc +bsp = SETTINGS_DIR_FROM_EXE/environment/cspice/generic_kernels/spk/planets/de430.bsp [HIPPARCOS_CATALOGUE] -catalogue_file_path = EXT_LIB_DIR_FROM_EXE/HipparcosCatalogue/hip_main.csv +catalogue_file_path = SETTINGS_DIR_FROM_EXE/environment/star_catalogue/hip_main.csv max_magnitude = 3.0 // Max magnitude to read from Hip catalog calculation = DISABLE logging = DISABLE @@ -144,7 +144,7 @@ save_initialize_files = ENABLE // If you want to add a ground station, create the corresponding ground_station.ini, and specify it as ground_station_file(1), ground_station_file(2), ect. number_of_simulated_spacecraft = 1 number_of_simulated_ground_station = 1 -spacecraft_file(0) = INI_FILE_DIR_FROM_EXE/sample_satellite.ini -ground_station_file(0) = INI_FILE_DIR_FROM_EXE/sample_ground_station.ini -gnss_file = INI_FILE_DIR_FROM_EXE/sample_gnss.ini -log_file_save_directory = ../../data/sample/logs/ +spacecraft_file(0) = SETTINGS_DIR_FROM_EXE/sample_satellite/satellite.ini +ground_station_file(0) = SETTINGS_DIR_FROM_EXE/sample_ground_station/ground_station.ini +gnss_file = SETTINGS_DIR_FROM_EXE/environment/sample_gnss.ini +log_file_save_directory = ../../logs/ diff --git a/src/components/CMakeLists.txt b/src/components/CMakeLists.txt index 4cfe611bd..019dfc82b 100644 --- a/src/components/CMakeLists.txt +++ b/src/components/CMakeLists.txt @@ -36,6 +36,7 @@ ideal/force_generator.cpp ideal/torque_generator.cpp ideal/angular_velocity_observer.cpp ideal/attitude_observer.cpp +ideal/orbit_observer.cpp real/mission/telescope.cpp @@ -56,8 +57,8 @@ ports/i2c_port.cpp if(USE_HILS) set(SOURCE_FILES ${SOURCE_FILES} - hils/ports/hils_uart_port.cpp - hils/ports/hils_i2c_target_port.cpp + ports/hils_uart_port.cpp + ports/hils_i2c_target_port.cpp ) endif() diff --git a/src/components/base/component.cpp b/src/components/base/component.cpp index 82fdf14c9..469c4e981 100644 --- a/src/components/base/component.cpp +++ b/src/components/base/component.cpp @@ -5,7 +5,9 @@ #include "component.hpp" -Component::Component(const unsigned int prescaler, ClockGenerator* clock_generator, const unsigned int fast_prescaler) +namespace s2e::components { + +Component::Component(const unsigned int prescaler, environment::ClockGenerator* clock_generator, const unsigned int fast_prescaler) : clock_generator_(clock_generator) { power_port_ = new PowerPort(); clock_generator_->RegisterComponent(this); @@ -13,7 +15,8 @@ Component::Component(const unsigned int prescaler, ClockGenerator* clock_generat fast_prescaler_ = (fast_prescaler > 0) ? fast_prescaler : 1; } -Component::Component(const unsigned int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const unsigned int fast_prescaler) +Component::Component(const unsigned int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, + const unsigned int fast_prescaler) : clock_generator_(clock_generator), power_port_(power_port) { clock_generator_->RegisterComponent(this); prescaler_ = (prescaler > 0) ? prescaler : 1; @@ -48,3 +51,5 @@ void Component::FastTick(const unsigned int fast_count) { PowerOffRoutine(); } } + +} // namespace s2e::components diff --git a/src/components/base/component.hpp b/src/components/base/component.hpp index cb4049985..2b541dffd 100644 --- a/src/components/base/component.hpp +++ b/src/components/base/component.hpp @@ -8,10 +8,12 @@ #include #include -#include +#include #include "interface_tickable.hpp" +namespace s2e::components { + /** * @class Component * @brief Base class for component emulation. All components have to inherit this. @@ -27,7 +29,7 @@ class Component : public ITickable { * @param [in] clock_generator: Clock generator * @param [in] fast_prescaler: Frequency scale factor for fast update (used only for component faster than component update period) */ - Component(const unsigned int prescaler, ClockGenerator* clock_generator, const unsigned int fast_prescaler = 1); + Component(const unsigned int prescaler, environment::ClockGenerator* clock_generator, const unsigned int fast_prescaler = 1); /** * @fn Component * @brief Constructor with power port @@ -36,7 +38,7 @@ class Component : public ITickable { * @param [in] power_port: Power port * @param [in] fast_prescaler: Frequency scale factor for fast update (used only for component faster than component update period) */ - Component(const unsigned int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const unsigned int fast_prescaler = 1); + Component(const unsigned int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const unsigned int fast_prescaler = 1); /** * @fn Component * @brief Copy constructor @@ -84,8 +86,10 @@ class Component : public ITickable { */ virtual void PowerOffRoutine(){}; - ClockGenerator* clock_generator_; //!< Clock generator - PowerPort* power_port_; //!< Power port + environment::ClockGenerator* clock_generator_; //!< Clock generator + PowerPort* power_port_; //!< Power port }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_COMPONENT_HPP_ diff --git a/src/components/base/gpio_connection_with_obc.cpp b/src/components/base/gpio_connection_with_obc.cpp index 7a3024a66..ceae6170b 100644 --- a/src/components/base/gpio_connection_with_obc.cpp +++ b/src/components/base/gpio_connection_with_obc.cpp @@ -6,6 +6,8 @@ #include "gpio_connection_with_obc.hpp" +namespace s2e::components { + GpioConnectionWithObc::GpioConnectionWithObc(const std::vector port_id, OnBoardComputer* obc) : port_id_(port_id), obc_(obc) { for (size_t i = 0; i < port_id_.size(); i++) { obc_->GpioConnectPort(port_id_[i]); @@ -17,3 +19,5 @@ GpioConnectionWithObc::~GpioConnectionWithObc() {} bool GpioConnectionWithObc::Read(const int index) { return obc_->GpioComponentRead(port_id_[index]); } void GpioConnectionWithObc::Write(const int index, const bool is_high) { obc_->GpioComponentWrite(port_id_[index], is_high); } + +} // namespace s2e::components diff --git a/src/components/base/gpio_connection_with_obc.hpp b/src/components/base/gpio_connection_with_obc.hpp index 397456674..752d36d5b 100644 --- a/src/components/base/gpio_connection_with_obc.hpp +++ b/src/components/base/gpio_connection_with_obc.hpp @@ -9,6 +9,8 @@ #include "../real/cdh/on_board_computer.hpp" +namespace s2e::components { + /** * @class GpioConnectionWithObc * @brief Base class for GPIO communication with OBC flight software @@ -50,4 +52,6 @@ class GpioConnectionWithObc { OnBoardComputer* obc_; //!< The communication target OBC }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_GPIO_CONNECTION_WITH_OBC_HPP_ diff --git a/src/components/base/i2c_controller.cpp b/src/components/base/i2c_controller.cpp index 2d6e0970d..48a6850d7 100644 --- a/src/components/base/i2c_controller.cpp +++ b/src/components/base/i2c_controller.cpp @@ -5,10 +5,12 @@ #include "i2c_controller.hpp" #include -#include +#include + +namespace s2e::components { I2cController::I2cController(const unsigned int hils_port_id, const unsigned int baud_rate, const unsigned int tx_buffer_size, - const unsigned int rx_buffer_size, HilsPortManager* hils_port_manager) + const unsigned int rx_buffer_size, simulation::HilsPortManager* hils_port_manager) : hils_port_id_(hils_port_id), baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size), @@ -48,3 +50,5 @@ int I2cController::SendCommand(const unsigned char length) { if (simulation_mode_ != SimulationMode::kHils) return -1; return hils_port_manager_->I2cControllerSend(hils_port_id_, &tx_buffer_.front(), 0, length); } + +} // namespace s2e::components diff --git a/src/components/base/i2c_controller.hpp b/src/components/base/i2c_controller.hpp index 62f59e480..f300a9710 100644 --- a/src/components/base/i2c_controller.hpp +++ b/src/components/base/i2c_controller.hpp @@ -9,6 +9,8 @@ #include "../../simulation/hils/hils_port_manager.hpp" #include "uart_communication_with_obc.hpp" +namespace s2e::components { + /** * @class I2cController * @brief This class simulates the I2C Controller communication with the I2C Target. @@ -28,7 +30,7 @@ class I2cController { * @param [in] hils_port_manager: HILS port manager */ I2cController(const unsigned int hils_port_id, const unsigned int baud_rate, const unsigned int tx_buffer_size, const unsigned int rx_buffer_size, - HilsPortManager* hils_port_manager); + simulation::HilsPortManager* hils_port_manager); /** * @fn ~I2cController * @brief Destructor @@ -61,7 +63,9 @@ class I2cController { unsigned int rx_buffer_size_; //!< RX (Target to Controller) buffer size SimulationMode simulation_mode_ = SimulationMode::kError; //!< Simulation mode (SILS or HILS) - HilsPortManager* hils_port_manager_; //!< HILS port manager + simulation::HilsPortManager* hils_port_manager_; //!< HILS port manager }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_I2C_CONTROLLER_HPP_ diff --git a/src/components/base/i2c_target_communication_with_obc.cpp b/src/components/base/i2c_target_communication_with_obc.cpp index a4b7cc4fe..7aefe1704 100644 --- a/src/components/base/i2c_target_communication_with_obc.cpp +++ b/src/components/base/i2c_target_communication_with_obc.cpp @@ -6,6 +6,8 @@ #include +namespace s2e::components { + I2cTargetCommunicationWithObc::I2cTargetCommunicationWithObc(const unsigned int sils_port_id, const unsigned char i2c_address, OnBoardComputer* obc) : sils_port_id_(sils_port_id), i2c_address_(i2c_address), obc_(obc) { #ifdef USE_HILS @@ -18,7 +20,7 @@ I2cTargetCommunicationWithObc::I2cTargetCommunicationWithObc(const unsigned int } I2cTargetCommunicationWithObc::I2cTargetCommunicationWithObc(const unsigned int hils_port_id, const unsigned char i2c_address, - HilsPortManager* hils_port_manager) + simulation::HilsPortManager* hils_port_manager) : hils_port_id_(hils_port_id), i2c_address_(i2c_address), hils_port_manager_(hils_port_manager) { #ifdef USE_HILS simulation_mode_ = SimulationMode::kHils; @@ -34,7 +36,7 @@ I2cTargetCommunicationWithObc::I2cTargetCommunicationWithObc(const unsigned int I2cTargetCommunicationWithObc::I2cTargetCommunicationWithObc(const unsigned int sils_port_id, const unsigned int hils_port_id, const unsigned char i2c_address, OnBoardComputer* obc, - HilsPortManager* hils_port_manager) + simulation::HilsPortManager* hils_port_manager) : sils_port_id_(sils_port_id), hils_port_id_(hils_port_id), i2c_address_(i2c_address), obc_(obc), hils_port_manager_(hils_port_manager) { #ifdef USE_HILS simulation_mode_ = SimulationMode::kHils; @@ -163,3 +165,5 @@ int I2cTargetCommunicationWithObc::StoreTelemetry(const unsigned int stored_fram } return 0; } + +} // namespace s2e::components diff --git a/src/components/base/i2c_target_communication_with_obc.hpp b/src/components/base/i2c_target_communication_with_obc.hpp index 12ff9a4ac..5fa5bf279 100644 --- a/src/components/base/i2c_target_communication_with_obc.hpp +++ b/src/components/base/i2c_target_communication_with_obc.hpp @@ -10,6 +10,8 @@ #include "../real/cdh/on_board_computer.hpp" #include "uart_communication_with_obc.hpp" +namespace s2e::components { + /** * @class I2cTargetCommunicationWithObc * @brief Base class for I2C communication as target side with OBC flight software @@ -32,7 +34,7 @@ class I2cTargetCommunicationWithObc { * @param [in] i2c_address: I2C address for the target * @param [in] hils_port_manager: HILS port manager */ - I2cTargetCommunicationWithObc(const unsigned int hils_port_id, const unsigned char i2c_address, HilsPortManager* hils_port_manager); + I2cTargetCommunicationWithObc(const unsigned int hils_port_id, const unsigned char i2c_address, simulation::HilsPortManager* hils_port_manager); /** * @fn I2cTargetCommunicationWithObc * @brief Constructor for both SILS and HILS mode @@ -43,7 +45,7 @@ class I2cTargetCommunicationWithObc { * @param [in] hils_port_manager: HILS port manager */ I2cTargetCommunicationWithObc(const unsigned int sils_port_id, const unsigned int hils_port_id, const unsigned char i2c_address, - OnBoardComputer* obc, HilsPortManager* hils_port_manager); + OnBoardComputer* obc, simulation::HilsPortManager* hils_port_manager); /** * @fn I2cTargetCommunicationWithObc * @brief Prevent double freeing of memory when this class is copied @@ -117,8 +119,10 @@ class I2cTargetCommunicationWithObc { SimulationMode simulation_mode_ = SimulationMode::kError; //!< Simulation mode - OnBoardComputer* obc_; //!< Communication target OBC - HilsPortManager* hils_port_manager_; //!< HILS port manager + OnBoardComputer* obc_; //!< Communication target OBC + simulation::HilsPortManager* hils_port_manager_; //!< HILS port manager }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_I2C_TARGET_COMMUNICATION_WITH_OBC_HPP_ diff --git a/src/components/base/interface_gpio_component.hpp b/src/components/base/interface_gpio_component.hpp index 7ed129e7b..9df3db260 100644 --- a/src/components/base/interface_gpio_component.hpp +++ b/src/components/base/interface_gpio_component.hpp @@ -6,6 +6,8 @@ #ifndef S2E_COMPONENTS_BASE_CLASSES_INTERFACE_GPIO_COMPONENT_HPP_ #define S2E_COMPONENTS_BASE_CLASSES_INTERFACE_GPIO_COMPONENT_HPP_ +namespace s2e::components { + /** * @class IGPIOCompo * @brief Interface class for components which have GPIO port @@ -27,4 +29,6 @@ class IGPIOCompo { virtual void GpioStateChanged(const int port_id, const bool is_positive_edge) = 0; }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_CLASSES_INTERFACE_GPIO_COMPONENT_HPP_ diff --git a/src/components/base/interface_tickable.hpp b/src/components/base/interface_tickable.hpp index 3d7171aeb..401c5d87b 100644 --- a/src/components/base/interface_tickable.hpp +++ b/src/components/base/interface_tickable.hpp @@ -6,6 +6,8 @@ #ifndef S2E_COMPONENTS_BASE_CLASSES_INTERFACE_TICKABLE_HPP_ #define S2E_COMPONENTS_BASE_CLASSES_INTERFACE_TICKABLE_HPP_ +namespace s2e::components { + /** * @class ITickable * @brief Interface class for time update of components @@ -40,4 +42,6 @@ class ITickable { bool needs_fast_update_ = false; //!< Whether or not high-frequency disturbances need to be calculated }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_CLASSES_INTERFACE_TICKABLE_HPP_ diff --git a/src/components/base/sensor.hpp b/src/components/base/sensor.hpp index 111e71226..3204a1783 100644 --- a/src/components/base/sensor.hpp +++ b/src/components/base/sensor.hpp @@ -6,10 +6,12 @@ #ifndef S2E_COMPONENTS_BASE_SENSOR_HPP_ #define S2E_COMPONENTS_BASE_SENSOR_HPP_ -#include -#include -#include -#include +#include +#include +#include +#include + +namespace s2e::components { /** * @class Sensor @@ -31,9 +33,9 @@ class Sensor { * @param [in] random_walk_standard_deviation_c: Standard deviation of random wark at the component frame * @param [in] random_walk_limit_c: Limit of random walk at the component frame */ - Sensor(const libra::Matrix& scale_factor, const libra::Vector& range_to_const_c, const libra::Vector& range_to_zero_c, - const libra::Vector& bias_noise_c, const libra::Vector& normal_random_standard_deviation_c, const double random_walk_step_width_s, - const libra::Vector& random_walk_standard_deviation_c, const libra::Vector& random_walk_limit_c); + Sensor(const math::Matrix& scale_factor, const math::Vector& range_to_const_c, const math::Vector& range_to_zero_c, + const math::Vector& bias_noise_c, const math::Vector& normal_random_standard_deviation_c, const double random_walk_step_width_s, + const math::Vector& random_walk_standard_deviation_c, const math::Vector& random_walk_limit_c); /** * @fn ~Sensor * @brief Destructor @@ -41,7 +43,7 @@ class Sensor { ~Sensor(); protected: - libra::Vector bias_noise_c_; //!< Constant bias noise at the component frame + math::Vector bias_noise_c_; //!< Constant bias noise at the component frame /** * @fn Measure @@ -49,14 +51,14 @@ class Sensor { * @param [in] true_value_c: True value at the component frame * @return Observed value with noise at the component frame */ - libra::Vector Measure(const libra::Vector true_value_c); + math::Vector Measure(const math::Vector true_value_c); private: - libra::Matrix scale_factor_; //!< Scale factor matrix - libra::Vector range_to_const_c_; //!< Output range limit to be constant output value at the component frame - libra::Vector range_to_zero_c_; //!< Output range limit to be zero output value at the component frame - libra::NormalRand normal_random_noise_c_[N]; //!< Normal random - RandomWalk random_walk_noise_c_; //!< Random Walk + math::Matrix scale_factor_; //!< Scale factor matrix + math::Vector range_to_const_c_; //!< Output range limit to be constant output value at the component frame + math::Vector range_to_zero_c_; //!< Output range limit to be zero output value at the component frame + randomization::NormalRand normal_random_noise_c_[N]; //!< Normal random + randomization::RandomWalk random_walk_noise_c_; //!< Random Walk /** * @fn Clip @@ -64,7 +66,7 @@ class Sensor { * @param [in] input_c: Input value at the component frame * @return Clipped value */ - libra::Vector Clip(const libra::Vector input_c); + math::Vector Clip(const math::Vector input_c); /** * @fn RangeCheck * @brief Check the range_to_const_c_ and range_to_zero_c_ is correct and fixed the values @@ -85,6 +87,8 @@ template Sensor ReadSensorInformation(const std::string file_name, const double step_width_s, const std::string component_name, const std::string unit = ""); +} // namespace s2e::components + #include "./sensor_template_functions.hpp" #endif // S2E_COMPONENTS_BASE_SENSOR_HPP_ diff --git a/src/components/base/sensor_template_functions.hpp b/src/components/base/sensor_template_functions.hpp index 3c3f46cd5..469a3e2b1 100644 --- a/src/components/base/sensor_template_functions.hpp +++ b/src/components/base/sensor_template_functions.hpp @@ -6,21 +6,23 @@ #ifndef S2E_COMPONENTS_BASE_SENSOR_TEMPLATE_FUNCTIONS_HPP_ #define S2E_COMPONENTS_BASE_SENSOR_TEMPLATE_FUNCTIONS_HPP_ -#include -#include +#include +#include + +namespace s2e::components { template -Sensor::Sensor(const libra::Matrix& scale_factor, const libra::Vector& range_to_const_c, const libra::Vector& range_to_zero_c, - const libra::Vector& bias_noise_c, const libra::Vector& normal_random_standard_deviation_c, - const double random_walk_step_width_s, const libra::Vector& random_walk_standard_deviation_c, - const libra::Vector& random_walk_limit_c) +Sensor::Sensor(const math::Matrix& scale_factor, const math::Vector& range_to_const_c, const math::Vector& range_to_zero_c, + const math::Vector& bias_noise_c, const math::Vector& normal_random_standard_deviation_c, + const double random_walk_step_width_s, const math::Vector& random_walk_standard_deviation_c, + const math::Vector& random_walk_limit_c) : bias_noise_c_(bias_noise_c), scale_factor_(scale_factor), range_to_const_c_(range_to_const_c), range_to_zero_c_(range_to_zero_c), random_walk_noise_c_(random_walk_step_width_s, random_walk_standard_deviation_c, random_walk_limit_c) { for (size_t i = 0; i < N; i++) { - normal_random_noise_c_[i].SetParameters(0.0, normal_random_standard_deviation_c[i], global_randomization.MakeSeed()); + normal_random_noise_c_[i].SetParameters(0.0, normal_random_standard_deviation_c[i], randomization::global_randomization.MakeSeed()); } RangeCheck(); } @@ -29,8 +31,8 @@ template Sensor::~Sensor() {} template -libra::Vector Sensor::Measure(const libra::Vector true_value_c) { - libra::Vector calc_value_c; +math::Vector Sensor::Measure(const math::Vector true_value_c) { + math::Vector calc_value_c; calc_value_c = scale_factor_ * true_value_c; calc_value_c += bias_noise_c_; for (size_t i = 0; i < N; ++i) { @@ -42,8 +44,8 @@ libra::Vector Sensor::Measure(const libra::Vector true_value_c) { } template -libra::Vector Sensor::Clip(const libra::Vector input_c) { - libra::Vector output_c; +math::Vector Sensor::Clip(const math::Vector input_c) { + math::Vector output_c; for (size_t i = 0; i < N; ++i) { if (input_c[i] >= range_to_const_c_[i] && input_c[i] < range_to_zero_c_[i]) { output_c[i] = range_to_const_c_[i]; @@ -77,14 +79,14 @@ void Sensor::RangeCheck(void) { template Sensor ReadSensorInformation(const std::string file_name, const double step_width_s, const std::string component_name, const std::string unit) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); std::string section = "SENSOR_BASE_" + component_name; - libra::Vector scale_factor_vector; + math::Vector scale_factor_vector; ini_file.ReadVector(section.c_str(), "scale_factor_c", scale_factor_vector); - libra::Matrix scale_factor_c; + math::Matrix scale_factor_c; if (scale_factor_vector.CalcNorm() == 0.0) { - scale_factor_c = libra::MakeIdentityMatrix(); + scale_factor_c = math::MakeIdentityMatrix(); } else { for (size_t i = 0; i < N; i++) { for (size_t j = 0; j < N; j++) { @@ -94,26 +96,26 @@ Sensor ReadSensorInformation(const std::string file_name, const double step_w } std::string key_name; - libra::Vector constant_bias_c; + math::Vector constant_bias_c; key_name = "constant_bias_c_" + unit; ini_file.ReadVector(section.c_str(), key_name.c_str(), constant_bias_c); - libra::Vector normal_random_standard_deviation_c; + math::Vector normal_random_standard_deviation_c; key_name = "normal_random_standard_deviation_c_" + unit; ini_file.ReadVector(section.c_str(), key_name.c_str(), normal_random_standard_deviation_c); - libra::Vector random_walk_standard_deviation_c; + math::Vector random_walk_standard_deviation_c; key_name = "random_walk_standard_deviation_c_" + unit; ini_file.ReadVector(section.c_str(), key_name.c_str(), random_walk_standard_deviation_c); - libra::Vector random_walk_limit_c; + math::Vector random_walk_limit_c; key_name = "random_walk_limit_c_" + unit; ini_file.ReadVector(section.c_str(), key_name.c_str(), random_walk_limit_c); key_name = "range_to_constant_" + unit; double range_to_const = ini_file.ReadDouble(section.c_str(), key_name.c_str()); - libra::Vector range_to_const_c{range_to_const}; + math::Vector range_to_const_c{range_to_const}; key_name = "range_to_zero_" + unit; double range_to_zero = ini_file.ReadDouble(section.c_str(), key_name.c_str()); - libra::Vector range_to_zero_c{range_to_zero}; + math::Vector range_to_zero_c{range_to_zero}; Sensor sensor_base(scale_factor_c, range_to_const_c, range_to_zero_c, constant_bias_c, normal_random_standard_deviation_c, step_width_s, random_walk_standard_deviation_c, random_walk_limit_c); @@ -121,4 +123,6 @@ Sensor ReadSensorInformation(const std::string file_name, const double step_w return sensor_base; } +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_SENSOR_TEMPLATE_FUNCTIONS_HPP_ diff --git a/src/components/base/uart_communication_with_obc.cpp b/src/components/base/uart_communication_with_obc.cpp index 47df421d4..74a7f92e6 100644 --- a/src/components/base/uart_communication_with_obc.cpp +++ b/src/components/base/uart_communication_with_obc.cpp @@ -7,6 +7,8 @@ #include +namespace s2e::components { + UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int sils_port_id, OnBoardComputer* obc) : sils_port_id_(sils_port_id), obc_(obc) { #ifdef USE_HILS simulation_mode_ = SimulationMode::kError; @@ -33,7 +35,8 @@ UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int sils_port_ InitializeObcComBase(); } -UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, HilsPortManager* hils_port_manager) +UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, + simulation::HilsPortManager* hils_port_manager) : hils_port_id_(hils_port_id), baud_rate_(baud_rate), hils_port_manager_(hils_port_manager) { #ifdef USE_HILS simulation_mode_ = SimulationMode::kHils; @@ -47,7 +50,7 @@ UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int hils_port_ } UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, const unsigned int tx_buffer_size, - const unsigned int rx_buffer_size, HilsPortManager* hils_port_manager) + const unsigned int rx_buffer_size, simulation::HilsPortManager* hils_port_manager) : hils_port_id_(hils_port_id), baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size), @@ -65,7 +68,7 @@ UartCommunicationWithObc::UartCommunicationWithObc(const unsigned int hils_port_ } UartCommunicationWithObc::UartCommunicationWithObc(const int sils_port_id, OnBoardComputer* obc, const unsigned int hils_port_id, - const unsigned int baud_rate, HilsPortManager* hils_port_manager) + const unsigned int baud_rate, simulation::HilsPortManager* hils_port_manager) : sils_port_id_(sils_port_id), hils_port_id_(hils_port_id), baud_rate_(baud_rate), obc_(obc), hils_port_manager_(hils_port_manager) { #ifdef USE_HILS simulation_mode_ = SimulationMode::kHils; @@ -173,3 +176,5 @@ int UartCommunicationWithObc::SendTelemetry(const unsigned int offset) { return -1; } } + +} // namespace s2e::components diff --git a/src/components/base/uart_communication_with_obc.hpp b/src/components/base/uart_communication_with_obc.hpp index 0db74815b..ec887a685 100644 --- a/src/components/base/uart_communication_with_obc.hpp +++ b/src/components/base/uart_communication_with_obc.hpp @@ -10,6 +10,8 @@ #include "../real/cdh/on_board_computer.hpp" +namespace s2e::components { + /** * @enum SimulationMode * @brief Simulation mode (SILS or HILS) @@ -54,7 +56,7 @@ class UartCommunicationWithObc { * @param [in] baud_rate: Baud rate of HILS communication port * @param [in] hils_port_manager: HILS port manager */ - UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, HilsPortManager* hils_port_manager); + UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, simulation::HilsPortManager* hils_port_manager); /** * @fn UartCommunicationWithObc * @brief Constructor for HILS mode @@ -65,7 +67,7 @@ class UartCommunicationWithObc { * @param [in] hils_port_manager: HILS port manager */ UartCommunicationWithObc(const unsigned int hils_port_id, const unsigned int baud_rate, const unsigned int tx_buffer_size, - const unsigned int rx_buffer_size, HilsPortManager* hils_port_manager); + const unsigned int rx_buffer_size, simulation::HilsPortManager* hils_port_manager); /** * @fn UartCommunicationWithObc * @brief Constructor for both SILS and HILS mode @@ -77,7 +79,7 @@ class UartCommunicationWithObc { * @param [in] hils_port_manager: HILS port manager */ UartCommunicationWithObc(const int sils_port_id, OnBoardComputer* obc, const unsigned int hils_port_id, const unsigned int baud_rate, - HilsPortManager* hils_port_manager); + simulation::HilsPortManager* hils_port_manager); /** * @fn ~UartCommunicationWithObc * @brief Destructor @@ -107,8 +109,8 @@ class UartCommunicationWithObc { SimulationMode simulation_mode_ = SimulationMode::kError; //!< Simulation mode - OnBoardComputer* obc_; //!< Communication target OBC - HilsPortManager* hils_port_manager_; //!< HILS port manager + OnBoardComputer* obc_; //!< Communication target OBC + simulation::HilsPortManager* hils_port_manager_; //!< HILS port manager /** * @fn InitializeObcComBase @@ -129,4 +131,6 @@ class UartCommunicationWithObc { virtual int GenerateTelemetry() = 0; }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_BASE_UART_COMMUNICATION_WITH_OBC_HPP_ diff --git a/src/components/examples/example_change_structure.cpp b/src/components/examples/example_change_structure.cpp index 1dcd29b04..e16ca7ac4 100644 --- a/src/components/examples/example_change_structure.cpp +++ b/src/components/examples/example_change_structure.cpp @@ -5,9 +5,11 @@ #include "example_change_structure.hpp" -#include +#include -ExampleChangeStructure::ExampleChangeStructure(ClockGenerator* clock_generator, Structure* structure) +namespace s2e::components { + +ExampleChangeStructure::ExampleChangeStructure(environment::ClockGenerator* clock_generator, spacecraft::Structure* structure) : Component(1, clock_generator), structure_(structure) {} ExampleChangeStructure::~ExampleChangeStructure() {} @@ -18,14 +20,14 @@ void ExampleChangeStructure::MainRoutine(const int time_count) { structure_->GetToSetKinematicsParameters().SetMass_kg(100.0); // Center of gravity - Vector<3> cg(0.0); + math::Vector<3> cg(0.0); cg[0] = 0.01; cg[1] = -0.01; cg[2] = 0.02; structure_->GetToSetKinematicsParameters().SetCenterOfGravityVector_b_m(cg); // RMM - Vector<3> rmm(0.0); + math::Vector<3> rmm(0.0); rmm[0] = 0.1; rmm[1] = -0.1; rmm[2] = 0.2; @@ -35,7 +37,7 @@ void ExampleChangeStructure::MainRoutine(const int time_count) { structure_->GetToSetSurfaces()[0].SetArea_m2(0.5); // Inertia Tensor - libra::Matrix<3, 3> inertia_tensor_b_kgm2(0.0); + math::Matrix<3, 3> inertia_tensor_b_kgm2(0.0); inertia_tensor_b_kgm2[0][0] = 0.2; inertia_tensor_b_kgm2[1][1] = 0.2; inertia_tensor_b_kgm2[2][2] = 0.2; @@ -54,3 +56,5 @@ std::string ExampleChangeStructure::GetLogValue() const { return str_tmp; } + +} // namespace s2e::components diff --git a/src/components/examples/example_change_structure.hpp b/src/components/examples/example_change_structure.hpp index 4aa28713f..7207ebc73 100644 --- a/src/components/examples/example_change_structure.hpp +++ b/src/components/examples/example_change_structure.hpp @@ -6,16 +6,18 @@ #ifndef S2E_COMPONENTS_EXAMPLES_EXAMPLE_CHANGE_STRUCTURE_HPP_ #define S2E_COMPONENTS_EXAMPLES_EXAMPLE_CHANGE_STRUCTURE_HPP_ -#include +#include #include #include "../base/component.hpp" +namespace s2e::components { + /** * @class ExampleChangeStructure * @brief Class to show an example to change satellite structure information */ -class ExampleChangeStructure : public Component, public ILoggable { +class ExampleChangeStructure : public Component, public logger::ILoggable { public: /** * @fn ExampleChangeStructure @@ -23,7 +25,7 @@ class ExampleChangeStructure : public Component, public ILoggable { * @param [in] clock_generator: Clock generator * @param [in] structure: Structure information */ - ExampleChangeStructure(ClockGenerator* clock_generator, Structure* structure); + ExampleChangeStructure(environment::ClockGenerator* clock_generator, spacecraft::Structure* structure); /** * @fn ~ChangeStructure * @brief Destructor @@ -50,7 +52,9 @@ class ExampleChangeStructure : public Component, public ILoggable { virtual std::string GetLogValue() const override; protected: - Structure* structure_; //!< Structure information + spacecraft::Structure* structure_; //!< Structure information }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_EXAMPLES_EXAMPLE_CHANGE_STRUCTURE_HPP_ diff --git a/src/components/examples/example_i2c_controller_for_hils.cpp b/src/components/examples/example_i2c_controller_for_hils.cpp index 1924ec1c8..892268768 100644 --- a/src/components/examples/example_i2c_controller_for_hils.cpp +++ b/src/components/examples/example_i2c_controller_for_hils.cpp @@ -4,9 +4,12 @@ */ #include "example_i2c_controller_for_hils.hpp" -ExampleI2cControllerForHils::ExampleI2cControllerForHils(const int prescaler, ClockGenerator* clock_generator, const unsigned int hils_port_id, - const unsigned int baud_rate, const unsigned int tx_buffer_size, - const unsigned int rx_buffer_size, HilsPortManager* hils_port_manager) +namespace s2e::components { + +ExampleI2cControllerForHils::ExampleI2cControllerForHils(const int prescaler, environment::ClockGenerator* clock_generator, + const unsigned int hils_port_id, const unsigned int baud_rate, + const unsigned int tx_buffer_size, const unsigned int rx_buffer_size, + simulation::HilsPortManager* hils_port_manager) : Component(prescaler, clock_generator), I2cController(hils_port_id, baud_rate, tx_buffer_size, rx_buffer_size, hils_port_manager) {} ExampleI2cControllerForHils::~ExampleI2cControllerForHils() {} @@ -54,3 +57,5 @@ void ExampleI2cControllerForHils::Receive() { std::cout << std::endl; return; } + +} // namespace s2e::components diff --git a/src/components/examples/example_i2c_controller_for_hils.hpp b/src/components/examples/example_i2c_controller_for_hils.hpp index 51b948708..84254633f 100644 --- a/src/components/examples/example_i2c_controller_for_hils.hpp +++ b/src/components/examples/example_i2c_controller_for_hils.hpp @@ -11,6 +11,8 @@ #include "../base/component.hpp" #include "../base/i2c_controller.hpp" +namespace s2e::components { + /** * @class ExampleI2cControllerForHils * @brief Example of component emulation for I2C controller side communication in HILS environment @@ -31,8 +33,9 @@ class ExampleI2cControllerForHils : public Component, public I2cController { * @param [in] rx_buffer_size: RX (Target to Controller) buffer size * @param [in] hils_port_manager: HILS port manager */ - ExampleI2cControllerForHils(const int prescaler, ClockGenerator* clock_generator, const unsigned int hils_port_id, const unsigned int baud_rate, - const unsigned int tx_buffer_size, const unsigned int rx_buffer_size, HilsPortManager* hils_port_manager); + ExampleI2cControllerForHils(const int prescaler, environment::ClockGenerator* clock_generator, const unsigned int hils_port_id, + const unsigned int baud_rate, const unsigned int tx_buffer_size, const unsigned int rx_buffer_size, + simulation::HilsPortManager* hils_port_manager); /** * @fn ~ExampleI2cControllerForHils * @brief Destructor @@ -65,4 +68,6 @@ class ExampleI2cControllerForHils : public Component, public I2cController { static const uint8_t kCmdFooter_ = 0x50; //!< 'P' Footer for SC18IM700 }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_EXAMPLES_EXAMPLE_I2C_CONTROLLER_FOR_HILS_HPP_ diff --git a/src/components/examples/example_i2c_target_for_hils.cpp b/src/components/examples/example_i2c_target_for_hils.cpp index 3ec63ed3e..b278d7313 100644 --- a/src/components/examples/example_i2c_target_for_hils.cpp +++ b/src/components/examples/example_i2c_target_for_hils.cpp @@ -5,9 +5,11 @@ #include "example_i2c_target_for_hils.hpp" -ExampleI2cTargetForHils::ExampleI2cTargetForHils(const int prescaler, ClockGenerator* clock_generator, const int sils_port_id, +namespace s2e::components { + +ExampleI2cTargetForHils::ExampleI2cTargetForHils(const int prescaler, environment::ClockGenerator* clock_generator, const int sils_port_id, unsigned char i2c_address, OnBoardComputer* obc, const unsigned int hils_port_id, - HilsPortManager* hils_port_manager) + simulation::HilsPortManager* hils_port_manager) : Component(prescaler, clock_generator), I2cTargetCommunicationWithObc(sils_port_id, hils_port_id, i2c_address, obc, hils_port_manager) {} ExampleI2cTargetForHils::~ExampleI2cTargetForHils() {} @@ -39,3 +41,5 @@ void ExampleI2cTargetForHils::MainRoutine(const int time_count) { return; } + +} // namespace s2e::components diff --git a/src/components/examples/example_i2c_target_for_hils.hpp b/src/components/examples/example_i2c_target_for_hils.hpp index 9c486995f..0e6faf2bd 100644 --- a/src/components/examples/example_i2c_target_for_hils.hpp +++ b/src/components/examples/example_i2c_target_for_hils.hpp @@ -11,6 +11,8 @@ #include "../base/component.hpp" #include "../base/i2c_target_communication_with_obc.hpp" +namespace s2e::components { + /** * @class ExampleI2cTargetForHils * @brief Example of component emulation for I2C target side communication in HILS environment @@ -32,8 +34,8 @@ class ExampleI2cTargetForHils : public Component, public I2cTargetCommunicationW * @param [in] hils_port_id: ID of HILS communication port * @param [in] hils_port_manager: HILS port manager */ - ExampleI2cTargetForHils(const int prescaler, ClockGenerator* clock_generator, const int sils_port_id, unsigned char i2c_address, - OnBoardComputer* obc, const unsigned int hils_port_id, HilsPortManager* hils_port_manager); + ExampleI2cTargetForHils(const int prescaler, environment::ClockGenerator* clock_generator, const int sils_port_id, unsigned char i2c_address, + OnBoardComputer* obc, const unsigned int hils_port_id, simulation::HilsPortManager* hils_port_manager); /** * @fn ~ExampleI2cTargetForHils * @brief Destructor @@ -54,4 +56,6 @@ class ExampleI2cTargetForHils : public Component, public I2cTargetCommunicationW const unsigned char kNumAlphabet = 26; //!< Number of alphabet }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_EXAMPLES_EXAMPLE_I2C_TARGET_FOR_HILS_HPP_ diff --git a/src/components/examples/example_serial_communication_for_hils.cpp b/src/components/examples/example_serial_communication_for_hils.cpp index 8986e85db..f39bc91fd 100644 --- a/src/components/examples/example_serial_communication_for_hils.cpp +++ b/src/components/examples/example_serial_communication_for_hils.cpp @@ -4,11 +4,14 @@ */ #include "example_serial_communication_for_hils.hpp" -#include +#include -ExampleSerialCommunicationForHils::ExampleSerialCommunicationForHils(ClockGenerator* clock_generator, const int sils_port_id, OnBoardComputer* obc, - const unsigned int hils_port_id, const unsigned int baud_rate, - HilsPortManager* hils_port_manager, const int mode_id) +namespace s2e::components { + +ExampleSerialCommunicationForHils::ExampleSerialCommunicationForHils(environment::ClockGenerator* clock_generator, const int sils_port_id, + OnBoardComputer* obc, const unsigned int hils_port_id, + const unsigned int baud_rate, simulation::HilsPortManager* hils_port_manager, + const int mode_id) : Component(300, clock_generator), UartCommunicationWithObc(sils_port_id, obc, hils_port_id, baud_rate, hils_port_manager), mode_id_(mode_id) {} ExampleSerialCommunicationForHils::~ExampleSerialCommunicationForHils() {} @@ -59,3 +62,5 @@ void ExampleSerialCommunicationForHils::MainRoutine(const int time_count) { ReceiveCommand(0, kMemorySize); SendTelemetry(0); } + +} // namespace s2e::components diff --git a/src/components/examples/example_serial_communication_for_hils.hpp b/src/components/examples/example_serial_communication_for_hils.hpp index 682d4afe0..077c9fc30 100644 --- a/src/components/examples/example_serial_communication_for_hils.hpp +++ b/src/components/examples/example_serial_communication_for_hils.hpp @@ -11,6 +11,8 @@ #include "../base/component.hpp" #include "../base/uart_communication_with_obc.hpp" +namespace s2e::components { + /** * @class ExampleSerialCommunicationForHils * @brief Example of component emulation for communication in HILS environment @@ -34,8 +36,9 @@ class ExampleSerialCommunicationForHils : public Component, public UartCommunica * @param [in] hils_port_manager: HILS port manager * @param [in] mode_id: Mode ID to select sender(0) or responder(1) */ - ExampleSerialCommunicationForHils(ClockGenerator* clock_generator, const int sils_port_id, OnBoardComputer* obc, const unsigned int hils_port_id, - const unsigned int baud_rate, HilsPortManager* hils_port_manager, const int mode_id); + ExampleSerialCommunicationForHils(environment::ClockGenerator* clock_generator, const int sils_port_id, OnBoardComputer* obc, + const unsigned int hils_port_id, const unsigned int baud_rate, simulation::HilsPortManager* hils_port_manager, + const int mode_id); /** * @fn ~ExampleSerialCommunicationForHils * @brief Destructor @@ -71,4 +74,6 @@ class ExampleSerialCommunicationForHils : public Component, public UartCommunica int GenerateTelemetry() override; }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_EXAMPLES_EXAMPLE_SERIAL_COMMUNICATION_FOR_HILS_HPP_ diff --git a/src/components/examples/example_serial_communication_with_obc.cpp b/src/components/examples/example_serial_communication_with_obc.cpp index 4042fbcb1..3017ea96d 100644 --- a/src/components/examples/example_serial_communication_with_obc.cpp +++ b/src/components/examples/example_serial_communication_with_obc.cpp @@ -7,11 +7,13 @@ #include -ExampleSerialCommunicationWithObc::ExampleSerialCommunicationWithObc(ClockGenerator* clock_generator, int port_id, OnBoardComputer* obc) +namespace s2e::components { + +ExampleSerialCommunicationWithObc::ExampleSerialCommunicationWithObc(environment::ClockGenerator* clock_generator, int port_id, OnBoardComputer* obc) : Component(1000, clock_generator), UartCommunicationWithObc(port_id, obc) { Initialize(); } -ExampleSerialCommunicationWithObc::ExampleSerialCommunicationWithObc(ClockGenerator* clock_generator, int port_id, int prescaler, +ExampleSerialCommunicationWithObc::ExampleSerialCommunicationWithObc(environment::ClockGenerator* clock_generator, int port_id, int prescaler, OnBoardComputer* obc) : Component(prescaler, clock_generator), UartCommunicationWithObc(port_id, obc) { Initialize(); @@ -54,3 +56,5 @@ void ExampleSerialCommunicationWithObc::MainRoutine(const int time_count) { void ExampleSerialCommunicationWithObc::GpioStateChanged(const int port_id, const bool is_positive_edge) { printf("interrupted. port id = %d, is positive edge = %d./n", port_id, is_positive_edge); } + +} // namespace s2e::components diff --git a/src/components/examples/example_serial_communication_with_obc.hpp b/src/components/examples/example_serial_communication_with_obc.hpp index a83eb4bcf..d202fbc15 100644 --- a/src/components/examples/example_serial_communication_with_obc.hpp +++ b/src/components/examples/example_serial_communication_with_obc.hpp @@ -12,6 +12,8 @@ #include "../base/interface_gpio_component.hpp" #include "../base/uart_communication_with_obc.hpp" +namespace s2e::components { + /** * @class ExampleSerialCommunicationWithObc * @brief Example of component emulation with communication between OBC flight software @@ -35,7 +37,7 @@ class ExampleSerialCommunicationWithObc : public Component, public UartCommunica * @param [in] port_id: Port ID for communication line b/w OnBoardComputer * @param [in] obc: The communication target OBC */ - ExampleSerialCommunicationWithObc(ClockGenerator* clock_generator, int port_id, OnBoardComputer* obc); + ExampleSerialCommunicationWithObc(environment::ClockGenerator* clock_generator, int port_id, OnBoardComputer* obc); /** * @fn ExampleSerialCommunicationWithObc * @brief Constructor @@ -44,7 +46,7 @@ class ExampleSerialCommunicationWithObc : public Component, public UartCommunica * @param [in] prescaler: Frequency scale factor for update * @param [in] obc: The communication target OBC */ - ExampleSerialCommunicationWithObc(ClockGenerator* clock_generator, int port_id, int prescaler, OnBoardComputer* obc); + ExampleSerialCommunicationWithObc(environment::ClockGenerator* clock_generator, int port_id, int prescaler, OnBoardComputer* obc); /** * @fn ~SerialCommunicationWithObc * @brief Destructor @@ -89,4 +91,6 @@ class ExampleSerialCommunicationWithObc : public Component, public UartCommunica int Initialize(); }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_EXAMPLES_EXAMPLE_SERIAL_COMMUNICATION_WITH_OBC_HPP_P_ diff --git a/src/components/ideal/angular_velocity_observer.cpp b/src/components/ideal/angular_velocity_observer.cpp index 48b076140..3b72b890b 100644 --- a/src/components/ideal/angular_velocity_observer.cpp +++ b/src/components/ideal/angular_velocity_observer.cpp @@ -5,9 +5,12 @@ #include "angular_velocity_observer.hpp" -#include +#include -AngularVelocityObserver::AngularVelocityObserver(const int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const Attitude& attitude) +namespace s2e::components { + +AngularVelocityObserver::AngularVelocityObserver(const int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, + const dynamics::attitude::Attitude& attitude) : Component(prescaler, clock_generator), Sensor(sensor_base), attitude_(attitude) {} void AngularVelocityObserver::MainRoutine(const int time_count) { @@ -19,7 +22,7 @@ std::string AngularVelocityObserver::GetLogHeader() const { std::string str_tmp = ""; std::string sensor_name = "angular_velocity_observer_"; - str_tmp += WriteVector(sensor_name + "measured_value", "b", "rad/s", 3); + str_tmp += logger::WriteVector(sensor_name + "measured_value", "b", "rad/s", 3); return str_tmp; } @@ -27,14 +30,14 @@ std::string AngularVelocityObserver::GetLogHeader() const { std::string AngularVelocityObserver::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(angular_velocity_b_rad_s_); + str_tmp += logger::WriteVector(angular_velocity_b_rad_s_); return str_tmp; } -AngularVelocityObserver InitializeAngularVelocityObserver(ClockGenerator* clock_generator, const std::string file_name, double component_step_time_s, - const Attitude& attitude) { - IniAccess ini_file(file_name); +AngularVelocityObserver InitializeAngularVelocityObserver(environment::ClockGenerator* clock_generator, const std::string file_name, + double component_step_time_s, const dynamics::attitude::Attitude& attitude) { + setting_file_reader::IniAccess ini_file(file_name); int prescaler = ini_file.ReadInt("COMPONENT_BASE", "prescaler"); if (prescaler <= 1) prescaler = 1; @@ -46,3 +49,5 @@ AngularVelocityObserver InitializeAngularVelocityObserver(ClockGenerator* clock_ return observer; } + +} // namespace s2e::components diff --git a/src/components/ideal/angular_velocity_observer.hpp b/src/components/ideal/angular_velocity_observer.hpp index 9b3fbe006..5f8f10e22 100644 --- a/src/components/ideal/angular_velocity_observer.hpp +++ b/src/components/ideal/angular_velocity_observer.hpp @@ -7,16 +7,18 @@ #define S2E_COMPONENTS_IDEAL_ANGULAR_VELOCITY_OBSERVER_HPP_ #include -#include +#include #include "../base/component.hpp" #include "../base/sensor.hpp" +namespace s2e::components { + /* * @class AngularVelocityObserver * @brief Ideal component which can observe angular velocity */ -class AngularVelocityObserver : public Component, public Sensor<3>, public ILoggable { +class AngularVelocityObserver : public Component, public Sensor<3>, public logger::ILoggable { public: /** * @fn AngularVelocityObserver @@ -26,7 +28,8 @@ class AngularVelocityObserver : public Component, public Sensor<3>, public ILogg * @param [in] sensor_base: Sensor base information * @param [in] dynamics: Dynamics information */ - AngularVelocityObserver(const int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const Attitude& attitude); + AngularVelocityObserver(const int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, + const dynamics::attitude::Attitude& attitude); /** * @fn ~AngularVelocityObserver * @brief Destructor @@ -40,15 +43,15 @@ class AngularVelocityObserver : public Component, public Sensor<3>, public ILogg */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -57,11 +60,11 @@ class AngularVelocityObserver : public Component, public Sensor<3>, public ILogg * @fn GetAngularVelocity_b_rad_s * @brief Return observed angular velocity */ - inline libra::Vector<3> GetAngularVelocity_b_rad_s() const { return angular_velocity_b_rad_s_; } + inline math::Vector<3> GetAngularVelocity_b_rad_s() const { return angular_velocity_b_rad_s_; } protected: - libra::Vector<3> angular_velocity_b_rad_s_{0.0}; //!< Observed angular velocity [rad/s] - const Attitude& attitude_; //!< Dynamics information + math::Vector<3> angular_velocity_b_rad_s_{0.0}; //!< Observed angular velocity [rad/s] + const dynamics::attitude::Attitude& attitude_; //!< Dynamics information }; /** @@ -72,7 +75,9 @@ class AngularVelocityObserver : public Component, public Sensor<3>, public ILogg * @param [in] component_step_time_s: Component step time [sec] * @param [in] dynamics: Dynamics information */ -AngularVelocityObserver InitializeAngularVelocityObserver(ClockGenerator* clock_generator, const std::string file_name, double component_step_time_s, - const Attitude& attitude); +AngularVelocityObserver InitializeAngularVelocityObserver(environment::ClockGenerator* clock_generator, const std::string file_name, + double component_step_time_s, const dynamics::attitude::Attitude& attitude); + +} // namespace s2e::components #endif // S2E_COMPONENTS_IDEAL_ANGULAR_VELOCITY_OBSERVER_HPP_ diff --git a/src/components/ideal/attitude_observer.cpp b/src/components/ideal/attitude_observer.cpp index 7ddaa1a0c..a77c1b429 100644 --- a/src/components/ideal/attitude_observer.cpp +++ b/src/components/ideal/attitude_observer.cpp @@ -5,11 +5,13 @@ #include "attitude_observer.hpp" -#include -#include +#include +#include -AttitudeObserver::AttitudeObserver(const int prescaler, ClockGenerator* clock_generator, const double standard_deviation_rad, - const Attitude& attitude) +namespace s2e::components { + +AttitudeObserver::AttitudeObserver(const int prescaler, environment::ClockGenerator* clock_generator, const double standard_deviation_rad, + const dynamics::attitude::Attitude& attitude) : Component(prescaler, clock_generator), angle_noise_(0.0, standard_deviation_rad), attitude_(attitude) { direction_noise_.SetParameters(0.0, 1.0); } @@ -18,14 +20,14 @@ void AttitudeObserver::MainRoutine(const int time_count) { UNUSED(time_count); // Error calculation - libra::Vector<3> random_direction; + math::Vector<3> random_direction; random_direction[0] = direction_noise_; random_direction[1] = direction_noise_; random_direction[2] = direction_noise_; random_direction = random_direction.CalcNormalizedVector(); double error_angle_rad = angle_noise_; - libra::Quaternion error_quaternion(random_direction, error_angle_rad); + math::Quaternion error_quaternion(random_direction, error_angle_rad); observed_quaternion_i2b_ = error_quaternion * attitude_.GetQuaternion_i2b(); } @@ -34,7 +36,7 @@ std::string AttitudeObserver::GetLogHeader() const { std::string str_tmp = ""; std::string head = "attitude_observer_"; - str_tmp += WriteQuaternion(head + "quaternion", "i2b"); + str_tmp += logger::WriteQuaternion(head + "quaternion", "i2b"); return str_tmp; } @@ -42,14 +44,15 @@ std::string AttitudeObserver::GetLogHeader() const { std::string AttitudeObserver::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteQuaternion(observed_quaternion_i2b_); + str_tmp += logger::WriteQuaternion(observed_quaternion_i2b_); return str_tmp; } -AttitudeObserver InitializeAttitudeObserver(ClockGenerator* clock_generator, const std::string file_name, const Attitude& attitude) { +AttitudeObserver InitializeAttitudeObserver(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::attitude::Attitude& attitude) { // General - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); // CompoBase int prescaler = ini_file.ReadInt("COMPONENT_BASE", "prescaler"); @@ -57,8 +60,10 @@ AttitudeObserver InitializeAttitudeObserver(ClockGenerator* clock_generator, con // AttitudeObserver double error_angle_standard_deviation_deg = ini_file.ReadDouble("ATTITUDE_OBSERVER", "error_angle_standard_deviation_deg"); - double error_angle_standard_deviation_rad = libra::deg_to_rad * error_angle_standard_deviation_deg; + double error_angle_standard_deviation_rad = math::deg_to_rad * error_angle_standard_deviation_deg; AttitudeObserver attitude_observer(prescaler, clock_generator, error_angle_standard_deviation_rad, attitude); return attitude_observer; } + +} // namespace s2e::components diff --git a/src/components/ideal/attitude_observer.hpp b/src/components/ideal/attitude_observer.hpp index 1fafb63a0..410913884 100644 --- a/src/components/ideal/attitude_observer.hpp +++ b/src/components/ideal/attitude_observer.hpp @@ -7,26 +7,29 @@ #define S2E_COMPONENTS_IDEAL_ATTITUDE_OBSERVER_HPP_ #include -#include -#include -#include +#include +#include +#include #include "../base/component.hpp" +namespace s2e::components { + /* * @class AttitudeObserver * @brief Ideal component which can observe attitude */ -class AttitudeObserver : public Component, public ILoggable { +class AttitudeObserver : public Component, public logger::ILoggable { public: /** * @fn AttitudeObserver * @brief Constructor without power port * @param [in] prescaler: Frequency scale factor for update * @param [in] clock_generator: Clock generator - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information */ - AttitudeObserver(const int prescaler, ClockGenerator* clock_generator, const double standard_deviation_rad, const Attitude& attitude); + AttitudeObserver(const int prescaler, environment::ClockGenerator* clock_generator, const double standard_deviation_rad, + const dynamics::attitude::Attitude& attitude); /** * @fn ~AttitudeObserver @@ -41,15 +44,15 @@ class AttitudeObserver : public Component, public ILoggable { */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -57,15 +60,15 @@ class AttitudeObserver : public Component, public ILoggable { * @fn GetQuaternion_i2c * @brief Return observed quaternion from the inertial frame to the body-fixed frame */ - inline const libra::Quaternion GetQuaternion_i2b() const { return observed_quaternion_i2b_; }; + inline const math::Quaternion GetQuaternion_i2b() const { return observed_quaternion_i2b_; }; protected: - libra::Quaternion observed_quaternion_i2b_ = {0.0, 0.0, 0.0, 1.0}; //!< Observed quaternion + math::Quaternion observed_quaternion_i2b_ = {0.0, 0.0, 0.0, 1.0}; //!< Observed quaternion - libra::NormalRand angle_noise_; //!< Normal random for magnitude noise - libra::NormalRand direction_noise_; //!< Normal random for direction noise + randomization::NormalRand angle_noise_; //!< Normal random for magnitude noise + randomization::NormalRand direction_noise_; //!< Normal random for direction noise - const Attitude& attitude_; //!< Attitude information + const dynamics::attitude::Attitude& attitude_; //!< dynamics::attitude::Attitude information }; /** @@ -73,8 +76,11 @@ class AttitudeObserver : public Component, public ILoggable { * @brief Initialize functions for AttitudeObserver * @param [in] clock_generator: Clock generator * @param [in] file_name: Path to the initialize file - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information */ -AttitudeObserver InitializeAttitudeObserver(ClockGenerator* clock_generator, const std::string file_name, const Attitude& attitude); +AttitudeObserver InitializeAttitudeObserver(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::attitude::Attitude& attitude); + +} // namespace s2e::components #endif // S2E_COMPONENTS_IDEAL_ATTITUDE_OBSERVER_HPP_ diff --git a/src/components/ideal/force_generator.cpp b/src/components/ideal/force_generator.cpp index 8e7a610b9..2104ad4b9 100644 --- a/src/components/ideal/force_generator.cpp +++ b/src/components/ideal/force_generator.cpp @@ -6,11 +6,13 @@ #include "force_generator.hpp" #include -#include +#include + +namespace s2e::components { // Constructor -ForceGenerator::ForceGenerator(const int prescaler, ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_N, - const double direction_error_standard_deviation_rad, const Dynamics* dynamics) +ForceGenerator::ForceGenerator(const int prescaler, environment::ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_N, + const double direction_error_standard_deviation_rad, const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator), magnitude_noise_(0.0, magnitude_error_standard_deviation_N), direction_error_standard_deviation_rad_(direction_error_standard_deviation_rad), @@ -29,16 +31,16 @@ void ForceGenerator::MainRoutine(const int time_count) { double norm_ordered_force = ordered_force_b_N_.CalcNorm(); if (norm_ordered_force > 0.0 + DBL_EPSILON) { // Add noise only when the force is generated - libra::Vector<3> true_direction = generated_force_b_N_.CalcNormalizedVector(); - libra::Quaternion error_quaternion = GenerateDirectionNoiseQuaternion(true_direction, direction_error_standard_deviation_rad_); - libra::Vector<3> converted_direction = error_quaternion.FrameConversion(true_direction); + math::Vector<3> true_direction = generated_force_b_N_.CalcNormalizedVector(); + math::Quaternion error_quaternion = GenerateDirectionNoiseQuaternion(true_direction, direction_error_standard_deviation_rad_); + math::Vector<3> converted_direction = error_quaternion.FrameConversion(true_direction); double force_norm_with_error = norm_ordered_force + magnitude_noise_; generated_force_b_N_ = force_norm_with_error * converted_direction; } // Convert frame - libra::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); - libra::Quaternion q_i2rtn = dynamics_->GetOrbit().CalcQuaternion_i2lvlh(); + math::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); + math::Quaternion q_i2rtn = dynamics_->GetOrbit().CalcQuaternion_i2lvlh(); generated_force_i_N_ = q_i2b.InverseFrameConversion(generated_force_b_N_); generated_force_rtn_N_ = q_i2rtn.FrameConversion(generated_force_i_N_); } @@ -49,16 +51,16 @@ void ForceGenerator::PowerOffRoutine() { generated_force_rtn_N_ *= 0.0; } -void ForceGenerator::SetForce_i_N(const libra::Vector<3> force_i_N) { - libra::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); +void ForceGenerator::SetForce_i_N(const math::Vector<3> force_i_N) { + math::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); ordered_force_b_N_ = q_i2b.FrameConversion(force_i_N); } -void ForceGenerator::SetForce_rtn_N(const libra::Vector<3> force_rtn_N) { - libra::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); - libra::Quaternion q_i2rtn = dynamics_->GetOrbit().CalcQuaternion_i2lvlh(); +void ForceGenerator::SetForce_rtn_N(const math::Vector<3> force_rtn_N) { + math::Quaternion q_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); + math::Quaternion q_i2rtn = dynamics_->GetOrbit().CalcQuaternion_i2lvlh(); - libra::Vector<3> force_i_N = q_i2rtn.InverseFrameConversion(force_rtn_N); + math::Vector<3> force_i_N = q_i2rtn.InverseFrameConversion(force_rtn_N); ordered_force_b_N_ = q_i2b.FrameConversion(force_i_N); } @@ -66,10 +68,10 @@ std::string ForceGenerator::GetLogHeader() const { std::string str_tmp = ""; std::string head = "ideal_force_generator_"; - str_tmp += WriteVector(head + "ordered_force", "b", "N", 3); - str_tmp += WriteVector(head + "generated_force", "b", "N", 3); - str_tmp += WriteVector(head + "generated_force", "i", "N", 3); - str_tmp += WriteVector(head + "generated_force", "rtn", "N", 3); + str_tmp += logger::WriteVector(head + "ordered_force", "b", "N", 3); + str_tmp += logger::WriteVector(head + "generated_force", "b", "N", 3); + str_tmp += logger::WriteVector(head + "generated_force", "i", "N", 3); + str_tmp += logger::WriteVector(head + "generated_force", "rtn", "N", 3); return str_tmp; } @@ -77,22 +79,22 @@ std::string ForceGenerator::GetLogHeader() const { std::string ForceGenerator::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(ordered_force_b_N_); - str_tmp += WriteVector(generated_force_b_N_); - str_tmp += WriteVector(generated_force_i_N_); - str_tmp += WriteVector(generated_force_rtn_N_); + str_tmp += logger::WriteVector(ordered_force_b_N_); + str_tmp += logger::WriteVector(generated_force_b_N_); + str_tmp += logger::WriteVector(generated_force_i_N_); + str_tmp += logger::WriteVector(generated_force_rtn_N_); return str_tmp; } -libra::Quaternion ForceGenerator::GenerateDirectionNoiseQuaternion(libra::Vector<3> true_direction, const double error_standard_deviation_rad) { - libra::Vector<3> random_direction; +math::Quaternion ForceGenerator::GenerateDirectionNoiseQuaternion(math::Vector<3> true_direction, const double error_standard_deviation_rad) { + math::Vector<3> random_direction; random_direction[0] = direction_noise_; random_direction[1] = direction_noise_; random_direction[2] = direction_noise_; random_direction = random_direction.CalcNormalizedVector(); - libra::Vector<3> rotation_axis; + math::Vector<3> rotation_axis; rotation_axis = OuterProduct(true_direction, random_direction); double norm_rotation_axis = rotation_axis.CalcNorm(); if (norm_rotation_axis < 0.0 + DBL_EPSILON) { @@ -101,13 +103,14 @@ libra::Quaternion ForceGenerator::GenerateDirectionNoiseQuaternion(libra::Vector } double error_angle_rad = direction_noise_ * error_standard_deviation_rad; - libra::Quaternion error_quaternion(rotation_axis, error_angle_rad); + math::Quaternion error_quaternion(rotation_axis, error_angle_rad); return error_quaternion; } -ForceGenerator InitializeForceGenerator(ClockGenerator* clock_generator, const std::string file_name, const Dynamics* dynamics) { +ForceGenerator InitializeForceGenerator(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::Dynamics* dynamics) { // General - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); // CompoBase int prescaler = ini_file.ReadInt("COMPONENT_BASE", "prescaler"); @@ -117,8 +120,10 @@ ForceGenerator InitializeForceGenerator(ClockGenerator* clock_generator, const s char section[30] = "FORCE_GENERATOR"; double force_magnitude_standard_deviation_N = ini_file.ReadDouble(section, "force_magnitude_standard_deviation_N"); double force_direction_standard_deviation_deg = ini_file.ReadDouble(section, "force_direction_standard_deviation_deg"); - double force_direction_standard_deviation_rad = libra::deg_to_rad * force_direction_standard_deviation_deg; + double force_direction_standard_deviation_rad = math::deg_to_rad * force_direction_standard_deviation_deg; ForceGenerator force_generator(prescaler, clock_generator, force_magnitude_standard_deviation_N, force_direction_standard_deviation_rad, dynamics); return force_generator; } + +} // namespace s2e::components diff --git a/src/components/ideal/force_generator.hpp b/src/components/ideal/force_generator.hpp index 8e1a7d1e6..66fdcadea 100644 --- a/src/components/ideal/force_generator.hpp +++ b/src/components/ideal/force_generator.hpp @@ -8,15 +8,17 @@ #include #include -#include -#include -#include +#include +#include +#include + +namespace s2e::components { /* * @class ForceGenerator * @brief Ideal component which can generate for control algorithm test */ -class ForceGenerator : public Component, public ILoggable { +class ForceGenerator : public Component, public logger::ILoggable { public: /** * @fn ForceGenerator @@ -27,8 +29,8 @@ class ForceGenerator : public Component, public ILoggable { * @param [in] direction_error_standard_deviation_rad: Standard deviation of direction error [rad] * @param [in] dynamics: Dynamics information */ - ForceGenerator(const int prescaler, ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_N, - const double direction_error_standard_deviation_rad, const Dynamics* dynamics); + ForceGenerator(const int prescaler, environment::ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_N, + const double direction_error_standard_deviation_rad, const dynamics::Dynamics* dynamics); /** * @fn ~ForceGenerator * @brief Destructor @@ -47,15 +49,15 @@ class ForceGenerator : public Component, public ILoggable { */ void PowerOffRoutine(); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -64,44 +66,44 @@ class ForceGenerator : public Component, public ILoggable { * @fn GetGeneratedForce_b_N * @brief Return generated force in the body fixed frame [N] */ - inline const Vector<3> GetGeneratedForce_b_N() const { return generated_force_b_N_; }; + inline const math::Vector<3> GetGeneratedForce_b_N() const { return generated_force_b_N_; }; /** * @fn GetGeneratedForce_i_N * @brief Return generated force in the inertial frame [N] */ - inline const Vector<3> GetGeneratedForce_i_N() const { return generated_force_i_N_; }; + inline const math::Vector<3> GetGeneratedForce_i_N() const { return generated_force_i_N_; }; /** * @fn GetGeneratedForce_rtn_N * @brief Return generated force in the RTN frame [N] */ - inline const Vector<3> GetGeneratedForce_rtn_N() const { return generated_force_rtn_N_; }; + inline const math::Vector<3> GetGeneratedForce_rtn_N() const { return generated_force_rtn_N_; }; // Setter /** * @fn SetForce_b_N * @brief Set ordered force in the body fixed frame [N] */ - inline void SetForce_b_N(const libra::Vector<3> force_b_N) { ordered_force_b_N_ = force_b_N; }; + inline void SetForce_b_N(const math::Vector<3> force_b_N) { ordered_force_b_N_ = force_b_N; }; /** * @fn SetForce_i_N * @brief Set ordered force in the inertial frame [N] */ - void SetForce_i_N(const libra::Vector<3> force_i_N); + void SetForce_i_N(const math::Vector<3> force_i_N); /** * @fn SetForce_rtn_N * @brief Set ordered force in the RTN frame [N] */ - void SetForce_rtn_N(const libra::Vector<3> force_rtn_N); + void SetForce_rtn_N(const math::Vector<3> force_rtn_N); protected: - libra::Vector<3> ordered_force_b_N_{0.0}; //!< Ordered force in the body fixed frame [N] - libra::Vector<3> generated_force_b_N_{0.0}; //!< Generated force in the body fixed frame [N] - libra::Vector<3> generated_force_i_N_{0.0}; //!< Generated force in the inertial frame [N] - libra::Vector<3> generated_force_rtn_N_{0.0}; //!< Generated force in the RTN frame [N] + math::Vector<3> ordered_force_b_N_{0.0}; //!< Ordered force in the body fixed frame [N] + math::Vector<3> generated_force_b_N_{0.0}; //!< Generated force in the body fixed frame [N] + math::Vector<3> generated_force_i_N_{0.0}; //!< Generated force in the inertial frame [N] + math::Vector<3> generated_force_rtn_N_{0.0}; //!< Generated force in the RTN frame [N] // Noise - libra::NormalRand magnitude_noise_; //!< Normal random for magnitude noise - libra::NormalRand direction_noise_; //!< Normal random for direction noise + randomization::NormalRand magnitude_noise_; //!< Normal random for magnitude noise + randomization::NormalRand direction_noise_; //!< Normal random for direction noise double direction_error_standard_deviation_rad_; //!< Standard deviation of direction error [rad] /** @@ -110,9 +112,9 @@ class ForceGenerator : public Component, public ILoggable { * @param [in] true_direction: True direction * @param [in] error_standard_deviation_rad: Standard deviation of direction error [rad] */ - libra::Quaternion GenerateDirectionNoiseQuaternion(libra::Vector<3> true_direction, const double error_standard_deviation_rad); + math::Quaternion GenerateDirectionNoiseQuaternion(math::Vector<3> true_direction, const double error_standard_deviation_rad); - const Dynamics* dynamics_; //!< Spacecraft dynamics information + const dynamics::Dynamics* dynamics_; //!< Spacecraft dynamics information }; /** @@ -122,6 +124,9 @@ class ForceGenerator : public Component, public ILoggable { * @param [in] file_name: Path to initialize file * @param [in] dynamics: Dynamics information */ -ForceGenerator InitializeForceGenerator(ClockGenerator* clock_generator, const std::string file_name, const Dynamics* dynamics); +ForceGenerator InitializeForceGenerator(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::Dynamics* dynamics); + +} // namespace s2e::components #endif // S2E_COMPONENTS_IDEAL_FORCE_GENERATOR_HPP_ diff --git a/src/components/ideal/orbit_observer.cpp b/src/components/ideal/orbit_observer.cpp new file mode 100644 index 000000000..ce68afc76 --- /dev/null +++ b/src/components/ideal/orbit_observer.cpp @@ -0,0 +1,107 @@ +/* + * @file orbit_observer.cpp + * @brief Ideal component which can observe orbit + */ + +#include "orbit_observer.hpp" + +#include +#include + +namespace s2e::components { + +OrbitObserver::OrbitObserver(const int prescaler, environment::ClockGenerator* clock_generator, const NoiseFrame noise_frame, + const math::Vector<6> error_standard_deviation, const dynamics::orbit::Orbit& orbit) + : Component(prescaler, clock_generator), noise_frame_(noise_frame), orbit_(orbit) { + for (size_t i = 0; i < 6; i++) { + normal_random_noise_[i].SetParameters(0.0, error_standard_deviation[i], randomization::global_randomization.MakeSeed()); + } +} + +void OrbitObserver::MainRoutine(const int time_count) { + UNUSED(time_count); + + // Calc noise + math::Vector<3> position_error_i_m{0.0}; + math::Vector<3> position_error_rtn_m{0.0}; + math::Vector<3> velocity_error_i_m_s{0.0}; + math::Vector<3> velocity_error_rtn_m_s{0.0}; + math::Quaternion q_i2rtn = orbit_.CalcQuaternion_i2lvlh(); + switch (noise_frame_) { + case NoiseFrame::kInertial: + for (size_t axis = 0; axis < 3; axis++) { + position_error_i_m[axis] = normal_random_noise_[axis]; + velocity_error_i_m_s[axis] = normal_random_noise_[axis + 3]; + } + break; + case NoiseFrame::kRtn: + for (size_t axis = 0; axis < 3; axis++) { + position_error_rtn_m[axis] = normal_random_noise_[axis]; + velocity_error_rtn_m_s[axis] = normal_random_noise_[axis + 3]; + } + // Frame conversion + position_error_i_m = q_i2rtn.InverseFrameConversion(position_error_rtn_m); + // For zero bias noise, we do not need to care the frame rotation effect. + velocity_error_i_m_s = q_i2rtn.InverseFrameConversion(velocity_error_rtn_m_s); + + break; + default: + break; + } + + // Get observed value + observed_position_i_m_ = orbit_.GetPosition_i_m() + position_error_i_m; + observed_velocity_i_m_s_ = orbit_.GetVelocity_i_m_s() + velocity_error_i_m_s; +} + +std::string OrbitObserver::GetLogHeader() const { + std::string str_tmp = ""; + + std::string head = "orbit_observer_"; + str_tmp += logger::WriteVector(head + "position", "i", "m", 3); + str_tmp += logger::WriteVector(head + "velocity", "i", "m/s", 3); + + return str_tmp; +} + +std::string OrbitObserver::GetLogValue() const { + std::string str_tmp = ""; + + str_tmp += logger::WriteVector(observed_position_i_m_, 16); + str_tmp += logger::WriteVector(observed_velocity_i_m_s_, 16); + + return str_tmp; +} + +NoiseFrame SetNoiseFrame(const std::string noise_frame) { + if (noise_frame == "INERTIAL") { + return NoiseFrame::kInertial; + } else if (noise_frame == "RTN") { + return NoiseFrame::kRtn; + } else { + std::cerr << "[WARNINGS] Orbit observer noise frame is not defined!" << std::endl; + std::cerr << "The noise frame is automatically initialized as INERTIAL" << std::endl; + return NoiseFrame::kInertial; + } +} + +OrbitObserver InitializeOrbitObserver(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::orbit::Orbit& orbit) { + // General + setting_file_reader::IniAccess ini_file(file_name); + + // CompoBase + int prescaler = ini_file.ReadInt("COMPONENT_BASE", "prescaler"); + if (prescaler <= 1) prescaler = 1; + + // Noise + const NoiseFrame noise_frame = SetNoiseFrame(ini_file.ReadString("ORBIT_OBSERVER", "noise_frame")); + math::Vector<6> noise_standard_deviation; + ini_file.ReadVector("ORBIT_OBSERVER", "noise_standard_deviation", noise_standard_deviation); + + OrbitObserver orbit_observer(prescaler, clock_generator, noise_frame, noise_standard_deviation, orbit); + + return orbit_observer; +} + +} // namespace s2e::components diff --git a/src/components/ideal/orbit_observer.hpp b/src/components/ideal/orbit_observer.hpp new file mode 100644 index 000000000..17997925b --- /dev/null +++ b/src/components/ideal/orbit_observer.hpp @@ -0,0 +1,112 @@ +/* + * @file orbit_observer.hpp + * @brief Ideal component which can observe orbit + */ + +#ifndef S2E_COMPONENTS_IDEAL_ORBIT_OBSERVER_HPP_ +#define S2E_COMPONENTS_IDEAL_ORBIT_OBSERVER_HPP_ + +#include +#include +#include +#include + +#include "../base/component.hpp" + +namespace s2e::components { + +/** + * @enum NoiseFrame + * @brief Noise definition frame + */ +enum class NoiseFrame { + kInertial, //!< Inertial frame + kRtn, //!< RTN frame +}; + +/* + * @class OrbitObserver + * @brief Ideal component which can observe orbit + */ +class OrbitObserver : public Component, public logger::ILoggable { + public: + /** + * @fn OrbitObserver + * @brief Constructor without power port + * @param [in] prescaler: Frequency scale factor for update + * @param [in] clock_generator: Clock generator + * @param [in] noise_frame: Error frame definition + * @param [in] error_standard_deviation: Position and Velocity standard deviation noise [m, m/s] + * @param [in] orbit: Orbit information + */ + OrbitObserver(const int prescaler, environment::ClockGenerator* clock_generator, const NoiseFrame noise_frame, + const math::Vector<6> error_standard_deviation, const dynamics::orbit::Orbit& orbit); + + /** + * @fn ~AttitudeObserver + * @brief Destructor + */ + ~OrbitObserver() {} + + // Override functions for Component + /** + * @fn MainRoutine + * @brief Main routine for sensor observation + */ + void MainRoutine(const int time_count) override; + + // Override logger::ILoggable + /** + * @fn GetLogHeader + * @brief Override GetLogHeader function of logger::ILoggable + */ + virtual std::string GetLogHeader() const override; + /** + * @fn GetLogValue + * @brief Override GetLogValue function of logger::ILoggable + */ + virtual std::string GetLogValue() const override; + + /** + * @fn GetPosition_i_m + * @brief Return observed position + */ + inline const math::Vector<3> GetPosition_i_m() const { return observed_position_i_m_; }; + + /** + * @fn GetVelocity_i_m_s + * @brief Return observed velocity + */ + inline const math::Vector<3> GetVelocity_i_m_s() const { return observed_velocity_i_m_s_; }; + + protected: + math::Vector<3> observed_position_i_m_{0.0}; //!< Observed position @ inertial frame [m] + math::Vector<3> observed_velocity_i_m_s_{0.0}; //!< Observed velocity @ inertial frame [m/s] + + NoiseFrame noise_frame_; //!< Noise definition frame + randomization::NormalRand normal_random_noise_[6]; //!< Position and Velocity noise [m, m/s] + + // Observed variables + const dynamics::orbit::Orbit& orbit_; //!< Orbit information +}; + +/** + * @fn SetNoiseFrame + * @brief Set NoiseFrame by string + * @param [in] noise_frame: Noise frame name + * @return noise frame + */ +NoiseFrame SetNoiseFrame(const std::string noise_frame); + +/** + * @fn InitStarSensor + * @brief Initialize functions for StarSensor without power port + * @param [in] clock_generator: Clock generator + * @param [in] file_name: Path to the initialize file + * @param [in] orbit: Orbit information + */ +OrbitObserver InitializeOrbitObserver(environment::ClockGenerator* clock_generator, const std::string file_name, const dynamics::orbit::Orbit& orbit); + +} // namespace s2e::components + +#endif // S2E_COMPONENTS_IDEAL_ORBIT_OBSERVER_HPP_ diff --git a/src/components/ideal/torque_generator.cpp b/src/components/ideal/torque_generator.cpp index 5965fdc4e..c64478b6b 100644 --- a/src/components/ideal/torque_generator.cpp +++ b/src/components/ideal/torque_generator.cpp @@ -6,11 +6,14 @@ #include "torque_generator.hpp" #include -#include +#include + +namespace s2e::components { // Constructor -TorqueGenerator::TorqueGenerator(const int prescaler, ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_Nm, - const double direction_error_standard_deviation_rad, const Dynamics* dynamics) +TorqueGenerator::TorqueGenerator(const int prescaler, environment::ClockGenerator* clock_generator, + const double magnitude_error_standard_deviation_Nm, const double direction_error_standard_deviation_rad, + const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator), magnitude_noise_(0.0, magnitude_error_standard_deviation_Nm), direction_error_standard_deviation_rad_(direction_error_standard_deviation_rad), @@ -29,9 +32,9 @@ void TorqueGenerator::MainRoutine(const int time_count) { double norm_ordered_torque = ordered_torque_b_Nm_.CalcNorm(); if (norm_ordered_torque > 0.0 + DBL_EPSILON) { // Add noise only when the torque is generated - libra::Vector<3> true_direction = generated_torque_b_Nm_.CalcNormalizedVector(); - libra::Quaternion error_quaternion = GenerateDirectionNoiseQuaternion(true_direction, direction_error_standard_deviation_rad_); - libra::Vector<3> converted_direction = error_quaternion.FrameConversion(true_direction); + math::Vector<3> true_direction = generated_torque_b_Nm_.CalcNormalizedVector(); + math::Quaternion error_quaternion = GenerateDirectionNoiseQuaternion(true_direction, direction_error_standard_deviation_rad_); + math::Vector<3> converted_direction = error_quaternion.FrameConversion(true_direction); double torque_norm_with_error = norm_ordered_torque + magnitude_noise_; generated_torque_b_Nm_ = torque_norm_with_error * converted_direction; } @@ -43,8 +46,8 @@ std::string TorqueGenerator::GetLogHeader() const { std::string str_tmp = ""; std::string head = "ideal_torque_generator_"; - str_tmp += WriteVector(head + "ordered_torque", "b", "Nm", 3); - str_tmp += WriteVector(head + "generated_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector(head + "ordered_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector(head + "generated_torque", "b", "Nm", 3); return str_tmp; } @@ -52,20 +55,20 @@ std::string TorqueGenerator::GetLogHeader() const { std::string TorqueGenerator::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(ordered_torque_b_Nm_); - str_tmp += WriteVector(generated_torque_b_Nm_); + str_tmp += logger::WriteVector(ordered_torque_b_Nm_); + str_tmp += logger::WriteVector(generated_torque_b_Nm_); return str_tmp; } -libra::Quaternion TorqueGenerator::GenerateDirectionNoiseQuaternion(libra::Vector<3> true_direction, const double error_standard_deviation_rad) { - libra::Vector<3> random_direction; +math::Quaternion TorqueGenerator::GenerateDirectionNoiseQuaternion(math::Vector<3> true_direction, const double error_standard_deviation_rad) { + math::Vector<3> random_direction; random_direction[0] = direction_noise_; random_direction[1] = direction_noise_; random_direction[2] = direction_noise_; random_direction = random_direction.CalcNormalizedVector(); - libra::Vector<3> rotation_axis; + math::Vector<3> rotation_axis; rotation_axis = OuterProduct(true_direction, random_direction); double norm_rotation_axis = rotation_axis.CalcNorm(); if (norm_rotation_axis < 0.0 + DBL_EPSILON) { @@ -74,13 +77,14 @@ libra::Quaternion TorqueGenerator::GenerateDirectionNoiseQuaternion(libra::Vecto } double error_angle_rad = direction_noise_ * error_standard_deviation_rad; - libra::Quaternion error_quaternion(rotation_axis, error_angle_rad); + math::Quaternion error_quaternion(rotation_axis, error_angle_rad); return error_quaternion; } -TorqueGenerator InitializeTorqueGenerator(ClockGenerator* clock_generator, const std::string file_name, const Dynamics* dynamics) { +TorqueGenerator InitializeTorqueGenerator(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::Dynamics* dynamics) { // General - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); // CompoBase int prescaler = ini_file.ReadInt("COMPONENT_BASE", "prescaler"); @@ -90,9 +94,11 @@ TorqueGenerator InitializeTorqueGenerator(ClockGenerator* clock_generator, const char section[30] = "TORQUE_GENERATOR"; double torque_magnitude_standard_deviation_Nm = ini_file.ReadDouble(section, "torque_magnitude_standard_deviation_Nm"); double torque_direction_standard_deviation_deg = ini_file.ReadDouble(section, "torque_direction_standard_deviation_deg"); - double torque_direction_standard_deviation_rad = libra::deg_to_rad * torque_direction_standard_deviation_deg; + double torque_direction_standard_deviation_rad = math::deg_to_rad * torque_direction_standard_deviation_deg; TorqueGenerator torque_generator(prescaler, clock_generator, torque_magnitude_standard_deviation_Nm, torque_direction_standard_deviation_rad, dynamics); return torque_generator; } + +} // namespace s2e::components diff --git a/src/components/ideal/torque_generator.hpp b/src/components/ideal/torque_generator.hpp index 78474917b..726f7aed8 100644 --- a/src/components/ideal/torque_generator.hpp +++ b/src/components/ideal/torque_generator.hpp @@ -8,15 +8,17 @@ #include #include -#include -#include -#include +#include +#include +#include + +namespace s2e::components { /* * @class TorqueGenerator * @brief Ideal component which can generate for control algorithm test */ -class TorqueGenerator : public Component, public ILoggable { +class TorqueGenerator : public Component, public logger::ILoggable { public: /** * @fn TorqueGenerator @@ -27,8 +29,8 @@ class TorqueGenerator : public Component, public ILoggable { * @param [in] direction_error_standard_deviation_rad: Standard deviation of direction error [rad] * @param [in] dynamics: Dynamics information */ - TorqueGenerator(const int prescaler, ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_Nm, - const double direction_error_standard_deviation_rad, const Dynamics* dynamics); + TorqueGenerator(const int prescaler, environment::ClockGenerator* clock_generator, const double magnitude_error_standard_deviation_Nm, + const double direction_error_standard_deviation_rad, const dynamics::Dynamics* dynamics); /** * @fn ~TorqueGenerator * @brief Destructor @@ -47,15 +49,15 @@ class TorqueGenerator : public Component, public ILoggable { */ void PowerOffRoutine(); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -64,22 +66,22 @@ class TorqueGenerator : public Component, public ILoggable { * @fn GetGeneratedTorque_b_Nm * @brief Return generated torque in the body fixed frame [Nm] */ - inline const Vector<3> GetGeneratedTorque_b_Nm() const { return generated_torque_b_Nm_; }; + inline const math::Vector<3> GetGeneratedTorque_b_Nm() const { return generated_torque_b_Nm_; }; // Setter /** * @fn SetTorque_b_Nm * @brief Set ordered torque in the body fixed frame [Nm] */ - inline void SetTorque_b_Nm(const libra::Vector<3> torque_b_Nm) { ordered_torque_b_Nm_ = torque_b_Nm; }; + inline void SetTorque_b_Nm(const math::Vector<3> torque_b_Nm) { ordered_torque_b_Nm_ = torque_b_Nm; }; protected: - libra::Vector<3> ordered_torque_b_Nm_{0.0}; //!< Ordered torque in the body fixed frame [Nm] - libra::Vector<3> generated_torque_b_Nm_{0.0}; //!< Generated torque in the body fixed frame [Nm] + math::Vector<3> ordered_torque_b_Nm_{0.0}; //!< Ordered torque in the body fixed frame [Nm] + math::Vector<3> generated_torque_b_Nm_{0.0}; //!< Generated torque in the body fixed frame [Nm] // Noise - libra::NormalRand magnitude_noise_; //!< Normal random for magnitude noise - libra::NormalRand direction_noise_; //!< Normal random for direction noise + randomization::NormalRand magnitude_noise_; //!< Normal random for magnitude noise + randomization::NormalRand direction_noise_; //!< Normal random for direction noise double direction_error_standard_deviation_rad_; //!< Standard deviation of direction error [rad] /** @@ -88,9 +90,9 @@ class TorqueGenerator : public Component, public ILoggable { * @param [in] true_direction: True direction * @param [in] error_standard_deviation_rad: Standard deviation of direction error [rad] */ - libra::Quaternion GenerateDirectionNoiseQuaternion(libra::Vector<3> true_direction, const double error_standard_deviation_rad); + math::Quaternion GenerateDirectionNoiseQuaternion(math::Vector<3> true_direction, const double error_standard_deviation_rad); - const Dynamics* dynamics_; //!< Spacecraft dynamics information + const dynamics::Dynamics* dynamics_; //!< Spacecraft dynamics information }; /** @@ -100,6 +102,9 @@ class TorqueGenerator : public Component, public ILoggable { * @param [in] file_name: Path to initialize file * @param [in] dynamics: Dynamics information */ -TorqueGenerator InitializeTorqueGenerator(ClockGenerator* clock_generator, const std::string file_name, const Dynamics* dynamics); +TorqueGenerator InitializeTorqueGenerator(environment::ClockGenerator* clock_generator, const std::string file_name, + const dynamics::Dynamics* dynamics); + +} // namespace s2e::components #endif // S2E_COMPONENTS_IDEAL_TORQUE_GENERATOR_HPP_ diff --git a/src/components/ports/gpio_port.cpp b/src/components/ports/gpio_port.cpp index 4a155cc57..bf91c2f8c 100644 --- a/src/components/ports/gpio_port.cpp +++ b/src/components/ports/gpio_port.cpp @@ -5,6 +5,8 @@ #include "gpio_port.hpp" +namespace s2e::components { + GpioPort::GpioPort(const unsigned int port_id, IGPIOCompo* component) : kPortId(port_id) { high_low_state_ = GPIO_LOW; component_ = component; @@ -24,3 +26,5 @@ int GpioPort::DigitalWrite(const bool is_high) { } bool GpioPort::DigitalRead() { return high_low_state_; } + +} // namespace s2e::components diff --git a/src/components/ports/gpio_port.hpp b/src/components/ports/gpio_port.hpp index b1c38bb2a..3feb8af86 100644 --- a/src/components/ports/gpio_port.hpp +++ b/src/components/ports/gpio_port.hpp @@ -8,6 +8,8 @@ #include +namespace s2e::components { + #define GPIO_HIGH true #define GPIO_LOW false @@ -51,4 +53,6 @@ class GpioPort { bool high_low_state_; //!< GPIO High/Low state }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_GPIO_PORT_HPP_ diff --git a/src/components/ports/hils_i2c_target_port.cpp b/src/components/ports/hils_i2c_target_port.cpp index c4797e31e..6d4cd71cb 100644 --- a/src/components/ports/hils_i2c_target_port.cpp +++ b/src/components/ports/hils_i2c_target_port.cpp @@ -5,6 +5,8 @@ #include "hils_i2c_target_port.hpp" +namespace s2e::components { + // #define HILS_I2C_TARGET_PORT_SHOW_DEBUG_DATA //!< Remove comment when you want to show the debug message // FIXME: The magic number. This is depending on the converter. @@ -105,3 +107,5 @@ int HilsI2cTargetPort::Send(const unsigned char data_length) // to I2C-USB Targ } int HilsI2cTargetPort::GetStoredFrameCounter() { return stored_frame_counter_; } + +} // namespace s2e::components diff --git a/src/components/ports/hils_i2c_target_port.hpp b/src/components/ports/hils_i2c_target_port.hpp index a9e2c8663..54cb76531 100644 --- a/src/components/ports/hils_i2c_target_port.hpp +++ b/src/components/ports/hils_i2c_target_port.hpp @@ -10,6 +10,11 @@ #include "hils_uart_port.hpp" +namespace s2e::components { + +const unsigned int kDefaultCommandSize = 0xff; //!< Default command size +const unsigned int kDefaultTxSize = 0xff; //!< Default TX size + /** * @class HilsI2cTargetPort * @brief Class to control I2C-USB converter for the target(device) side from COM port @@ -93,11 +98,9 @@ class HilsI2cTargetPort : public HilsUartPort { int GetStoredFrameCounter(); private: - const unsigned int kDefaultCommandSize = 0xff; //!< Default command size - const unsigned int kDefaultTxSize = 0xff; //!< Default TX size - unsigned char max_register_number_ = 0xff; //!< Maximum register number - unsigned char saved_register_address_ = 0x00; //!< Saved register address - unsigned int stored_frame_counter_ = 0; //!< Send a few frames of telemetry to the converter in advance. + unsigned char max_register_number_ = 0xff; //!< Maximum register number + unsigned char saved_register_address_ = 0x00; //!< Saved register address + unsigned int stored_frame_counter_ = 0; //!< Send a few frames of telemetry to the converter in advance. /** @brief Device register: < register address, value> **/ std::map device_registers_; @@ -106,4 +109,6 @@ class HilsI2cTargetPort : public HilsUartPort { std::map command_buffer_; }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_HILS_I2C_TARGET_PORT_HPP_ diff --git a/src/components/ports/hils_uart_port.cpp b/src/components/ports/hils_uart_port.cpp index be3d1e16c..bc811269b 100644 --- a/src/components/ports/hils_uart_port.cpp +++ b/src/components/ports/hils_uart_port.cpp @@ -8,6 +8,8 @@ #include "hils_uart_port.hpp" +namespace s2e::components { + // # define HILS_UART_PORT_SHOW_DEBUG_DATA HilsUartPort::HilsUartPort(const unsigned int port_id, const unsigned int baud_rate, const unsigned int tx_buffer_size, @@ -186,3 +188,5 @@ int HilsUartPort::DiscardOutBuffer() { } return 0; } + +} // namespace s2e::components diff --git a/src/components/ports/hils_uart_port.hpp b/src/components/ports/hils_uart_port.hpp index 1be6a9b8f..be2fc9bbd 100644 --- a/src/components/ports/hils_uart_port.hpp +++ b/src/components/ports/hils_uart_port.hpp @@ -14,6 +14,8 @@ #include +namespace s2e::components { + typedef cli::array bytearray; //!< System::Byte: an 8-bit unsigned integer /** @@ -111,4 +113,6 @@ class HilsUartPort { int DiscardOutBuffer(); }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_HILS_UART_PORT_HPP_ diff --git a/src/components/ports/i2c_port.cpp b/src/components/ports/i2c_port.cpp index d01b5b21d..3e4578a28 100644 --- a/src/components/ports/i2c_port.cpp +++ b/src/components/ports/i2c_port.cpp @@ -5,7 +5,9 @@ #include "i2c_port.hpp" -#include +#include + +namespace s2e::components { I2cPort::I2cPort(void) {} @@ -93,3 +95,5 @@ unsigned char I2cPort::ReadCommand(const unsigned char i2c_address, unsigned cha } return length; } + +} // namespace s2e::components \ No newline at end of file diff --git a/src/components/ports/i2c_port.hpp b/src/components/ports/i2c_port.hpp index 57143b992..044431c0e 100644 --- a/src/components/ports/i2c_port.hpp +++ b/src/components/ports/i2c_port.hpp @@ -8,6 +8,8 @@ #include +namespace s2e::components { + /** * @class I2cPort * @brief Class to emulate I2C(Inter-Integrated Circuit) communication port @@ -108,4 +110,6 @@ class I2cPort { std::map, unsigned char> command_buffer_; }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_I2C_PORT_HPP_ diff --git a/src/components/ports/power_port.cpp b/src/components/ports/power_port.cpp index d1456c10f..5671b94e9 100644 --- a/src/components/ports/power_port.cpp +++ b/src/components/ports/power_port.cpp @@ -6,8 +6,10 @@ #include "power_port.hpp" #include -#include -#include +#include +#include + +namespace s2e::components { PowerPort::PowerPort() : kPortId(-1), current_limit_A_(10.0), minimum_voltage_V_(3.3), assumed_power_consumption_W_(0.0) { is_on_ = true; // power on to work the component @@ -66,7 +68,7 @@ void PowerPort::SubtractAssumedPowerConsumption_W(const double power_W) { } void PowerPort::InitializeWithInitializeFile(const std::string file_name) { - IniAccess initialize_file(file_name); + setting_file_reader::IniAccess initialize_file(file_name); const std::string section_name = "POWER_PORT"; double minimum_voltage_V = initialize_file.ReadDouble(section_name.c_str(), "minimum_voltage_V"); @@ -74,3 +76,5 @@ void PowerPort::InitializeWithInitializeFile(const std::string file_name) { double assumed_power_consumption_W = initialize_file.ReadDouble(section_name.c_str(), "assumed_power_consumption_W"); this->SetAssumedPowerConsumption_W(assumed_power_consumption_W); } + +} // namespace s2e::components diff --git a/src/components/ports/power_port.hpp b/src/components/ports/power_port.hpp index e890d25b5..98d0a74d6 100644 --- a/src/components/ports/power_port.hpp +++ b/src/components/ports/power_port.hpp @@ -8,6 +8,8 @@ #include +namespace s2e::components { + /** * @class PowerPort * @brief Class to emulate electrical power port @@ -133,4 +135,6 @@ class PowerPort { void Initialize(void); }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_POWER_PORT_HPP_ diff --git a/src/components/ports/uart_port.cpp b/src/components/ports/uart_port.cpp index a2ad5303a..070bd59ad 100644 --- a/src/components/ports/uart_port.cpp +++ b/src/components/ports/uart_port.cpp @@ -5,6 +5,8 @@ #include "uart_port.hpp" +namespace s2e::components { + UartPort::UartPort() : UartPort(kDefaultBufferSize, kDefaultBufferSize) {} UartPort::UartPort(const unsigned int rx_buffer_size, const unsigned int tx_buffer_size) { @@ -12,8 +14,8 @@ UartPort::UartPort(const unsigned int rx_buffer_size, const unsigned int tx_buff unsigned int checked_tx_buffer_size = tx_buffer_size; if (rx_buffer_size <= 0) checked_rx_buffer_size = kDefaultBufferSize; if (tx_buffer_size <= 0) checked_tx_buffer_size = kDefaultBufferSize; - rx_buffer_ = new RingBuffer(checked_rx_buffer_size); - tx_buffer_ = new RingBuffer(checked_tx_buffer_size); + rx_buffer_ = new utilities::RingBuffer(checked_rx_buffer_size); + tx_buffer_ = new utilities::RingBuffer(checked_tx_buffer_size); } UartPort::~UartPort() { @@ -36,3 +38,5 @@ int UartPort::ReadTx(unsigned char* buffer, const unsigned int offset, const uns int UartPort::ReadRx(unsigned char* buffer, const unsigned int offset, const unsigned int data_length) { return rx_buffer_->Read(buffer, offset, data_length); } + +} // namespace s2e::components diff --git a/src/components/ports/uart_port.hpp b/src/components/ports/uart_port.hpp index 21849aff0..c83ddc456 100644 --- a/src/components/ports/uart_port.hpp +++ b/src/components/ports/uart_port.hpp @@ -6,7 +6,9 @@ #ifndef S2E_COMPONENTS_PORTS_UART_PORT_HPP_ #define S2E_COMPONENTS_PORTS_UART_PORT_HPP_ -#include +#include + +namespace s2e::components { /** * @class UartPort @@ -74,8 +76,10 @@ class UartPort { private: const static unsigned int kDefaultBufferSize = 1024; //!< Default buffer size - RingBuffer* rx_buffer_; //!< Receive buffer (Component -> OBC) - RingBuffer* tx_buffer_; //!< Transmit buffer (OBC-> Component) + utilities::RingBuffer* rx_buffer_; //!< Receive buffer (Component -> OBC) + utilities::RingBuffer* tx_buffer_; //!< Transmit buffer (OBC-> Component) }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_PORTS_UART_PORT_HPP_ diff --git a/src/components/real/aocs/gnss_receiver.cpp b/src/components/real/aocs/gnss_receiver.cpp index b1eb49110..8acf57890 100644 --- a/src/components/real/aocs/gnss_receiver.cpp +++ b/src/components/real/aocs/gnss_receiver.cpp @@ -6,190 +6,194 @@ #include "gnss_receiver.hpp" #include -#include -#include +#include +#include +#include #include -GnssReceiver::GnssReceiver(const int prescaler, ClockGenerator* clock_generator, const int component_id, const std::string gnss_id, - const int max_channel, const AntennaModel antenna_model, const libra::Vector<3> antenna_position_b_m, - const libra::Quaternion quaternion_b2c, const double half_width_rad, const libra::Vector<3> noise_standard_deviation_m, - const Dynamics* dynamics, const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time) +namespace s2e::components { + +GnssReceiver::GnssReceiver(const int prescaler, environment::ClockGenerator* clock_generator, const size_t component_id, + const AntennaModel antenna_model, const math::Vector<3> antenna_position_b_m, const math::Quaternion quaternion_b2c, + const double half_width_deg, const math::Vector<3> position_noise_standard_deviation_ecef_m, + const math::Vector<3> velocity_noise_standard_deviation_ecef_m_s, const dynamics::Dynamics* dynamics, + const environment::GnssSatellites* gnss_satellites, const environment::SimulationTime* simulation_time) : Component(prescaler, clock_generator), component_id_(component_id), - max_channel_(max_channel), antenna_position_b_m_(antenna_position_b_m), quaternion_b2c_(quaternion_b2c), - random_noise_i_x_(0.0, noise_standard_deviation_m[0], global_randomization.MakeSeed()), - random_noise_i_y_(0.0, noise_standard_deviation_m[1], global_randomization.MakeSeed()), - random_noise_i_z_(0.0, noise_standard_deviation_m[2], global_randomization.MakeSeed()), - half_width_rad_(half_width_rad), - gnss_id_(gnss_id), + half_width_deg_(half_width_deg), antenna_model_(antenna_model), dynamics_(dynamics), gnss_satellites_(gnss_satellites), - simulation_time_(simulation_time) {} -GnssReceiver::GnssReceiver(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const std::string gnss_id, const int max_channel, const AntennaModel antenna_model, - const libra::Vector<3> antenna_position_b_m, const libra::Quaternion quaternion_b2c, const double half_width_rad, - const libra::Vector<3> noise_standard_deviation_m, const Dynamics* dynamics, const GnssSatellites* gnss_satellites, - const SimulationTime* simulation_time) + simulation_time_(simulation_time) { + for (size_t i = 0; i < 3; i++) { + position_random_noise_ecef_m_[i].SetParameters(0.0, position_noise_standard_deviation_ecef_m[i], randomization::global_randomization.MakeSeed()); + velocity_random_noise_ecef_m_s_[i].SetParameters(0.0, velocity_noise_standard_deviation_ecef_m_s[i], + randomization::global_randomization.MakeSeed()); + } +} + +GnssReceiver::GnssReceiver(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const size_t component_id, + const AntennaModel antenna_model, const math::Vector<3> antenna_position_b_m, const math::Quaternion quaternion_b2c, + const double half_width_deg, const math::Vector<3> position_noise_standard_deviation_ecef_m, + const math::Vector<3> velocity_noise_standard_deviation_ecef_m_s, const dynamics::Dynamics* dynamics, + const environment::GnssSatellites* gnss_satellites, const environment::SimulationTime* simulation_time) : Component(prescaler, clock_generator, power_port), component_id_(component_id), - max_channel_(max_channel), antenna_position_b_m_(antenna_position_b_m), quaternion_b2c_(quaternion_b2c), - random_noise_i_x_(0.0, noise_standard_deviation_m[0], global_randomization.MakeSeed()), - random_noise_i_y_(0.0, noise_standard_deviation_m[1], global_randomization.MakeSeed()), - random_noise_i_z_(0.0, noise_standard_deviation_m[2], global_randomization.MakeSeed()), - half_width_rad_(half_width_rad), - gnss_id_(gnss_id), + half_width_deg_(half_width_deg), antenna_model_(antenna_model), dynamics_(dynamics), gnss_satellites_(gnss_satellites), - simulation_time_(simulation_time) {} + simulation_time_(simulation_time) { + for (size_t i = 0; i < 3; i++) { + position_random_noise_ecef_m_[i].SetParameters(0.0, position_noise_standard_deviation_ecef_m[i], randomization::global_randomization.MakeSeed()); + velocity_random_noise_ecef_m_s_[i].SetParameters(0.0, velocity_noise_standard_deviation_ecef_m_s[i], + randomization::global_randomization.MakeSeed()); + } +} void GnssReceiver::MainRoutine(const int time_count) { UNUSED(time_count); - libra::Vector<3> pos_true_eci_ = dynamics_->GetOrbit().GetPosition_i_m(); - libra::Quaternion quaternion_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); - - CheckAntenna(pos_true_eci_, quaternion_i2b); + // Antenna checking + // TODO: Use ECEF position only + math::Vector<3> position_true_eci = dynamics_->GetOrbit().GetPosition_i_m(); + math::Quaternion quaternion_i2b = dynamics_->GetAttitude().GetQuaternion_i2b(); + CheckAntenna(position_true_eci, quaternion_i2b); - if (is_gnss_visible_ == 1) { // Antenna of GNSS-R can detect GNSS signal + if (is_gnss_visible_) { + // Antenna of GNSS-R can detect GNSS signal position_ecef_m_ = dynamics_->GetOrbit().GetPosition_ecef_m(); - position_llh_ = dynamics_->GetOrbit().GetLatLonAlt(); velocity_ecef_m_s_ = dynamics_->GetOrbit().GetVelocity_ecef_m_s(); - AddNoise(pos_true_eci_, position_ecef_m_); - - utc_ = simulation_time_->GetCurrentUtc(); - ConvertJulianDayToGPSTime(simulation_time_->GetCurrentTime_jd()); - } else { - // position information will not be updated in this case - // only time information will be updated in this case (according to the receiver's internal clock) - utc_ = simulation_time_->GetCurrentUtc(); - ConvertJulianDayToGPSTime(simulation_time_->GetCurrentTime_jd()); + AddNoise(position_ecef_m_, velocity_ecef_m_s_); + // Convert observed value to other frames + geodetic_position_.UpdateFromEcef(position_ecef_m_); } + + // Time is updated with internal clock + utc_ = simulation_time_->GetCurrentUtc(); + ConvertJulianDayToGpsTime(simulation_time_->GetCurrentTime_jd()); } -void GnssReceiver::CheckAntenna(const libra::Vector<3> pos_true_eci_, libra::Quaternion quaternion_i2b) { - if (antenna_model_ == AntennaModel::kSimple) - CheckAntennaSimple(pos_true_eci_, quaternion_i2b); - else if (antenna_model_ == AntennaModel::kCone) - CheckAntennaCone(pos_true_eci_, quaternion_i2b); +void GnssReceiver::CheckAntenna(const math::Vector<3> position_true_eci_m, const math::Quaternion quaternion_i2b) { + if (antenna_model_ == AntennaModel::kSimple) { + CheckAntennaSimple(position_true_eci_m, quaternion_i2b); + } else if (antenna_model_ == AntennaModel::kCone) { + CheckAntennaCone(position_true_eci_m, quaternion_i2b); + } else { + std::cout << "[Error] GNSS Receiver: Undefined antenna model." << std::endl; + } } -void GnssReceiver::CheckAntennaSimple(const libra::Vector<3> pos_true_eci_, libra::Quaternion quaternion_i2b) { +void GnssReceiver::CheckAntennaSimple(const math::Vector<3> position_true_eci_m, const math::Quaternion quaternion_i2b) { // Simplest model - // GNSS sats are visible when antenna directs anti-earth direction - // antenna normal vector at inertial frame - libra::Vector<3> antenna_direction_c(0.0); + // GNSS satellites are visible when antenna directs anti-earth direction + + // Antenna normal vector at inertial frame + math::Vector<3> antenna_direction_c(0.0); antenna_direction_c[2] = 1.0; - libra::Vector<3> antenna_direction_b = quaternion_b2c_.InverseFrameConversion(antenna_direction_c); - libra::Vector<3> antenna_direction_i = quaternion_i2b.InverseFrameConversion(antenna_direction_b); - - double inner = InnerProduct(pos_true_eci_, antenna_direction_i); - if (inner <= 0) - is_gnss_visible_ = 0; - else - is_gnss_visible_ = 1; + math::Vector<3> antenna_direction_b = quaternion_b2c_.InverseFrameConversion(antenna_direction_c); + math::Vector<3> antenna_direction_i = quaternion_i2b.InverseFrameConversion(antenna_direction_b); + + double inner = InnerProduct(position_true_eci_m, antenna_direction_i); + if (inner <= 0.0) { + is_gnss_visible_ = false; + } else { + is_gnss_visible_ = true; + } } -void GnssReceiver::CheckAntennaCone(const libra::Vector<3> pos_true_eci_, libra::Quaternion quaternion_i2b) { +void GnssReceiver::CheckAntennaCone(const math::Vector<3> position_true_eci_m, const math::Quaternion quaternion_i2b) { // Cone model - libra::Vector<3> gnss_sat_pos_i, ant_pos_i, antenna_to_satellite_i_m, ant2gnss_i_n, sat2ant_i; gnss_information_list_.clear(); - // antenna normal vector at inertial frame - libra::Vector<3> antenna_direction_c(0.0); - antenna_direction_c[2] = 1.0; - libra::Vector<3> antenna_direction_b = quaternion_b2c_.InverseFrameConversion(antenna_direction_c); - libra::Vector<3> antenna_direction_i = quaternion_i2b.InverseFrameConversion(antenna_direction_b); + // Antenna pointing direction vector at inertial frame + math::Vector<3> antenna_pointing_direction_c(0.0); + antenna_pointing_direction_c[2] = 1.0; + math::Vector<3> antenna_pointing_direction_b = quaternion_b2c_.InverseFrameConversion(antenna_pointing_direction_c); + math::Vector<3> antenna_pointing_direction_i = quaternion_i2b.InverseFrameConversion(antenna_pointing_direction_b); - sat2ant_i = quaternion_i2b.InverseFrameConversion(antenna_position_b_m_); - ant_pos_i = pos_true_eci_ + sat2ant_i; + // Antenna position vector at inertial frame + math::Vector<3> antenna_position_i_m = position_true_eci_m + quaternion_i2b.InverseFrameConversion(antenna_position_b_m_); // initialize visible_satellite_number_ = 0; - int gnss_num = gnss_satellites_->GetNumberOfSatellites(); - - for (int i = 0; i < gnss_num; i++) { - // check if gnss ID is compatible with the receiver - std::string id_tmp = gnss_satellites_->GetIdFromIndex(i); - if (gnss_id_.find(id_tmp[0]) == std::string::npos) continue; + size_t number_of_calculated_gnss_satellites = gnss_satellites_->GetNumberOfCalculatedSatellite(); + for (size_t i = 0; i < number_of_calculated_gnss_satellites; i++) { // compute direction from sat to gnss in body-fixed frame - gnss_sat_pos_i = gnss_satellites_->GetSatellitePositionEci(i); - antenna_to_satellite_i_m = gnss_sat_pos_i - ant_pos_i; - double normalizer = 1 / antenna_to_satellite_i_m.CalcNorm(); - ant2gnss_i_n = normalizer * antenna_to_satellite_i_m; - - // check gnss sats are visible from antenna - double Re = environment::earth_equatorial_radius_m; - double inner1 = InnerProduct(ant_pos_i, gnss_sat_pos_i); - int is_visible_ant2gnss = 0; - if (inner1 > 0) - is_visible_ant2gnss = 1; - else { - Vector<3> tmp = ant_pos_i + InnerProduct(-ant_pos_i, ant2gnss_i_n) * antenna_to_satellite_i_m; - if (tmp.CalcNorm() < Re) - // There is earth between antenna and gnss - is_visible_ant2gnss = 0; - else - // There is not earth between antenna and gnss - is_visible_ant2gnss = 1; + math::Vector<3> gnss_satellite_position_i_m = gnss_satellites_->GetPosition_eci_m(i); + math::Vector<3> antenna_to_gnss_satellite_i_m = gnss_satellite_position_i_m - antenna_position_i_m; + math::Vector<3> antenna_to_gnss_satellite_direction_i = antenna_to_gnss_satellite_i_m.CalcNormalizedVector(); + + // Check GNSS satellites are visible from the receiver(not care antenna direction) + bool is_gnss_satellite_visible_from_receiver = false; + double inner1 = InnerProduct(antenna_position_i_m, gnss_satellite_position_i_m); + if (inner1 > 0.0) { // GNSS satellite and receiver are in the same hemisphere + is_gnss_satellite_visible_from_receiver = true; + } else { // GNSS satellite is in the another hemisphere + double angle_bw_earth_center_and_edge_rad = asin(environment::earth_equatorial_radius_m / antenna_position_i_m.CalcNorm()); + double angle_bw_earth_center_and_gnss_rad = + acos(InnerProduct(-antenna_position_i_m.CalcNormalizedVector(), antenna_to_gnss_satellite_direction_i)); + + if (angle_bw_earth_center_and_edge_rad < angle_bw_earth_center_and_gnss_rad) { + // There is no Earth between receiver and GNSS satellite + is_gnss_satellite_visible_from_receiver = true; + } else { + // There is Earth between receiver and GNSS satellite + is_gnss_satellite_visible_from_receiver = false; + } } - double inner2 = InnerProduct(antenna_direction_i, ant2gnss_i_n); - if (inner2 > cos(half_width_rad_ * libra::deg_to_rad) && is_visible_ant2gnss) { + // Check GNSS satellites are in the antenna half width angle + double inner2 = InnerProduct(antenna_pointing_direction_i, antenna_to_gnss_satellite_direction_i); + if (inner2 > cos(half_width_deg_ * math::deg_to_rad) && is_gnss_satellite_visible_from_receiver) { // is visible visible_satellite_number_++; - SetGnssInfo(antenna_to_satellite_i_m, quaternion_i2b, id_tmp); + SetGnssInfo(antenna_to_gnss_satellite_i_m, quaternion_i2b, i); } } - if (visible_satellite_number_ > 0) - is_gnss_visible_ = 1; - else - is_gnss_visible_ = 0; + if (visible_satellite_number_ >= 4) { + is_gnss_visible_ = true; + } else { + is_gnss_visible_ = false; + } } -void GnssReceiver::SetGnssInfo(libra::Vector<3> antenna_to_satellite_i_m, libra::Quaternion quaternion_i2b, std::string gnss_id) { - libra::Vector<3> ant2gnss_b, ant2gnss_c; - - ant2gnss_b = quaternion_i2b.FrameConversion(antenna_to_satellite_i_m); - ant2gnss_c = quaternion_b2c_.FrameConversion(ant2gnss_b); +void GnssReceiver::SetGnssInfo(const math::Vector<3> antenna_to_satellite_i_m, const math::Quaternion quaternion_i2b, + const std::size_t gnss_system_id) { + math::Vector<3> antenna_to_satellite_direction_b = quaternion_i2b.FrameConversion(antenna_to_satellite_i_m); + math::Vector<3> antenna_to_satellite_direction_c = quaternion_b2c_.FrameConversion(antenna_to_satellite_direction_b); - double dist = ant2gnss_c.CalcNorm(); - double lon = AcTan(ant2gnss_c[1], ant2gnss_c[0]); - double lat = AcTan(ant2gnss_c[2], sqrt(pow(ant2gnss_c[0], 2.0) + pow(ant2gnss_c[1], 2.0))); + double distance_m = antenna_to_satellite_i_m.CalcNorm(); + double longitude_rad = AcTan(antenna_to_satellite_direction_c[1], antenna_to_satellite_direction_c[0]); + double latitude_rad = + AcTan(antenna_to_satellite_direction_c[2], sqrt(pow(antenna_to_satellite_direction_c[0], 2.0) + pow(antenna_to_satellite_direction_c[1], 2.0))); - GnssInfo gnss_info_new = {gnss_id, lat, lon, dist}; + GnssInfo gnss_info_new = {gnss_system_id, latitude_rad, longitude_rad, distance_m}; gnss_information_list_.push_back(gnss_info_new); } -void GnssReceiver::AddNoise(libra::Vector<3> position_true_i_m, libra::Vector<3> position_true_ecef_m) { - // Simplest noise model - position_eci_m_[0] = position_true_i_m[0] + random_noise_i_x_; - position_eci_m_[1] = position_true_i_m[1] + random_noise_i_y_; - position_eci_m_[2] = position_true_i_m[2] + random_noise_i_z_; - - // FIXME: noise in ECI frame is added to ECEF frame value - position_ecef_m_[0] = position_true_ecef_m[0] + random_noise_i_x_; - position_ecef_m_[1] = position_true_ecef_m[1] + random_noise_i_y_; - position_ecef_m_[2] = position_true_ecef_m[2] + random_noise_i_z_; +void GnssReceiver::AddNoise(const math::Vector<3> position_true_ecef_m, const math::Vector<3> velocity_true_ecef_m_s) { + for (size_t i = 0; i < 3; i++) { + position_ecef_m_[i] = position_true_ecef_m[i] + position_random_noise_ecef_m_[i]; + velocity_ecef_m_s_[i] = velocity_true_ecef_m_s[i] + velocity_random_noise_ecef_m_s_[i]; + } } -void GnssReceiver::ConvertJulianDayToGPSTime(const double julian_day) { - const double kJulianDayAtGPSTimeZero = 2444244.5; // corresponds to 1980/1/5 midnight +void GnssReceiver::ConvertJulianDayToGpsTime(const double julian_day) { + const double kJulianDayAtGpsTimeZero = 2444244.5; // corresponds to 1980/1/5 midnight const double kDayInWeek = 7.0; - // const double kSecInWeek = 604800.0; const double kSecInDay = 86400.0; - // compute ToW from current julian_day + // compute time of week from current julian_day // note:"gps_time_week_ " computed in this method is larger than 1024 - double elapsed_day = julian_day - kJulianDayAtGPSTimeZero; + double elapsed_day = julian_day - kJulianDayAtGpsTimeZero; gps_time_week_ = (unsigned int)(elapsed_day / kDayInWeek); gps_time_s_ = (elapsed_day - (double)(gps_time_week_)*kDayInWeek) * kSecInDay; } @@ -200,19 +204,19 @@ std::string GnssReceiver::GetLogHeader() const // For logs const std::string sensor_id = std::to_string(static_cast(component_id_)); std::string sensor_name = "gnss_receiver" + sensor_id + "_"; - str_tmp += WriteScalar(sensor_name + "measured_utc_time_year"); - str_tmp += WriteScalar(sensor_name + "measured_utc_time_month"); - str_tmp += WriteScalar(sensor_name + "measured_utc_time_day"); - str_tmp += WriteScalar(sensor_name + "measured_utc_time_hour"); - str_tmp += WriteScalar(sensor_name + "measured_utc_time_min"); - str_tmp += WriteScalar(sensor_name + "measured_utc_time_sec"); - str_tmp += WriteVector(sensor_name + "measured_position", "eci", "m", 3); - str_tmp += WriteVector(sensor_name + "measured_velocity", "ecef", "m/s", 3); - str_tmp += WriteScalar(sensor_name + "measured_latitude", "rad"); - str_tmp += WriteScalar(sensor_name + "measured_longitude", "rad"); - str_tmp += WriteScalar(sensor_name + "measured_altitude", "m"); - str_tmp += WriteScalar(sensor_name + "satellite_visible_flag"); - str_tmp += WriteScalar(sensor_name + "number_of_visible_satellites"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_year"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_month"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_day"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_hour"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_min"); + str_tmp += logger::WriteScalar(sensor_name + "measured_utc_time_sec"); + str_tmp += logger::WriteVector(sensor_name + "measured_position", "ecef", "m", 3); + str_tmp += logger::WriteVector(sensor_name + "measured_velocity", "ecef", "m/s", 3); + str_tmp += logger::WriteScalar(sensor_name + "measured_latitude", "rad"); + str_tmp += logger::WriteScalar(sensor_name + "measured_longitude", "rad"); + str_tmp += logger::WriteScalar(sensor_name + "measured_altitude", "m"); + str_tmp += logger::WriteScalar(sensor_name + "satellite_visible_flag"); + str_tmp += logger::WriteScalar(sensor_name + "number_of_visible_satellites"); return str_tmp; } @@ -220,38 +224,49 @@ std::string GnssReceiver::GetLogHeader() const // For logs std::string GnssReceiver::GetLogValue() const // For logs { std::string str_tmp = ""; - str_tmp += WriteScalar(utc_.year); - str_tmp += WriteScalar(utc_.month); - str_tmp += WriteScalar(utc_.day); - str_tmp += WriteScalar(utc_.hour); - str_tmp += WriteScalar(utc_.minute); - str_tmp += WriteScalar(utc_.second); - str_tmp += WriteVector(position_eci_m_, 10); - str_tmp += WriteVector(velocity_ecef_m_s_, 10); - str_tmp += WriteScalar(position_llh_[0], 10); - str_tmp += WriteScalar(position_llh_[1], 10); - str_tmp += WriteScalar(position_llh_[2], 10); - str_tmp += WriteScalar(is_gnss_visible_); - str_tmp += WriteScalar(visible_satellite_number_); + str_tmp += logger::WriteScalar(utc_.year); + str_tmp += logger::WriteScalar(utc_.month); + str_tmp += logger::WriteScalar(utc_.day); + str_tmp += logger::WriteScalar(utc_.hour); + str_tmp += logger::WriteScalar(utc_.minute); + str_tmp += logger::WriteScalar(utc_.second); + str_tmp += logger::WriteVector(position_ecef_m_, 10); + str_tmp += logger::WriteVector(velocity_ecef_m_s_, 10); + str_tmp += logger::WriteScalar(geodetic_position_.GetLatitude_rad(), 10); + str_tmp += logger::WriteScalar(geodetic_position_.GetLongitude_rad(), 10); + str_tmp += logger::WriteScalar(geodetic_position_.GetAltitude_m(), 10); + str_tmp += logger::WriteScalar(is_gnss_visible_); + str_tmp += logger::WriteScalar(visible_satellite_number_); return str_tmp; } -typedef struct _gnssrecever_param { +AntennaModel SetAntennaModel(const std::string antenna_model) { + if (antenna_model == "SIMPLE") { + return AntennaModel ::kSimple; + } else if (antenna_model == "CONE") { + return AntennaModel ::kCone; + } else { + std::cerr << "[WARNINGS] GNSS receiver antenna model is not defined!" << std::endl; + std::cerr << "The antenna model is automatically initialized as SIMPLE mode" << std::endl; + return AntennaModel ::kSimple; + } +} + +typedef struct _gnss_receiver_param { int prescaler; AntennaModel antenna_model; - libra::Vector<3> antenna_pos_b; - libra::Quaternion quaternion_b2c; - double half_width_rad; - std::string gnss_id; - int max_channel; - libra::Vector<3> noise_standard_deviation_m; + math::Vector<3> antenna_pos_b; + math::Quaternion quaternion_b2c; + double half_width_deg; + math::Vector<3> position_noise_standard_deviation_ecef_m; + math::Vector<3> velocity_noise_standard_deviation_ecef_m_s; } GnssReceiverParam; -GnssReceiverParam ReadGnssReceiverIni(const std::string file_name, const GnssSatellites* gnss_satellites, const int component_id) { +GnssReceiverParam ReadGnssReceiverIni(const std::string file_name, const environment::GnssSatellites* gnss_satellites, const size_t component_id) { GnssReceiverParam gnss_receiver_param; - IniAccess gnssr_conf(file_name); + setting_file_reader::IniAccess gnssr_conf(file_name); const char* sensor_name = "GNSS_RECEIVER_"; const std::string section_name = sensor_name + std::to_string(static_cast(component_id)); const char* GSection = section_name.c_str(); @@ -260,43 +275,47 @@ GnssReceiverParam ReadGnssReceiverIni(const std::string file_name, const GnssSat if (prescaler <= 1) prescaler = 1; gnss_receiver_param.prescaler = prescaler; - gnss_receiver_param.antenna_model = static_cast(gnssr_conf.ReadInt(GSection, "antenna_model")); + std::string antenna_model_name = gnssr_conf.ReadString(GSection, "antenna_model"); + gnss_receiver_param.antenna_model = SetAntennaModel(antenna_model_name); if (!gnss_satellites->IsCalcEnabled() && gnss_receiver_param.antenna_model == AntennaModel::kCone) { - std::cout << "Calculation of GNSS SATELLITES is DISABLED, so the antenna " - "model of GNSS Receiver is automatically set to SIMPLE model." + std::cout << "[WARNINGS] Calculation of GNSS SATELLITES is DISABLED, " + "so the antenna model of GnssReceiver is automatically set to SIMPLE model." << std::endl; gnss_receiver_param.antenna_model = AntennaModel::kSimple; } gnssr_conf.ReadVector(GSection, "antenna_position_b_m", gnss_receiver_param.antenna_pos_b); gnssr_conf.ReadQuaternion(GSection, "quaternion_b2c", gnss_receiver_param.quaternion_b2c); - gnss_receiver_param.half_width_rad = gnssr_conf.ReadDouble(GSection, "antenna_half_width_deg"); - gnss_receiver_param.gnss_id = gnssr_conf.ReadString(GSection, "gnss_id"); - gnss_receiver_param.max_channel = gnssr_conf.ReadInt(GSection, "maximum_channel"); - gnssr_conf.ReadVector(GSection, "white_noise_standard_deviation_eci_m", gnss_receiver_param.noise_standard_deviation_m); + gnss_receiver_param.half_width_deg = gnssr_conf.ReadDouble(GSection, "antenna_half_width_deg"); + gnssr_conf.ReadVector(GSection, "white_noise_standard_deviation_position_ecef_m", gnss_receiver_param.position_noise_standard_deviation_ecef_m); + gnssr_conf.ReadVector(GSection, "white_noise_standard_deviation_velocity_ecef_m_s", gnss_receiver_param.velocity_noise_standard_deviation_ecef_m_s); return gnss_receiver_param; } -GnssReceiver InitGnssReceiver(ClockGenerator* clock_generator, int component_id, const std::string file_name, const Dynamics* dynamics, - const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time) { +GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, const size_t component_id, const std::string file_name, + const dynamics::Dynamics* dynamics, const environment::GnssSatellites* gnss_satellites, + const environment::SimulationTime* simulation_time) { GnssReceiverParam gr_param = ReadGnssReceiverIni(file_name, gnss_satellites, component_id); - GnssReceiver gnss_r(gr_param.prescaler, clock_generator, component_id, gr_param.gnss_id, gr_param.max_channel, gr_param.antenna_model, - gr_param.antenna_pos_b, gr_param.quaternion_b2c, gr_param.half_width_rad, gr_param.noise_standard_deviation_m, dynamics, - gnss_satellites, simulation_time); + GnssReceiver gnss_r(gr_param.prescaler, clock_generator, component_id, gr_param.antenna_model, gr_param.antenna_pos_b, gr_param.quaternion_b2c, + gr_param.half_width_deg, gr_param.position_noise_standard_deviation_ecef_m, gr_param.velocity_noise_standard_deviation_ecef_m_s, + dynamics, gnss_satellites, simulation_time); return gnss_r; } -GnssReceiver InitGnssReceiver(ClockGenerator* clock_generator, PowerPort* power_port, int component_id, const std::string file_name, - const Dynamics* dynamics, const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time) { +GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, PowerPort* power_port, const size_t component_id, + const std::string file_name, const dynamics::Dynamics* dynamics, const environment::GnssSatellites* gnss_satellites, + const environment::SimulationTime* simulation_time) { GnssReceiverParam gr_param = ReadGnssReceiverIni(file_name, gnss_satellites, component_id); // PowerPort power_port->InitializeWithInitializeFile(file_name); - GnssReceiver gnss_r(gr_param.prescaler, clock_generator, power_port, component_id, gr_param.gnss_id, gr_param.max_channel, gr_param.antenna_model, - gr_param.antenna_pos_b, gr_param.quaternion_b2c, gr_param.half_width_rad, gr_param.noise_standard_deviation_m, dynamics, - gnss_satellites, simulation_time); + GnssReceiver gnss_r(gr_param.prescaler, clock_generator, power_port, component_id, gr_param.antenna_model, gr_param.antenna_pos_b, + gr_param.quaternion_b2c, gr_param.half_width_deg, gr_param.position_noise_standard_deviation_ecef_m, + gr_param.velocity_noise_standard_deviation_ecef_m_s, dynamics, gnss_satellites, simulation_time); return gnss_r; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/gnss_receiver.hpp b/src/components/real/aocs/gnss_receiver.hpp index 1a5ac4e35..7c1b586d0 100644 --- a/src/components/real/aocs/gnss_receiver.hpp +++ b/src/components/real/aocs/gnss_receiver.hpp @@ -9,13 +9,15 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "../../base/component.hpp" +namespace s2e::components { + /** * @enum AntennaModel * @brief Antenna pattern model to emulate GNSS antenna @@ -30,7 +32,7 @@ enum class AntennaModel { * @brief Information of GNSS satellites */ typedef struct _gnss_info { - std::string ID; //!< ID of GNSS satellites + size_t gnss_id; //!< ID of GNSS satellites double latitude_rad; //!< Latitude on the antenna frame [rad] double longitude_rad; //!< Longitude on the antenna frame [rad] double distance_m; //!< Distance between the GNSS satellite and the GNSS receiver antenna [m] @@ -40,7 +42,7 @@ typedef struct _gnss_info { * @class GnssReceiver * @brief Class to emulate GNSS receiver */ -class GnssReceiver : public Component, public ILoggable { +class GnssReceiver : public Component, public logger::ILoggable { public: /** * @fn GnssReceiver @@ -48,42 +50,42 @@ class GnssReceiver : public Component, public ILoggable { * @param [in] prescaler: Frequency scale factor for update * @param [in] clock_generator: Clock generator * @param [in] component_id: Component ID - * @param [in] gnss_id: GNSS satellite number defined by GNSS system - * @param [in] max_channel: Maximum number of channels * @param [in] antenna_model: Antenna model * @param [in] antenna_position_b_m: GNSS antenna position at the body-fixed frame [m] * @param [in] quaternion_b2c: Quaternion from body frame to component frame (antenna frame) - * @param [in] half_width_rad: Half width of the antenna cone model [rad] - * @param [in] noise_standard_deviation_m: Standard deviation of normal random noise in the ECI frame [m] + * @param [in] half_width_deg: Half width of the antenna cone model [deg] + * @param [in] position_noise_standard_deviation_ecef_m: Standard deviation of normal random noise for position in the ECEF frame [m] + * @param [in] velocity_noise_standard_deviation_ecef_m_s: Standard deviation of normal random noise for velocity in the ECEF frame [m/s] * @param [in] dynamics: Dynamics information * @param [in] gnss_satellites: GNSS Satellites information * @param [in] simulation_time: Simulation time information */ - GnssReceiver(const int prescaler, ClockGenerator* clock_generator, const int component_id, const std::string gnss_id, const int max_channel, - const AntennaModel antenna_model, const libra::Vector<3> antenna_position_b_m, const libra::Quaternion quaternion_b2c, - const double half_width_rad, const libra::Vector<3> noise_standard_deviation_m, const Dynamics* dynamics, - const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time); + GnssReceiver(const int prescaler, environment::ClockGenerator* clock_generator, const size_t component_id, const AntennaModel antenna_model, + const math::Vector<3> antenna_position_b_m, const math::Quaternion quaternion_b2c, const double half_width_deg, + const math::Vector<3> position_noise_standard_deviation_ecef_m, const math::Vector<3> velocity_noise_standard_deviation_ecef_m_s, + const dynamics::Dynamics* dynamics, const environment::GnssSatellites* gnss_satellites, + const environment::SimulationTime* simulation_time); /** * @fn GnssReceiver * @brief Constructor with power port * @param [in] prescaler: Frequency scale factor for update * @param [in] clock_generator: Clock generator * @param [in] power_port: Power port - * @param [in] gnss_id: GNSS satellite number defined by GNSS system - * @param [in] max_channel: Maximum number of channels * @param [in] antenna_model: Antenna model * @param [in] antenna_position_b_m: GNSS antenna position at the body-fixed frame [m] * @param [in] quaternion_b2c: Quaternion from body frame to component frame (antenna frame) - * @param [in] half_width_rad: Half width of the antenna cone model [rad] - * @param [in] noise_standard_deviation_m: Standard deviation of normal random noise in the ECI frame [m] + * @param [in] half_width_deg: Half width of the antenna cone model [rad] + * @param [in] position_noise_standard_deviation_ecef_m: Standard deviation of normal random noise for position in the ECEF frame [m] + * @param [in] velocity_noise_standard_deviation_ecef_m_s: Standard deviation of normal random noise for velocity in the ECEF frame [m/s] * @param [in] dynamics: Dynamics information * @param [in] gnss_satellites: GNSS Satellites information * @param [in] simulation_time: Simulation time information */ - GnssReceiver(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, std::string gnss_id, - const int max_channel, const AntennaModel antenna_model, const libra::Vector<3> antenna_position_b_m, - const libra::Quaternion quaternion_b2c, const double half_width_rad, const libra::Vector<3> noise_standard_deviation_m, - const Dynamics* dynamics, const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time); + GnssReceiver(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const size_t component_id, + const AntennaModel antenna_model, const math::Vector<3> antenna_position_b_m, const math::Quaternion quaternion_b2c, + const double half_width_deg, const math::Vector<3> position_noise_standard_deviation_ecef_m, + const math::Vector<3> velocity_noise_standard_deviation_ecef_m_s, const dynamics::Dynamics* dynamics, + const environment::GnssSatellites* gnss_satellites, const environment::SimulationTime* simulation_time); // Override functions for Component /** @@ -98,78 +100,66 @@ class GnssReceiver : public Component, public ILoggable { * @brief Return GNSS satellite information * @param [in] channel: Channel number */ - inline const GnssInfo GetGnssInfo(int channel) const { return gnss_information_list_[channel]; }; - /** - * @fn GetMeasuredPosition_eci_m - * @brief Return Observed position in the ECI frame [m] - */ - inline const libra::Vector<3> GetMeasuredPosition_eci_m(void) const { return position_eci_m_; } + inline const GnssInfo GetGnssInfo(const size_t channel) const { return gnss_information_list_[channel]; }; /** * @fn GetMeasuredPosition_ecef_m * @brief Return Observed position in the ECEF frame [m] */ - inline const libra::Vector<3> GetMeasuredPosition_ecef_m(void) const { return position_ecef_m_; } + inline const math::Vector<3> GetMeasuredPosition_ecef_m(void) const { return position_ecef_m_; } /** * @fn GetMeasuredGeodeticPosition * @brief Return Observed position in the LLH frame [m] */ - inline const GeodeticPosition GetMeasuredGeodeticPosition(void) const { - GeodeticPosition geodetic_position(position_llh_[0], position_llh_[1], position_llh_[2]); - return geodetic_position; - } - /** - * @fn GetMeasuredVelocity_eci_m_s - * @brief Return Observed velocity in the ECI frame [m/s] - */ - inline const libra::Vector<3> GetMeasuredVelocity_eci_m_s(void) const { return velocity_eci_m_s_; } + inline const geodesy::GeodeticPosition GetMeasuredGeodeticPosition(void) const { return geodetic_position_; } /** * @fn GetMeasuredVelocity_ecef_m_s * @brief Return Observed velocity in the ECEF frame [m/s] */ - inline const libra::Vector<3> GetMeasuredVelocity_ecef_m_s(void) const { return velocity_ecef_m_s_; } + inline const math::Vector<3> GetMeasuredVelocity_ecef_m_s(void) const { return velocity_ecef_m_s_; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; protected: // Parameters for receiver - const int component_id_; //!< Receiver ID - const int max_channel_; //!< Maximum number of channels - libra::Vector<3> antenna_position_b_m_; //!< GNSS antenna position at the body-fixed frame [m] - libra::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame (antenna frame) - - libra::NormalRand random_noise_i_x_, random_noise_i_y_, random_noise_i_z_; //!< Random noise for each axis - - double half_width_rad_ = 0.0; //!< Half width of the antenna cone model [rad] - std::string gnss_id_; //!< GNSS satellite number defined by GNSS system - AntennaModel antenna_model_; //!< Antenna model - - // Calculated values - libra::Vector<3> position_eci_m_{0.0}; //!< Observed position in the ECI frame [m] - libra::Vector<3> velocity_eci_m_s_{0.0}; //!< Observed velocity in the ECI frame [m/s] - libra::Vector<3> position_ecef_m_{0.0}; //!< Observed position in the ECEF frame [m] - libra::Vector<3> velocity_ecef_m_s_{0.0}; //!< Observed velocity in the ECEF frame [m/s] - libra::Vector<3> position_llh_{0.0}; //!< Observed position in the geodetic frame [rad,rad,m] TODO: use GeodeticPosition class - UTC utc_ = {2000, 1, 1, 0, 0, 0.0}; //!< Observed time in UTC [year, month, day, hour, min, sec] - unsigned int gps_time_week_ = 0; //!< Observed GPS time week part - double gps_time_s_ = 0.0; //!< Observed GPS time second part - int is_gnss_visible_ = 0; //!< Flag for GNSS satellite is visible or not - int visible_satellite_number_ = 0; //!< Number of visible GNSS satellites + const size_t component_id_; //!< Receiver ID + + // Antenna + math::Vector<3> antenna_position_b_m_; //!< GNSS antenna position at the body-fixed frame [m] + math::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame (antenna frame) + double half_width_deg_ = 0.0; //!< Half width of the antenna cone model [deg] + AntennaModel antenna_model_; //!< Antenna model + + // Simple position observation + randomization::NormalRand position_random_noise_ecef_m_[3]; //!< Random noise for position at the ECEF frame [m] + randomization::NormalRand velocity_random_noise_ecef_m_s_[3]; //!< Random noise for velocity at the ECEF frame [m] + math::Vector<3> position_ecef_m_{0.0}; //!< Observed position in the ECEF frame [m] + math::Vector<3> velocity_ecef_m_s_{0.0}; //!< Observed velocity in the ECEF frame [m/s] + geodesy::GeodeticPosition geodetic_position_; //!< Observed position in the geodetic frame + + // Time observation + environment::UTC utc_ = {2000, 1, 1, 0, 0, 0.0}; //!< Observed time in UTC [year, month, day, hour, min, sec] + unsigned int gps_time_week_ = 0; //!< Observed GPS time week part + double gps_time_s_ = 0.0; //!< Observed GPS time second part + + // Satellite visibility + bool is_gnss_visible_ = false; //!< Flag for GNSS satellite is visible or not + size_t visible_satellite_number_ = 0; //!< Number of visible GNSS satellites std::vector gnss_information_list_; //!< Information List of visible GNSS satellites // References - const Dynamics* dynamics_; //!< Dynamics of spacecraft - const GnssSatellites* gnss_satellites_; //!< Information of GNSS satellites - const SimulationTime* simulation_time_; //!< Simulation time + const dynamics::Dynamics* dynamics_; //!< Dynamics of spacecraft + const environment::GnssSatellites* gnss_satellites_; //!< Information of GNSS satellites + const environment::SimulationTime* simulation_time_; //!< Simulation time // Internal Functions /** @@ -179,7 +169,7 @@ class GnssReceiver : public Component, public ILoggable { * @param [in] position_true_i_m: True position of the spacecraft in the ECI frame [m] * @param [in] quaternion_i2b: True attitude of the spacecraft expressed by quaternion from the inertial frame to the body-fixed frame */ - void CheckAntenna(libra::Vector<3> position_true_i_m, libra::Quaternion quaternion_i2b); + void CheckAntenna(const math::Vector<3> position_true_i_m, const math::Quaternion quaternion_i2b); /** * @fn CheckAntennaSimple * @brief Check the antenna can detect GNSS signal with Simple mode @@ -187,7 +177,7 @@ class GnssReceiver : public Component, public ILoggable { * @param [in] position_true_i_m: True position of the spacecraft in the ECI frame [m] * @param [in] quaternion_i2b: True attitude of the spacecraft expressed by quaternion from the inertial frame to the body-fixed frame */ - void CheckAntennaSimple(libra::Vector<3> position_true_i_m, libra::Quaternion quaternion_i2b); + void CheckAntennaSimple(const math::Vector<3> position_true_i_m, const math::Quaternion quaternion_i2b); /** * @fn CheckAntennaCone * @brief Check the antenna can detect GNSS signal with Cone mode @@ -195,30 +185,38 @@ class GnssReceiver : public Component, public ILoggable { * @param [in] position_true_i_m: True position of the spacecraft in the ECI frame [m] * @param [in] quaternion_i2b: True attitude of the spacecraft expressed by quaternion from the inertial frame to the body-fixed frame */ - void CheckAntennaCone(libra::Vector<3> position_true_i_m, libra::Quaternion quaternion_i2b); + void CheckAntennaCone(const math::Vector<3> position_true_i_m, const math::Quaternion quaternion_i2b); /** * @fn SetGnssInfo * @brief Calculate and set the GnssInfo values of target GNSS satellite * @param [in] antenna_to_satellite_i_m: Position vector from the antenna to the GNSS satellites in the ECI frame * @param [in] quaternion_i2b: True attitude of the spacecraft expressed by quaternion from the inertial frame to the body-fixed frame - * @param [in] gnss_id: ID of target GNSS satellite + * @param [in] gnss_system_id: ID of target GNSS satellite */ - void SetGnssInfo(libra::Vector<3> antenna_to_satellite_i_m, libra::Quaternion quaternion_i2b, std::string gnss_id); + void SetGnssInfo(const math::Vector<3> antenna_to_satellite_i_m, const math::Quaternion quaternion_i2b, const size_t gnss_system_id); /** * @fn AddNoise * @brief Substitutional method for "Measure" in other sensor models inherited Sensor class - * @param [in] position_true_i_m: True position of the spacecraft in the ECI frame [m] * @param [in] position_true_ecef_m: True position of the spacecraft in the ECEF frame [m] + * @param [in] velocity_true_ecef_m_s: True velocity of the spacecraft in the ECEF frame [m/s] */ - void AddNoise(libra::Vector<3> position_true_i_m, libra::Vector<3> position_true_ecef_m); + void AddNoise(const math::Vector<3> position_true_ecef_m, const math::Vector<3> velocity_true_ecef_m_s); /** - * @fn ConvertJulianDayToGPSTime + * @fn ConvertJulianDayToGpsTime * @brief Convert Julian day to GPS time * @param [in] julian_day: Julian day */ - void ConvertJulianDayToGPSTime(const double julian_day); + void ConvertJulianDayToGpsTime(const double julian_day); }; +/** + * @fn SetAntennaModel + * @brief Set AntennaModel by string + * @param [in] antenna_model: Antenna model name + * @return antenna model + */ +AntennaModel SetAntennaModel(const std::string antenna_model); + /** * @fn InitGnssReceiver * @brief Initialize functions for GNSS Receiver without power port @@ -229,8 +227,9 @@ class GnssReceiver : public Component, public ILoggable { * @param [in] gnss_satellites: GNSS satellites information * @param [in] simulation_time: Simulation time information */ -GnssReceiver InitGnssReceiver(ClockGenerator* clock_generator, int component_id, const std::string file_name, const Dynamics* dynamics, - const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time); +GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, const size_t component_id, const std::string file_name, + const dynamics::Dynamics* dynamics, const environment::GnssSatellites* gnss_satellites, + const environment::SimulationTime* simulation_time); /** * @fn InitGnssReceiver * @brief Initialize functions for GNSS Receiver with power port @@ -242,7 +241,10 @@ GnssReceiver InitGnssReceiver(ClockGenerator* clock_generator, int component_id, * @param [in] gnss_satellites: GNSS satellites information * @param [in] simulation_time: Simulation time information */ -GnssReceiver InitGnssReceiver(ClockGenerator* clock_generator, PowerPort* power_port, int component_id, const std::string file_name, - const Dynamics* dynamics, const GnssSatellites* gnss_satellites, const SimulationTime* simulation_time); +GnssReceiver InitGnssReceiver(environment::ClockGenerator* clock_generator, PowerPort* power_port, const size_t component_id, + const std::string file_name, const dynamics::Dynamics* dynamics, const environment::GnssSatellites* gnss_satellites, + const environment::SimulationTime* simulation_time); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_GNSS_RECEIVER_HPP_ diff --git a/src/components/real/aocs/gyro_sensor.cpp b/src/components/real/aocs/gyro_sensor.cpp index b22f99e1f..5a019cd5a 100644 --- a/src/components/real/aocs/gyro_sensor.cpp +++ b/src/components/real/aocs/gyro_sensor.cpp @@ -5,14 +5,16 @@ #include "gyro_sensor.hpp" -#include +#include -GyroSensor::GyroSensor(const int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const Dynamics* dynamics) +namespace s2e::components { + +GyroSensor::GyroSensor(const int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, + const math::Quaternion& quaternion_b2c, const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator), Sensor(sensor_base), sensor_id_(sensor_id), quaternion_b2c_(quaternion_b2c), dynamics_(dynamics) {} -GyroSensor::GyroSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const Dynamics* dynamics) +GyroSensor::GyroSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, + const unsigned int sensor_id, const math::Quaternion& quaternion_b2c, const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator, power_port), Sensor(sensor_base), sensor_id_(sensor_id), @@ -32,7 +34,7 @@ std::string GyroSensor::GetLogHeader() const { std::string str_tmp = ""; const std::string sensor_id = std::to_string(static_cast(sensor_id_)); std::string sensor_name = "gyro_sensor" + sensor_id + "_"; - str_tmp += WriteVector(sensor_name + "measured_angular_velocity", "c", "rad/s", kGyroDimension); + str_tmp += logger::WriteVector(sensor_name + "measured_angular_velocity", "c", "rad/s", kGyroDimension); return str_tmp; } @@ -40,19 +42,19 @@ std::string GyroSensor::GetLogHeader() const { std::string GyroSensor::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(angular_velocity_c_rad_s_); + str_tmp += logger::WriteVector(angular_velocity_c_rad_s_); return str_tmp; } -GyroSensor InitGyroSensor(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, - const Dynamics* dynamics) { - IniAccess gyro_conf(file_name); +GyroSensor InitGyroSensor(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, + const dynamics::Dynamics* dynamics) { + setting_file_reader::IniAccess gyro_conf(file_name); const char* sensor_name = "GYRO_SENSOR_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* GSection = section_name.c_str(); - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; gyro_conf.ReadQuaternion(GSection, "quaternion_b2c", quaternion_b2c); int prescaler = gyro_conf.ReadInt(GSection, "prescaler"); if (prescaler <= 1) prescaler = 1; @@ -66,14 +68,14 @@ GyroSensor InitGyroSensor(ClockGenerator* clock_generator, int sensor_id, const return gyro; } -GyroSensor InitGyroSensor(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - double component_step_time_s, const Dynamics* dynamics) { - IniAccess gyro_conf(file_name); +GyroSensor InitGyroSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + double component_step_time_s, const dynamics::Dynamics* dynamics) { + setting_file_reader::IniAccess gyro_conf(file_name); const char* sensor_name = "GYRO_SENSOR_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* GSection = section_name.c_str(); - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; gyro_conf.ReadQuaternion(GSection, "quaternion_b2c", quaternion_b2c); int prescaler = gyro_conf.ReadInt(GSection, "prescaler"); if (prescaler <= 1) prescaler = 1; @@ -88,3 +90,5 @@ GyroSensor InitGyroSensor(ClockGenerator* clock_generator, PowerPort* power_port GyroSensor gyro(prescaler, clock_generator, power_port, sensor_base, sensor_id, quaternion_b2c, dynamics); return gyro; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/gyro_sensor.hpp b/src/components/real/aocs/gyro_sensor.hpp index f391b2d6e..ab75c929e 100644 --- a/src/components/real/aocs/gyro_sensor.hpp +++ b/src/components/real/aocs/gyro_sensor.hpp @@ -7,19 +7,21 @@ #define S2E_COMPONENTS_REAL_AOCS_GYRO_SENSOR_HPP_ #include -#include -#include +#include +#include #include "../../base/component.hpp" #include "../../base/sensor.hpp" +namespace s2e::components { + const size_t kGyroDimension = 3; //!< Dimension of gyro sensor /** * @class GyroSensor * @brief Class to emulate gyro sensor */ -class GyroSensor : public Component, public Sensor, public ILoggable { +class GyroSensor : public Component, public Sensor, public logger::ILoggable { public: /** * @fn GyroSensor @@ -31,8 +33,8 @@ class GyroSensor : public Component, public Sensor, public ILogg * @param [in] quaternion_b2c: Quaternion from body frame to component frame * @param [in] dynamics: Dynamics information */ - GyroSensor(const int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const Dynamics* dynamics); + GyroSensor(const int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, + const math::Quaternion& quaternion_b2c, const dynamics::Dynamics* dynamics); /** * @fn GyroSensor * @brief Constructor with power port @@ -44,8 +46,8 @@ class GyroSensor : public Component, public Sensor, public ILogg * @param [in] quaternion_b2c: Quaternion from body frame to component frame * @param [in] dynamics: Dynamics information */ - GyroSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const Dynamics* dynamics); + GyroSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, + const unsigned int sensor_id, const math::Quaternion& quaternion_b2c, const dynamics::Dynamics* dynamics); /** * @fn ~GyroSensor * @brief Destructor @@ -59,15 +61,15 @@ class GyroSensor : public Component, public Sensor, public ILogg */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -75,15 +77,15 @@ class GyroSensor : public Component, public Sensor, public ILogg * @fn GetMeasuredAngularVelocity_c_rad_s * @brief Return observed angular velocity of the component frame with respect to the inertial frame */ - inline const libra::Vector& GetMeasuredAngularVelocity_c_rad_s(void) const { return angular_velocity_c_rad_s_; } + inline const math::Vector& GetMeasuredAngularVelocity_c_rad_s(void) const { return angular_velocity_c_rad_s_; } protected: - libra::Vector angular_velocity_c_rad_s_{ + math::Vector angular_velocity_c_rad_s_{ 0.0}; //!< Observed angular velocity of the component frame with respect to the inertial frame [rad/s] unsigned int sensor_id_ = 0; //!< Sensor ID - libra::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame + math::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame - const Dynamics* dynamics_; //!< Dynamics information + const dynamics::Dynamics* dynamics_; //!< Dynamics information }; /** @@ -95,8 +97,8 @@ class GyroSensor : public Component, public Sensor, public ILogg * @param [in] file_name: Path to the initialize file * @param [in] dynamics: Dynamics information */ -GyroSensor InitGyroSensor(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, - const Dynamics* dynamics); +GyroSensor InitGyroSensor(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, + const dynamics::Dynamics* dynamics); /** * @fn InitGyroSensor * @brief Initialize functions for gyro sensor with power port @@ -105,9 +107,11 @@ GyroSensor InitGyroSensor(ClockGenerator* clock_generator, int sensor_id, const * @param [in] sensor_id: Sensor ID * @param [in] component_step_time_s: Component step time [sec] * @param [in] file_name: Path to the initialize file - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ -GyroSensor InitGyroSensor(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - double component_step_time_s, const Dynamics* dynamics); +GyroSensor InitGyroSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + double component_step_time_s, const dynamics::Dynamics* dynamics); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_GYRO_SENSOR_HPP_ diff --git a/src/components/real/aocs/magnetometer.cpp b/src/components/real/aocs/magnetometer.cpp index d6e44b9d1..0958e312c 100644 --- a/src/components/real/aocs/magnetometer.cpp +++ b/src/components/real/aocs/magnetometer.cpp @@ -4,18 +4,21 @@ */ #include "magnetometer.hpp" -#include -#include +#include +#include -Magnetometer::Magnetometer(int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const GeomagneticField* geomagnetic_field) +namespace s2e::components { + +Magnetometer::Magnetometer(int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, + const math::Quaternion& quaternion_b2c, const environment::GeomagneticField* geomagnetic_field) : Component(prescaler, clock_generator), Sensor(sensor_base), sensor_id_(sensor_id), quaternion_b2c_(quaternion_b2c), geomagnetic_field_(geomagnetic_field) {} -Magnetometer::Magnetometer(int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const GeomagneticField* geomagnetic_field) +Magnetometer::Magnetometer(int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, + const unsigned int sensor_id, const math::Quaternion& quaternion_b2c, + const environment::GeomagneticField* geomagnetic_field) : Component(prescaler, clock_generator, power_port), Sensor(sensor_base), sensor_id_(sensor_id), @@ -34,7 +37,7 @@ std::string Magnetometer::GetLogHeader() const { std::string str_tmp = ""; const std::string sensor_id = std::to_string(static_cast(sensor_id_)); std::string sensor_name = "magnetometer" + sensor_id + "_"; - str_tmp += WriteVector(sensor_name + "measured_magnetic_field", "c", "nT", kMagnetometerDimension); + str_tmp += logger::WriteVector(sensor_name + "measured_magnetic_field", "c", "nT", kMagnetometerDimension); return str_tmp; } @@ -42,14 +45,14 @@ std::string Magnetometer::GetLogHeader() const { std::string Magnetometer::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(magnetic_field_c_nT_); + str_tmp += logger::WriteVector(magnetic_field_c_nT_); return str_tmp; } -Magnetometer InitMagnetometer(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, - const GeomagneticField* geomagnetic_field) { - IniAccess magsensor_conf(file_name); +Magnetometer InitMagnetometer(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, + const environment::GeomagneticField* geomagnetic_field) { + setting_file_reader::IniAccess magsensor_conf(file_name); const char* sensor_name = "MAGNETOMETER_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* MSSection = section_name.c_str(); @@ -57,7 +60,7 @@ Magnetometer InitMagnetometer(ClockGenerator* clock_generator, int sensor_id, co int prescaler = magsensor_conf.ReadInt(MSSection, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; magsensor_conf.ReadQuaternion(MSSection, "quaternion_b2c", quaternion_b2c); // Sensor @@ -68,9 +71,9 @@ Magnetometer InitMagnetometer(ClockGenerator* clock_generator, int sensor_id, co return magsensor; } -Magnetometer InitMagnetometer(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - double component_step_time_s, const GeomagneticField* geomagnetic_field) { - IniAccess magsensor_conf(file_name); +Magnetometer InitMagnetometer(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field) { + setting_file_reader::IniAccess magsensor_conf(file_name); const char* sensor_name = "MAGNETOMETER_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* MSSection = section_name.c_str(); @@ -78,7 +81,7 @@ Magnetometer InitMagnetometer(ClockGenerator* clock_generator, PowerPort* power_ int prescaler = magsensor_conf.ReadInt(MSSection, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; magsensor_conf.ReadQuaternion(MSSection, "quaternion_b2c", quaternion_b2c); // Sensor @@ -91,3 +94,5 @@ Magnetometer InitMagnetometer(ClockGenerator* clock_generator, PowerPort* power_ Magnetometer magsensor(prescaler, clock_generator, power_port, sensor_base, sensor_id, quaternion_b2c, geomagnetic_field); return magsensor; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/magnetometer.hpp b/src/components/real/aocs/magnetometer.hpp index c352b0553..2d788b366 100644 --- a/src/components/real/aocs/magnetometer.hpp +++ b/src/components/real/aocs/magnetometer.hpp @@ -7,19 +7,21 @@ #define S2E_COMPONENTS_REAL_AOCS_MAGNETOMETER_HPP_ #include -#include -#include +#include +#include #include "../../base/component.hpp" #include "../../base/sensor.hpp" +namespace s2e::components { + const size_t kMagnetometerDimension = 3; //!< Dimension of magnetometer /** * @class Magnetometer * @brief Class to emulate magnetometer */ -class Magnetometer : public Component, public Sensor, public ILoggable { +class Magnetometer : public Component, public Sensor, public logger::ILoggable { public: /** * @fn Magnetometer @@ -31,8 +33,8 @@ class Magnetometer : public Component, public Sensor, pu * @param [in] quaternion_b2c: Quaternion from body frame to component frame * @param [in] geomagnetic_field: Geomagnetic environment */ - Magnetometer(const int prescaler, ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const GeomagneticField* geomagnetic_field); + Magnetometer(const int prescaler, environment::ClockGenerator* clock_generator, Sensor& sensor_base, const unsigned int sensor_id, + const math::Quaternion& quaternion_b2c, const environment::GeomagneticField* geomagnetic_field); /** * @fn Magnetometer * @brief Constructor with power port @@ -44,8 +46,8 @@ class Magnetometer : public Component, public Sensor, pu * @param [in] quaternion_b2c: Quaternion from body frame to component frame * @param [in] geomagnetic_field: Geomagnetic environment */ - Magnetometer(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, const unsigned int sensor_id, - const libra::Quaternion& quaternion_b2c, const GeomagneticField* geomagnetic_field); + Magnetometer(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, Sensor& sensor_base, + const unsigned int sensor_id, const math::Quaternion& quaternion_b2c, const environment::GeomagneticField* geomagnetic_field); /** * @fn ~Magnetometer * @brief Destructor @@ -59,15 +61,15 @@ class Magnetometer : public Component, public Sensor, pu */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -75,34 +77,34 @@ class Magnetometer : public Component, public Sensor, pu * @fn GetMeasuredMagneticField_c_nT * @brief Return observed magnetic field on the component frame */ - inline const libra::Vector& GetMeasuredMagneticField_c_nT(void) const { return magnetic_field_c_nT_; } + inline const math::Vector& GetMeasuredMagneticField_c_nT(void) const { return magnetic_field_c_nT_; } /** * @fn SetConstantBiasNoise_c_nT * @brief Set constant bias noise at component frame [nT] * @param [in] constant_noise_c_nT: Constant bias noise at component frame [nT] */ - inline void SetConstantBiasNoise_c_nT(libra::Vector constant_noise_c_nT) { bias_noise_c_ = constant_noise_c_nT; } + inline void SetConstantBiasNoise_c_nT(math::Vector constant_noise_c_nT) { bias_noise_c_ = constant_noise_c_nT; } /** * @fn AddConstantBiasNoise_c_nT * @brief Add constant bias noise at component frame [nT] * @param [in] constant_noise_c_nT: Additional constant bias noise at component frame [nT] */ - inline void AddConstantBiasNoise_c_nT(libra::Vector constant_noise_c_nT) { bias_noise_c_ += constant_noise_c_nT; } + inline void AddConstantBiasNoise_c_nT(math::Vector constant_noise_c_nT) { bias_noise_c_ += constant_noise_c_nT; } /** * @fn GetConstantBiasNoise_c_nT * @brief Get constant bias noise at component frame [nT] */ - inline libra::Vector GetConstantBiasNoise_c_nT() const { return bias_noise_c_; } + inline math::Vector GetConstantBiasNoise_c_nT() const { return bias_noise_c_; } protected: - libra::Vector magnetic_field_c_nT_{0.0}; //!< Observed magnetic field on the component frame [nT] - unsigned int sensor_id_ = 0; //!< Sensor ID - libra::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame + math::Vector magnetic_field_c_nT_{0.0}; //!< Observed magnetic field on the component frame [nT] + unsigned int sensor_id_ = 0; //!< Sensor ID + math::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame - const GeomagneticField* geomagnetic_field_; //!< Geomagnetic environment + const environment::GeomagneticField* geomagnetic_field_; //!< Geomagnetic environment }; /** @@ -114,8 +116,8 @@ class Magnetometer : public Component, public Sensor, pu * @param [in] component_step_time_s: Component step time [sec] * @param [in] geomagnetic_field: Geomegnetic environment */ -Magnetometer InitMagnetometer(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, - const GeomagneticField* geomagnetic_field); +Magnetometer InitMagnetometer(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, + const environment::GeomagneticField* geomagnetic_field); /** * @fn InitMagnetometer * @brief Initialize functions for magnetometer with power port @@ -126,7 +128,9 @@ Magnetometer InitMagnetometer(ClockGenerator* clock_generator, int sensor_id, co * @param [in] component_step_time_s: Component step time [sec] * @param [in] geomagnetic_field: Geomegnetic environment */ -Magnetometer InitMagnetometer(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - double component_step_time_s, const GeomagneticField* geomagnetic_field); +Magnetometer InitMagnetometer(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_MAGNETOMETER_HPP_ diff --git a/src/components/real/aocs/magnetorquer.cpp b/src/components/real/aocs/magnetorquer.cpp index ab47dc6d1..0ee096e5e 100644 --- a/src/components/real/aocs/magnetorquer.cpp +++ b/src/components/real/aocs/magnetorquer.cpp @@ -5,19 +5,22 @@ #include "magnetorquer.hpp" -#include -#include -#include -#include -#include - -Magnetorquer::Magnetorquer(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, - const libra::Matrix& scale_factor, - const libra::Vector& max_magnetic_moment_c_Am2, - const libra::Vector& min_magnetic_moment_c_Am2, const libra::Vector& bias_noise_c_Am2_, - double random_walk_step_width_s, const libra::Vector& random_walk_standard_deviation_c_Am2, - const libra::Vector& random_walk_limit_c_Am2, - const libra::Vector& normal_random_standard_deviation_c_Am2, const GeomagneticField* geomagnetic_field) +#include +#include +#include +#include +#include + +namespace s2e::components { + +Magnetorquer::Magnetorquer(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, + const math::Quaternion& quaternion_b2c, const math::Matrix& scale_factor, + const math::Vector& max_magnetic_moment_c_Am2, const math::Vector& min_magnetic_moment_c_Am2, + const math::Vector& bias_noise_c_Am2_, double random_walk_step_width_s, + const math::Vector& random_walk_standard_deviation_c_Am2, + const math::Vector& random_walk_limit_c_Am2, + const math::Vector& normal_random_standard_deviation_c_Am2, + const environment::GeomagneticField* geomagnetic_field) : Component(prescaler, clock_generator), component_id_(component_id), quaternion_b2c_(quaternion_b2c), @@ -33,13 +36,14 @@ Magnetorquer::Magnetorquer(const int prescaler, ClockGenerator* clock_generator, } } -Magnetorquer::Magnetorquer(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const libra::Matrix& scale_factor, - const libra::Vector& max_magnetic_moment_c_Am2, - const libra::Vector& min_magnetic_moment_c_Am2, const libra::Vector& bias_noise_c_Am2_, - double random_walk_step_width_s, const libra::Vector& random_walk_standard_deviation_c_Am2, - const libra::Vector& random_walk_limit_c_Am2, - const libra::Vector& normal_random_standard_deviation_c_Am2, const GeomagneticField* geomagnetic_field) +Magnetorquer::Magnetorquer(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const math::Matrix& scale_factor, + const math::Vector& max_magnetic_moment_c_Am2, const math::Vector& min_magnetic_moment_c_Am2, + const math::Vector& bias_noise_c_Am2_, double random_walk_step_width_s, + const math::Vector& random_walk_standard_deviation_c_Am2, + const math::Vector& random_walk_limit_c_Am2, + const math::Vector& normal_random_standard_deviation_c_Am2, + const environment::GeomagneticField* geomagnetic_field) : Component(prescaler, clock_generator, power_port), component_id_(component_id), quaternion_b2c_(quaternion_b2c), @@ -67,7 +71,7 @@ void Magnetorquer::PowerOffRoutine() { output_magnetic_moment_b_Am2_ *= 0.0; } -libra::Vector Magnetorquer::CalcOutputTorque(void) { +math::Vector Magnetorquer::CalcOutputTorque(void) { for (size_t i = 0; i < kMtqDimension; ++i) { // Limit Check if (output_magnetic_moment_c_Am2_[i] > max_magnetic_moment_c_Am2_[i]) { @@ -97,23 +101,23 @@ std::string Magnetorquer::GetLogHeader() const { const std::string actuator_id = std::to_string(static_cast(component_id_)); std::string actuator_name = "magnetorquer" + actuator_id + "_"; - str_tmp += WriteVector(actuator_name + "output_magnetic_moment", "b", "Am2", kMtqDimension); - str_tmp += WriteVector(actuator_name + "output_torque", "b", "Nm", kMtqDimension); + str_tmp += logger::WriteVector(actuator_name + "output_magnetic_moment", "b", "Am2", kMtqDimension); + str_tmp += logger::WriteVector(actuator_name + "output_torque", "b", "Nm", kMtqDimension); return str_tmp; } std::string Magnetorquer::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(output_magnetic_moment_b_Am2_); - str_tmp += WriteVector(torque_b_Nm_); + str_tmp += logger::WriteVector(output_magnetic_moment_b_Am2_); + str_tmp += logger::WriteVector(torque_b_Nm_); return str_tmp; } -Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, int actuator_id, const std::string file_name, double component_step_time_s, - const GeomagneticField* geomagnetic_field) { - IniAccess magtorquer_conf(file_name); +Magnetorquer InitMagnetorquer(environment::ClockGenerator* clock_generator, int actuator_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field) { + setting_file_reader::IniAccess magtorquer_conf(file_name); const char* sensor_name = "MAGNETORQUER_"; const std::string section_name = sensor_name + std::to_string(static_cast(actuator_id)); const char* MTSection = section_name.c_str(); @@ -121,33 +125,33 @@ Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, int actuator_id, int prescaler = magtorquer_conf.ReadInt(MTSection, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Vector sf_vec; + math::Vector sf_vec; magtorquer_conf.ReadVector(MTSection, "scale_factor_c", sf_vec); - libra::Matrix scale_factor; + math::Matrix scale_factor; for (size_t i = 0; i < kMtqDimension; i++) { for (size_t j = 0; j < kMtqDimension; j++) { scale_factor[i][j] = sf_vec[i * kMtqDimension + j]; } } - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; magtorquer_conf.ReadQuaternion(MTSection, "quaternion_b2c", quaternion_b2c); - libra::Vector max_magnetic_moment_c_Am2; + math::Vector max_magnetic_moment_c_Am2; magtorquer_conf.ReadVector(MTSection, "max_output_magnetic_moment_c_Am2", max_magnetic_moment_c_Am2); - libra::Vector min_magnetic_moment_c_Am2; + math::Vector min_magnetic_moment_c_Am2; magtorquer_conf.ReadVector(MTSection, "min_output_magnetic_moment_c_Am2", min_magnetic_moment_c_Am2); - libra::Vector bias_noise_c_Am2; + math::Vector bias_noise_c_Am2; magtorquer_conf.ReadVector(MTSection, "constant_bias_noise_c_Am2", bias_noise_c_Am2); double random_walk_step_width_s = component_step_time_s * (double)prescaler; - libra::Vector random_walk_standard_deviation_c_Am2; + math::Vector random_walk_standard_deviation_c_Am2; magtorquer_conf.ReadVector(MTSection, "random_walk_standard_deviation_c_Am2", random_walk_standard_deviation_c_Am2); - libra::Vector random_walk_limit_c_Am2; + math::Vector random_walk_limit_c_Am2; magtorquer_conf.ReadVector(MTSection, "random_walk_limit_c_Am2", random_walk_limit_c_Am2); - libra::Vector normal_random_standard_deviation_c_Am2; + math::Vector normal_random_standard_deviation_c_Am2; magtorquer_conf.ReadVector(MTSection, "white_noise_standard_deviation_c_Am2", normal_random_standard_deviation_c_Am2); Magnetorquer magtorquer(prescaler, clock_generator, actuator_id, quaternion_b2c, scale_factor, max_magnetic_moment_c_Am2, min_magnetic_moment_c_Am2, @@ -156,9 +160,9 @@ Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, int actuator_id, return magtorquer; } -Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, const std::string file_name, - double component_step_time_s, const GeomagneticField* geomagnetic_field) { - IniAccess magtorquer_conf(file_name); +Magnetorquer InitMagnetorquer(environment::ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field) { + setting_file_reader::IniAccess magtorquer_conf(file_name); const char* sensor_name = "MAGNETORQUER_"; const std::string section_name = sensor_name + std::to_string(static_cast(actuator_id)); const char* MTSection = section_name.c_str(); @@ -166,33 +170,33 @@ Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, PowerPort* power_ int prescaler = magtorquer_conf.ReadInt(MTSection, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Vector sf_vec; + math::Vector sf_vec; magtorquer_conf.ReadVector(MTSection, "scale_factor_c", sf_vec); - libra::Matrix scale_factor; + math::Matrix scale_factor; for (size_t i = 0; i < kMtqDimension; i++) { for (size_t j = 0; j < kMtqDimension; j++) { scale_factor[i][j] = sf_vec[i * kMtqDimension + j]; } } - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; magtorquer_conf.ReadQuaternion(MTSection, "quaternion_b2c", quaternion_b2c); - libra::Vector max_magnetic_moment_c_Am2; + math::Vector max_magnetic_moment_c_Am2; magtorquer_conf.ReadVector(MTSection, "max_output_magnetic_moment_c_Am2", max_magnetic_moment_c_Am2); - libra::Vector min_magnetic_moment_c_Am2; + math::Vector min_magnetic_moment_c_Am2; magtorquer_conf.ReadVector(MTSection, "min_output_magnetic_moment_c_Am2", min_magnetic_moment_c_Am2); - libra::Vector bias_noise_c_Am2; + math::Vector bias_noise_c_Am2; magtorquer_conf.ReadVector(MTSection, "constant_bias_noise_c_Am2", bias_noise_c_Am2); double random_walk_step_width_s = component_step_time_s * (double)prescaler; - libra::Vector random_walk_standard_deviation_c_Am2; + math::Vector random_walk_standard_deviation_c_Am2; magtorquer_conf.ReadVector(MTSection, "random_walk_standard_deviation_c_Am2", random_walk_standard_deviation_c_Am2); - libra::Vector random_walk_limit_c_Am2; + math::Vector random_walk_limit_c_Am2; magtorquer_conf.ReadVector(MTSection, "random_walk_limit_c_Am2", random_walk_limit_c_Am2); - libra::Vector normal_random_standard_deviation_c_Am2; + math::Vector normal_random_standard_deviation_c_Am2; magtorquer_conf.ReadVector(MTSection, "white_noise_standard_deviation_c_Am2", normal_random_standard_deviation_c_Am2); // PowerPort @@ -203,3 +207,5 @@ Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, PowerPort* power_ random_walk_limit_c_Am2, normal_random_standard_deviation_c_Am2, geomagnetic_field); return magtorquer; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/magnetorquer.hpp b/src/components/real/aocs/magnetorquer.hpp index e4be7361f..0ef0a5e4b 100644 --- a/src/components/real/aocs/magnetorquer.hpp +++ b/src/components/real/aocs/magnetorquer.hpp @@ -7,22 +7,24 @@ #define S2E_COMPONENTS_REAL_AOCS_MAGNETORQUER_HPP_ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "../../base/component.hpp" +namespace s2e::components { + const size_t kMtqDimension = 3; //!< Dimension of magnetorquer /** * @class Magnetorquer * @brief Class to emulate magnetorquer */ -class Magnetorquer : public Component, public ILoggable { +class Magnetorquer : public Component, public logger::ILoggable { public: /** * @fn Magnetorquer @@ -41,12 +43,12 @@ class Magnetorquer : public Component, public ILoggable { * @param [in] normal_random_standard_deviation_c_Am2: Standard deviation for the normal random noise in the component frame [Am2] * @param [in] geomagnetic_field: Geomagnetic environment */ - Magnetorquer(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, - const libra::Matrix& scale_factor, const libra::Vector& max_magnetic_moment_c_Am2, - const libra::Vector& min_magnetic_moment_c_Am2, const libra::Vector& bias_noise_c_Am2_, - double random_walk_step_width_s, const libra::Vector& random_walk_standard_deviation_c_Am2, - const libra::Vector& random_walk_limit_c_Am2, - const libra::Vector& normal_random_standard_deviation_c_Am2, const GeomagneticField* geomagnetic_field); + Magnetorquer(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, const math::Quaternion& quaternion_b2c, + const math::Matrix& scale_factor, const math::Vector& max_magnetic_moment_c_Am2, + const math::Vector& min_magnetic_moment_c_Am2, const math::Vector& bias_noise_c_Am2_, + double random_walk_step_width_s, const math::Vector& random_walk_standard_deviation_c_Am2, + const math::Vector& random_walk_limit_c_Am2, const math::Vector& normal_random_standard_deviation_c_Am2, + const environment::GeomagneticField* geomagnetic_field); /** * @fn Magnetorquer * @brief Constructor with power port @@ -65,12 +67,12 @@ class Magnetorquer : public Component, public ILoggable { * @param [in] normal_random_standard_deviation_c_Am2: Standard deviation for the normal random noise in the component frame [Am2] * @param [in] geomagnetic_field: Geomagnetic environment */ - Magnetorquer(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const libra::Matrix& scale_factor, - const libra::Vector& max_magnetic_moment_c_Am2, const libra::Vector& min_magnetic_moment_c_Am2, - const libra::Vector& bias_noise_c_Am2_, double random_walk_step_width_s, - const libra::Vector& random_walk_standard_deviation_c_Am2, const libra::Vector& random_walk_limit_c_Am2, - const libra::Vector& normal_random_standard_deviation_c_Am2, const GeomagneticField* geomagnetic_field); + Magnetorquer(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const math::Matrix& scale_factor, + const math::Vector& max_magnetic_moment_c_Am2, const math::Vector& min_magnetic_moment_c_Am2, + const math::Vector& bias_noise_c_Am2_, double random_walk_step_width_s, + const math::Vector& random_walk_standard_deviation_c_Am2, const math::Vector& random_walk_limit_c_Am2, + const math::Vector& normal_random_standard_deviation_c_Am2, const environment::GeomagneticField* geomagnetic_field); // Override functions for Component /** @@ -84,15 +86,15 @@ class Magnetorquer : public Component, public ILoggable { */ void PowerOffRoutine() override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -100,50 +102,50 @@ class Magnetorquer : public Component, public ILoggable { * @fn GetOutputTorque_b_Nm * @brief Return output torque in the body fixed frame [Nm] */ - inline const libra::Vector& GetOutputTorque_b_Nm(void) const { return torque_b_Nm_; }; + inline const math::Vector& GetOutputTorque_b_Nm(void) const { return torque_b_Nm_; }; /** * @fn SetOutputMagneticMoment_c_Am2 * @brief Set output magnetic moment in the component frame [Am2] */ - inline void SetOutputMagneticMoment_c_Am2(const libra::Vector mag_moment_c) { output_magnetic_moment_c_Am2_ = mag_moment_c; }; + inline void SetOutputMagneticMoment_c_Am2(const math::Vector mag_moment_c) { output_magnetic_moment_c_Am2_ = mag_moment_c; }; /** * @fn SetOutputMagneticMoment_b_Am2 * @brief Return output magnetic moment in the body fixed frame [Am2] */ - inline const libra::Vector& SetOutputMagneticMoment_b_Am2(void) const { return output_magnetic_moment_b_Am2_; }; + inline const math::Vector& SetOutputMagneticMoment_b_Am2(void) const { return output_magnetic_moment_b_Am2_; }; /** * @fn GetOutputMagneticMoment_b_Am2 * @brief Return output magnetic moment in the body fixed frame [Am2] */ - inline const libra::Vector& GetOutputMagneticMoment_c_Am2(void) const { return output_magnetic_moment_c_Am2_; }; + inline const math::Vector& GetOutputMagneticMoment_c_Am2(void) const { return output_magnetic_moment_c_Am2_; }; protected: - const int component_id_ = 0; //!< Actuator ID - const double kConvertNanoT2T = 1.0e-9; //!< Constant to convert nT to T - libra::Vector torque_b_Nm_{0.0}; //!< Output torque in the body fixed frame [Nm] - libra::Vector output_magnetic_moment_c_Am2_{0.0}; //!< Output output magnetic moment in the component frame [Am2] - libra::Vector output_magnetic_moment_b_Am2_{0.0}; //!< Output output magnetic moment in the body fixed frame [Am2] - libra::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame - libra::Quaternion quaternion_c2b_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from component frame to body frame - libra::Matrix scale_factor_; //!< Scale factor matrix - libra::Vector max_magnetic_moment_c_Am2_{100.0}; //!< Maximum magnetic moment in the component frame [Am2] - libra::Vector min_magnetic_moment_c_Am2_{-100.0}; //!< Minimum magnetic moment in the component frame [Am2] - - libra::Vector bias_noise_c_Am2_{0.0}; //!< Constant bias noise in the component frame [Am2] - RandomWalk random_walk_c_Am2_; //!< Random walk noise - libra::NormalRand random_noise_c_Am2_[kMtqDimension]; //!< Normal random noise - - const GeomagneticField* geomagnetic_field_; //!< Geomagnetic environment + const int component_id_ = 0; //!< Actuator ID + const double kConvertNanoT2T = 1.0e-9; //!< Constant to convert nT to T + math::Vector torque_b_Nm_{0.0}; //!< Output torque in the body fixed frame [Nm] + math::Vector output_magnetic_moment_c_Am2_{0.0}; //!< Output output magnetic moment in the component frame [Am2] + math::Vector output_magnetic_moment_b_Am2_{0.0}; //!< Output output magnetic moment in the body fixed frame [Am2] + math::Quaternion quaternion_b2c_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from body frame to component frame + math::Quaternion quaternion_c2b_{0.0, 0.0, 0.0, 1.0}; //!< Quaternion from component frame to body frame + math::Matrix scale_factor_; //!< Scale factor matrix + math::Vector max_magnetic_moment_c_Am2_{100.0}; //!< Maximum magnetic moment in the component frame [Am2] + math::Vector min_magnetic_moment_c_Am2_{-100.0}; //!< Minimum magnetic moment in the component frame [Am2] + + math::Vector bias_noise_c_Am2_{0.0}; //!< Constant bias noise in the component frame [Am2] + randomization::RandomWalk random_walk_c_Am2_; //!< Random walk noise + randomization::NormalRand random_noise_c_Am2_[kMtqDimension]; //!< Normal random noise + + const environment::GeomagneticField* geomagnetic_field_; //!< Geomagnetic environment /** * @fn CalcOutputTorque * @brief Calculate output torque * @return Output torque in the body fixed frame [Nm] */ - libra::Vector CalcOutputTorque(void); + math::Vector CalcOutputTorque(void); }; /** @@ -155,8 +157,8 @@ class Magnetorquer : public Component, public ILoggable { * @param [in] component_step_time_s: Component step time [sec] * @param [in] geomagnetic_field: Geomegnetic environment */ -Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, int actuator_id, const std::string file_name, double component_step_time_s, - const GeomagneticField* geomagnetic_field); +Magnetorquer InitMagnetorquer(environment::ClockGenerator* clock_generator, int actuator_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field); /** * @fn InitMagnetorquer * @brief Initialize functions for magnetometer with power port @@ -167,7 +169,9 @@ Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, int actuator_id, * @param [in] component_step_time_s: Component step time [sec] * @param [in] geomagnetic_field: Geomegnetic environment */ -Magnetorquer InitMagnetorquer(ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, const std::string file_name, - double component_step_time_s, const GeomagneticField* geomagnetic_field); +Magnetorquer InitMagnetorquer(environment::ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, const std::string file_name, + double component_step_time_s, const environment::GeomagneticField* geomagnetic_field); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_MAGNETORQUER_HPP_ diff --git a/src/components/real/aocs/mtq_magnetometer_interference.cpp b/src/components/real/aocs/mtq_magnetometer_interference.cpp index c854453bd..c2428b15b 100644 --- a/src/components/real/aocs/mtq_magnetometer_interference.cpp +++ b/src/components/real/aocs/mtq_magnetometer_interference.cpp @@ -5,21 +5,23 @@ #include "mtq_magnetometer_interference.hpp" -#include "library/initialize/initialize_file_access.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::components { MtqMagnetometerInterference::MtqMagnetometerInterference(const std::string file_name, Magnetometer& magnetometer, const Magnetorquer& magnetorquer, const size_t initialize_id) : magnetometer_(magnetometer), magnetorquer_(magnetorquer) { // Read ini file - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); std::string section = "MTQ_MAGNETOMETER_INTERFERENCE_" + std::to_string(static_cast(initialize_id)); polynomial_degree_ = (size_t)ini_file.ReadInt(section.c_str(), "polynomial_degree"); for (size_t degree = 1; degree <= polynomial_degree_; degree++) { const std::string key_name = "additional_bias_by_mtq_coefficients_" + std::to_string(static_cast(degree)); - libra::Vector<9> additional_bias_by_mtq_coefficients_vec; - libra::Matrix<3, 3> additional_bias_by_mtq_coefficients; + math::Vector<9> additional_bias_by_mtq_coefficients_vec; + math::Matrix<3, 3> additional_bias_by_mtq_coefficients; ini_file.ReadVector(section.c_str(), key_name.c_str(), additional_bias_by_mtq_coefficients_vec); for (size_t i = 0; i < 3; i++) { for (size_t j = 0; j < 3; j++) { @@ -35,10 +37,10 @@ void MtqMagnetometerInterference::UpdateInterference(void) { magnetometer_.AddConstantBiasNoise_c_nT(-1.0 * previous_added_bias_c_nT_); // Calculate bias - libra::Vector<3> additional_bias_c_nT{0.0}; - libra::Vector<3> mtq_output_c_Am2 = magnetorquer_.GetOutputMagneticMoment_c_Am2(); + math::Vector<3> additional_bias_c_nT{0.0}; + math::Vector<3> mtq_output_c_Am2 = magnetorquer_.GetOutputMagneticMoment_c_Am2(); for (size_t degree = 1; degree <= polynomial_degree_; degree++) { - libra::Vector<3> hadamard_mtq; + math::Vector<3> hadamard_mtq; for (size_t axis = 0; axis < 3; axis++) { hadamard_mtq[axis] = pow(mtq_output_c_Am2[axis], degree); } @@ -49,3 +51,5 @@ void MtqMagnetometerInterference::UpdateInterference(void) { magnetometer_.AddConstantBiasNoise_c_nT(additional_bias_c_nT); previous_added_bias_c_nT_ = additional_bias_c_nT; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/mtq_magnetometer_interference.hpp b/src/components/real/aocs/mtq_magnetometer_interference.hpp index 5afe4a54e..67c5f0863 100644 --- a/src/components/real/aocs/mtq_magnetometer_interference.hpp +++ b/src/components/real/aocs/mtq_magnetometer_interference.hpp @@ -9,6 +9,8 @@ #include "magnetometer.hpp" #include "magnetorquer.hpp" +namespace s2e::components { + /** * @class MtqMagnetometerInterference * @brief Class for MTQ Magnetometer interference @@ -30,12 +32,14 @@ class MtqMagnetometerInterference { void UpdateInterference(void); protected: - size_t polynomial_degree_; //!< Polynomial degree - std::vector> additional_bias_by_mtq_coefficients_; //!< Polynomial coefficients of additional bias noise - libra::Vector<3> previous_added_bias_c_nT_{0.0}; + size_t polynomial_degree_; //!< Polynomial degree + std::vector> additional_bias_by_mtq_coefficients_; //!< Polynomial coefficients of additional bias noise + math::Vector<3> previous_added_bias_c_nT_{0.0}; Magnetometer& magnetometer_; //!< Magnetometer const Magnetorquer& magnetorquer_; //!< Magnetorquer }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_AOCS_MTQ_MAGNETOMETER_INTERFERENCE_HPP_ diff --git a/src/components/real/aocs/reaction_wheel.cpp b/src/components/real/aocs/reaction_wheel.cpp index 47dfe3bc6..9cdbac455 100644 --- a/src/components/real/aocs/reaction_wheel.cpp +++ b/src/components/real/aocs/reaction_wheel.cpp @@ -6,14 +6,16 @@ #include #include -#include -#include -#include +#include +#include #include +#include -ReactionWheel::ReactionWheel(const int prescaler, ClockGenerator* clock_generator, const int component_id, const double step_width_s, +namespace s2e::components { + +ReactionWheel::ReactionWheel(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, const double step_width_s, const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, - const libra::Quaternion quaternion_b2c, const libra::Vector<3> position_b_m, const double dead_time_s, + const math::Quaternion quaternion_b2c, const math::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, const std::vector friction_coefficients, const double stop_limit_angular_velocity_rad_s, const bool is_calc_jitter_enabled, const bool is_log_jitter_enabled, const int fast_prescaler, ReactionWheelJitter& rw_jitter, bool drive_flag, const double init_velocity_rad_s) @@ -31,16 +33,16 @@ ReactionWheel::ReactionWheel(const int prescaler, ClockGenerator* clock_generato stop_limit_angular_velocity_rad_s_(stop_limit_angular_velocity_rad_s), drive_flag_(drive_flag), velocity_limit_rpm_(max_velocity_rpm_), - ode_angular_velocity_(step_width_s_, velocity_limit_rpm_ * libra::rpm_to_rad_s, init_velocity_rad_s), + ode_angular_velocity_(step_width_s_, velocity_limit_rpm_ * math::rpm_to_rad_s, init_velocity_rad_s), rw_jitter_(rw_jitter), is_calculated_jitter_(is_calc_jitter_enabled), is_logged_jitter_(is_log_jitter_enabled) { Initialize(); } -ReactionWheel::ReactionWheel(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, +ReactionWheel::ReactionWheel(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, const double step_width_s, const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, - const libra::Quaternion quaternion_b2c, const libra::Vector<3> position_b_m, const double dead_time_s, + const math::Quaternion quaternion_b2c, const math::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, const std::vector friction_coefficients, const double stop_limit_angular_velocity_rad_s, const bool is_calc_jitter_enabled, const bool is_log_jitter_enabled, const int fast_prescaler, ReactionWheelJitter& rw_jitter, const bool drive_flag, const double init_velocity_rad_s) @@ -58,7 +60,7 @@ ReactionWheel::ReactionWheel(const int prescaler, ClockGenerator* clock_generato stop_limit_angular_velocity_rad_s_(stop_limit_angular_velocity_rad_s), drive_flag_(drive_flag), velocity_limit_rpm_(max_velocity_rpm_), - ode_angular_velocity_(step_width_s, velocity_limit_rpm_ * libra::rpm_to_rad_s, init_velocity_rad_s), + ode_angular_velocity_(step_width_s, velocity_limit_rpm_ * math::rpm_to_rad_s, init_velocity_rad_s), rw_jitter_(rw_jitter), is_calculated_jitter_(is_calc_jitter_enabled), is_logged_jitter_(is_log_jitter_enabled) { @@ -66,7 +68,7 @@ ReactionWheel::ReactionWheel(const int prescaler, ClockGenerator* clock_generato } void ReactionWheel::Initialize() { - rotation_axis_c_ = libra::Vector<3>(0.0); + rotation_axis_c_ = math::Vector<3>(0.0); rotation_axis_c_[2] = 1.0; rotation_axis_b_ = quaternion_b2c_.InverseFrameConversion(rotation_axis_c_); @@ -77,7 +79,7 @@ void ReactionWheel::Initialize() { generated_angular_acceleration_rad_s2_ = 0.0; angular_velocity_rad_s_ = ode_angular_velocity_.GetAngularVelocity_rad_s(); - angular_velocity_rpm_ = angular_velocity_rad_s_ * libra::rad_s_to_rpm; + angular_velocity_rpm_ = angular_velocity_rad_s_ * math::rad_s_to_rpm; // Turn on RW jitter calculation if (is_calculated_jitter_) { @@ -99,7 +101,7 @@ void ReactionWheel::FastUpdate() { } } -libra::Vector<3> ReactionWheel::CalcTorque() { +math::Vector<3> ReactionWheel::CalcTorque() { if (!drive_flag_) // RW idle mode -> coasting mode { // Clear delay buffer @@ -116,7 +118,7 @@ libra::Vector<3> ReactionWheel::CalcTorque() { if (abs_angular_velocity_rad_s < stop_limit_angular_velocity_rad_s_) { // Stop rotation rotation_direction = 0.0; - libra::Vector<1> zero_rad_s{0.0}; + math::Vector<1> zero_rad_s{0.0}; ode_angular_velocity_.Setup(0.0, zero_rad_s); } else if (angular_velocity_rad_s_ > 0.0) { rotation_direction = -1.0; @@ -141,7 +143,7 @@ libra::Vector<3> ReactionWheel::CalcTorque() { // Substitution double pre_angular_velocity_rad = angular_velocity_rad_s_; angular_velocity_rad_s_ = ode_angular_velocity_.GetAngularVelocity_rad_s(); - angular_velocity_rpm_ = angular_velocity_rad_s_ * libra::rad_s_to_rpm; + angular_velocity_rpm_ = angular_velocity_rad_s_ * math::rad_s_to_rpm; generated_angular_acceleration_rad_s2_ = (angular_velocity_rad_s_ - pre_angular_velocity_rad) / step_width_s_; // Calc output torque by RW @@ -150,20 +152,20 @@ libra::Vector<3> ReactionWheel::CalcTorque() { return output_torque_b_Nm_; } -const libra::Vector<3> ReactionWheel::GetOutputTorque_b_Nm() const { +const math::Vector<3> ReactionWheel::GetOutputTorque_b_Nm() const { if (is_calculated_jitter_) { // Add jitter_force_b_N_-derived torque and jitter_torque_b_Nm_ to output_torque_b - return output_torque_b_Nm_ - libra::OuterProduct(position_b_m_, rw_jitter_.GetJitterForce_b_N()) - rw_jitter_.GetJitterTorque_b_Nm(); + return output_torque_b_Nm_ - math::OuterProduct(position_b_m_, rw_jitter_.GetJitterForce_b_N()) - rw_jitter_.GetJitterTorque_b_Nm(); } else { return output_torque_b_Nm_; } } -const libra::Vector<3> ReactionWheel::GetJitterForce_b_N() const { +const math::Vector<3> ReactionWheel::GetJitterForce_b_N() const { if (is_calculated_jitter_) { return rw_jitter_.GetJitterForce_b_N(); } else { - libra::Vector<3> zero{0.0}; + math::Vector<3> zero{0.0}; return zero; } } @@ -188,7 +190,7 @@ void ReactionWheel::SetVelocityLimit_rpm(const double velocity_limit_rpm) { } else { velocity_limit_rpm_ = velocity_limit_rpm; } - ode_angular_velocity_.SetAngularVelocityLimit_rad_s(velocity_limit_rpm_ * libra::rpm_to_rad_s); + ode_angular_velocity_.SetAngularVelocityLimit_rad_s(velocity_limit_rpm_ * math::rpm_to_rad_s); return; } @@ -196,15 +198,15 @@ std::string ReactionWheel::GetLogHeader() const { std::string str_tmp = ""; std::string component_name = "rw" + std::to_string(static_cast(component_id_)) + "_"; - str_tmp += WriteScalar(component_name + "angular_velocity", "rad/s"); - str_tmp += WriteScalar(component_name + "angular_velocity", "rpm"); - str_tmp += WriteScalar(component_name + "angular_velocity_upper_limit", "rpm"); - str_tmp += WriteScalar(component_name + "target_angular_acceleration", "rad/s2"); - str_tmp += WriteScalar(component_name + "angular_acceleration", "rad/s2"); + str_tmp += logger::WriteScalar(component_name + "angular_velocity", "rad/s"); + str_tmp += logger::WriteScalar(component_name + "angular_velocity", "rpm"); + str_tmp += logger::WriteScalar(component_name + "angular_velocity_upper_limit", "rpm"); + str_tmp += logger::WriteScalar(component_name + "target_angular_acceleration", "rad/s2"); + str_tmp += logger::WriteScalar(component_name + "angular_acceleration", "rad/s2"); if (is_logged_jitter_ && is_calculated_jitter_) { - str_tmp += WriteVector(component_name + "jitter_force", "c", "N", 3); - str_tmp += WriteVector(component_name + "jitter_torque", "c", "Nm", 3); + str_tmp += logger::WriteVector(component_name + "jitter_force", "c", "N", 3); + str_tmp += logger::WriteVector(component_name + "jitter_torque", "c", "Nm", 3); } return str_tmp; @@ -213,15 +215,15 @@ std::string ReactionWheel::GetLogHeader() const { std::string ReactionWheel::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(angular_velocity_rad_s_); - str_tmp += WriteScalar(angular_velocity_rpm_); - str_tmp += WriteScalar(velocity_limit_rpm_); - str_tmp += WriteScalar(target_acceleration_rad_s2_); - str_tmp += WriteScalar(generated_angular_acceleration_rad_s2_); + str_tmp += logger::WriteScalar(angular_velocity_rad_s_); + str_tmp += logger::WriteScalar(angular_velocity_rpm_); + str_tmp += logger::WriteScalar(velocity_limit_rpm_); + str_tmp += logger::WriteScalar(target_acceleration_rad_s2_); + str_tmp += logger::WriteScalar(generated_angular_acceleration_rad_s2_); if (is_logged_jitter_ && is_calculated_jitter_) { - str_tmp += WriteVector(rw_jitter_.GetJitterForce_c_N()); - str_tmp += WriteVector(rw_jitter_.GetJitterTorque_c_Nm()); + str_tmp += logger::WriteVector(rw_jitter_.GetJitterForce_c_N()); + str_tmp += logger::WriteVector(rw_jitter_.GetJitterTorque_c_Nm()); } return str_tmp; @@ -238,8 +240,8 @@ double rotor_inertia_kgm2; double max_torque_Nm; double max_velocity_rpm; // Mounting -libra::Quaternion quaternion_b2c; -libra::Vector<3> position_b_m; +math::Quaternion quaternion_b2c; +math::Vector<3> position_b_m; // Time delay double dead_time_s; double time_constant_s; @@ -258,7 +260,7 @@ ReactionWheelJitter rw_jitter; void InitParams(int actuator_id, std::string file_name, double compo_update_step_s) { // Access Parameters - IniAccess rw_ini_file(file_name); + setting_file_reader::IniAccess rw_ini_file(file_name); std::string section_tmp = "REACTION_WHEEL_" + std::to_string(static_cast(actuator_id)); const char* rw_section = section_tmp.c_str(); @@ -279,11 +281,11 @@ void InitParams(int actuator_id, std::string file_name, double compo_update_step rw_ini_file.ReadQuaternion(rw_section, "quaternion_b2c", quaternion_b2c); } else // direction_determination_mode == "DIRECTION" { - libra::Vector<3> direction_b; + math::Vector<3> direction_b; rw_ini_file.ReadVector(rw_section, "direction_b", direction_b); - libra::Vector<3> direction_c(0.0); + math::Vector<3> direction_c(0.0); direction_c[2] = 1.0; - libra::Quaternion q(direction_b, direction_c); + math::Quaternion q(direction_b, direction_c); quaternion_b2c = q.Conjugate(); } rw_ini_file.ReadVector(rw_section, "position_b_m", position_b_m); @@ -314,8 +316,8 @@ void InitParams(int actuator_id, std::string file_name, double compo_update_step std::string radial_force_harmonics_coefficient_path = rw_ini_file.ReadString(jitter_section, "radial_force_harmonics_coefficient_file"); std::string radial_torque_harmonics_coefficient_path = rw_ini_file.ReadString(jitter_section, "radial_torque_harmonics_coefficient_file"); int harmonics_degree = rw_ini_file.ReadInt(jitter_section, "harmonics_degree"); - IniAccess conf_radial_force_harmonics(radial_force_harmonics_coefficient_path); - IniAccess conf_radial_torque_harmonics(radial_torque_harmonics_coefficient_path); + setting_file_reader::IniAccess conf_radial_force_harmonics(radial_force_harmonics_coefficient_path); + setting_file_reader::IniAccess conf_radial_torque_harmonics(radial_torque_harmonics_coefficient_path); std::vector> radial_force_harmonics_coefficients; std::vector> radial_torque_harmonics_coefficients; conf_radial_force_harmonics.ReadCsvDouble(radial_force_harmonics_coefficients, harmonics_degree); @@ -331,7 +333,7 @@ void InitParams(int actuator_id, std::string file_name, double compo_update_step } } // namespace -ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, int actuator_id, std::string file_name, double compo_update_step_s) { +ReactionWheel InitReactionWheel(environment::ClockGenerator* clock_generator, int actuator_id, std::string file_name, double compo_update_step_s) { InitParams(actuator_id, file_name, compo_update_step_s); ReactionWheel rw(prescaler, clock_generator, actuator_id, step_width_s, rotor_inertia_kgm2, max_torque_Nm, max_velocity_rpm, quaternion_b2c, @@ -341,7 +343,7 @@ ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, int actuator_id return rw; } -ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, std::string file_name, +ReactionWheel InitReactionWheel(environment::ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, std::string file_name, double compo_update_step_s) { InitParams(actuator_id, file_name, compo_update_step_s); @@ -353,3 +355,5 @@ ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, PowerPort* powe return rw; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/reaction_wheel.hpp b/src/components/real/aocs/reaction_wheel.hpp index d78e3d39b..39965a692 100644 --- a/src/components/real/aocs/reaction_wheel.hpp +++ b/src/components/real/aocs/reaction_wheel.hpp @@ -6,10 +6,10 @@ #ifndef S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_HPP_ #define S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_HPP_ -#include -#include -#include #include +#include +#include +#include #include #include @@ -17,12 +17,14 @@ #include "reaction_wheel_jitter.hpp" #include "reaction_wheel_ode.hpp" +namespace s2e::components { + /* * @class ReactionWheel * @brief Class to emulate Reaction Wheel * @note For one reaction wheel */ -class ReactionWheel : public Component, public ILoggable { +class ReactionWheel : public Component, public logger::ILoggable { public: /** * @fn ReactionWheel @@ -48,9 +50,9 @@ class ReactionWheel : public Component, public ILoggable { * @param [in] drive_flag: RW drive flag * @param [in] init_velocity_rad_s: Initial value of angular velocity of RW */ - ReactionWheel(const int prescaler, ClockGenerator* clock_generator, const int component_id, const double step_width_s, - const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, const libra::Quaternion quaternion_b2c, - const libra::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, + ReactionWheel(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, const double step_width_s, + const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, const math::Quaternion quaternion_b2c, + const math::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, const std::vector friction_coefficients, const double stop_limit_angular_velocity_rad_s, const bool is_calc_jitter_enabled, const bool is_log_jitter_enabled, const int fast_prescaler, ReactionWheelJitter& rw_jitter, const bool drive_flag = false, const double init_velocity_rad_s = 0.0); @@ -78,9 +80,9 @@ class ReactionWheel : public Component, public ILoggable { * @param [in] drive_flag: RW drive flag * @param [in] init_velocity_rad_s: Initial value of angular velocity of RW [rad/s] */ - ReactionWheel(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, const double step_width_s, - const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, const libra::Quaternion quaternion_b2c, - const libra::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, + ReactionWheel(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const double step_width_s, const double rotor_inertia_kgm2, const double max_torque_Nm, const double max_velocity_rpm, + const math::Quaternion quaternion_b2c, const math::Vector<3> position_b_m, const double dead_time_s, const double time_constant_s, const std::vector friction_coefficients, const double stop_limit_angular_velocity_rad_s, const bool is_calc_jitter_enabled, const bool is_log_jitter_enabled, const int fast_prescaler, ReactionWheelJitter& rw_jitter, const bool drive_flag = false, const double init_velocity_rad_s = 0.0); @@ -102,15 +104,15 @@ class ReactionWheel : public Component, public ILoggable { */ void FastUpdate() override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -119,12 +121,12 @@ class ReactionWheel : public Component, public ILoggable { * @fn GetOutputTorque_b_Nm * @brief Return output torque in the body fixed frame [Nm] */ - const libra::Vector<3> GetOutputTorque_b_Nm() const; + const math::Vector<3> GetOutputTorque_b_Nm() const; /** * @fn GetJitterForce_b_N * @brief Return output force by jitter in the body fixed frame [N] */ - inline const libra::Vector<3> GetJitterForce_b_N() const; + inline const math::Vector<3> GetJitterForce_b_N() const; /** * @fn GetDriveFlag * @brief Return drive flag @@ -144,7 +146,7 @@ class ReactionWheel : public Component, public ILoggable { * @fn GetAngularMomentum_b_Nms * @brief Return angular momentum of RW [Nms] */ - inline const libra::Vector<3> GetAngularMomentum_b_Nms() const { return angular_momentum_b_Nms_; }; + inline const math::Vector<3> GetAngularMomentum_b_Nms() const { return angular_momentum_b_Nms_; }; // Setter /** @@ -170,20 +172,20 @@ class ReactionWheel : public Component, public ILoggable { protected: // Fixed Parameters - const int component_id_; //!< Actuator ID - const double rotor_inertia_kgm2_; //!< Inertia of RW rotor [kgm2] - const double max_torque_Nm_; //!< Maximum output torque [Nm] - const double max_velocity_rpm_; //!< Maximum angular velocity of rotor [rpm] - const libra::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame - const libra::Vector<3> position_b_m_; //!< Position of RW in the body fixed frame [m] - libra::Vector<3> rotation_axis_c_; //!< Wheel rotation axis on the component frame. Constant as (0 0 1). (Output torque is minus direction) - libra::Vector<3> rotation_axis_b_; //!< Wheel rotation vector in the body fixed frame. + const int component_id_; //!< Actuator ID + const double rotor_inertia_kgm2_; //!< Inertia of RW rotor [kgm2] + const double max_torque_Nm_; //!< Maximum output torque [Nm] + const double max_velocity_rpm_; //!< Maximum angular velocity of rotor [rpm] + const math::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame + const math::Vector<3> position_b_m_; //!< Position of RW in the body fixed frame [m] + math::Vector<3> rotation_axis_c_; //!< Wheel rotation axis on the component frame. Constant as (0 0 1). (Output torque is minus direction) + math::Vector<3> rotation_axis_b_; //!< Wheel rotation vector in the body fixed frame. // Parameters for control delay - const double step_width_s_; //!< step width for ReactionWheelOde [sec] - const double dead_time_s_; //!< dead time [sec] - std::vector acceleration_delay_buffer_; //!< Delay buffer for acceleration - FirstOrderLag delayed_acceleration_rad_s2_; //!< Delayed acceleration [rad/s2] + const double step_width_s_; //!< step width for ReactionWheelOde [sec] + const double dead_time_s_; //!< dead time [sec] + std::vector acceleration_delay_buffer_; //!< Delay buffer for acceleration + control_utilities::FirstOrderLag delayed_acceleration_rad_s2_; //!< Delayed acceleration [rad/s2] // Coasting friction // f_rad_s2 = v_rad_s * coefficients(0) + (v_rad_s)^2 * coefficients(1) + ... @@ -199,8 +201,8 @@ class ReactionWheel : public Component, public ILoggable { double angular_velocity_rpm_ = 0.0; //!< Current angular velocity [rpm] double angular_velocity_rad_s_ = 0.0; //!< Current angular velocity [rad/s] // Output at body frame - libra::Vector<3> output_torque_b_Nm_{0.0}; //!< Output torque in the body fixed frame [Nm] - libra::Vector<3> angular_momentum_b_Nms_{0.0}; //!< Angular momentum of RW [Nms] + math::Vector<3> output_torque_b_Nm_{0.0}; //!< Output torque in the body fixed frame [Nm] + math::Vector<3> angular_momentum_b_Nms_{0.0}; //!< Angular momentum of RW [Nms] // ODE double velocity_limit_rpm_; //!< Velocity limit defined by users [RPM] @@ -216,7 +218,7 @@ class ReactionWheel : public Component, public ILoggable { * @fn CalcTorque * @brief Calculation of generated torque */ - libra::Vector<3> CalcTorque(); + math::Vector<3> CalcTorque(); /** * @fn Initialize * @brief Initialize function @@ -232,7 +234,7 @@ class ReactionWheel : public Component, public ILoggable { * @param [in] file_name: Path to the initialize file * @param [in] compo_update_step_s: Component step time [sec] */ -ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, int actuator_id, std::string file_name, double compo_update_step_s); +ReactionWheel InitReactionWheel(environment::ClockGenerator* clock_generator, int actuator_id, std::string file_name, double compo_update_step_s); /** * @fn InitReactionWheel * @brief Initialize functions for reaction wheel with power port @@ -243,7 +245,9 @@ ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, int actuator_id * @param [in] prop_step: Propagation step for RW dynamics [sec] * @param [in] compo_update_step_s: Component step time [sec] */ -ReactionWheel InitReactionWheel(ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, std::string file_name, +ReactionWheel InitReactionWheel(environment::ClockGenerator* clock_generator, PowerPort* power_port, int actuator_id, std::string file_name, double compo_update_step_s); +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_HPP_ diff --git a/src/components/real/aocs/reaction_wheel_jitter.cpp b/src/components/real/aocs/reaction_wheel_jitter.cpp index 1d7be9838..c7edc497f 100644 --- a/src/components/real/aocs/reaction_wheel_jitter.cpp +++ b/src/components/real/aocs/reaction_wheel_jitter.cpp @@ -5,20 +5,22 @@ #include "reaction_wheel_jitter.hpp" -#include -#include +#include #include +#include + +namespace s2e::components { ReactionWheelJitter::ReactionWheelJitter(std::vector> radial_force_harmonics_coefficients, std::vector> radial_torque_harmonics_coefficients, const double update_interval_s, - const libra::Quaternion quaternion_b2c, const double structural_resonance_frequency_Hz, + const math::Quaternion quaternion_b2c, const double structural_resonance_frequency_Hz, const double damping_factor, const double bandwidth, const bool considers_structural_resonance) : radial_force_harmonics_coefficients_(radial_force_harmonics_coefficients), radial_torque_harmonics_coefficients_(radial_torque_harmonics_coefficients), update_interval_s_(update_interval_s), quaternion_b2c_(quaternion_b2c), structural_resonance_frequency_Hz_(structural_resonance_frequency_Hz), - structural_resonance_angular_frequency_Hz_(libra::tau * structural_resonance_frequency_Hz), + structural_resonance_angular_frequency_Hz_(math::tau * structural_resonance_frequency_Hz), damping_factor_(damping_factor), bandwidth_(bandwidth), considers_structural_resonance_(considers_structural_resonance) { @@ -26,7 +28,7 @@ ReactionWheelJitter::ReactionWheelJitter(std::vector> radial // Generate random number for initial rotation phase std::random_device seed_gen; std::default_random_engine engine(seed_gen()); - std::uniform_real_distribution dist(0.0, libra::tau); + std::uniform_real_distribution dist(0.0, math::tau); // Initialize RW rotation phase for (size_t i = 0; i < radial_force_harmonics_coefficients_.size(); i++) { jitter_force_rotation_phase_.push_back(dist(engine)); @@ -126,3 +128,5 @@ void ReactionWheelJitter::CalcCoefficients() { coefficients_[5] = 4.0 - 4.0 * damping_factor_ * update_interval_s_ * structural_resonance_angular_frequency_Hz_ + pow(update_interval_s_, 2.0) * pow(structural_resonance_angular_frequency_Hz_, 2.0); } + +} // namespace s2e::components diff --git a/src/components/real/aocs/reaction_wheel_jitter.hpp b/src/components/real/aocs/reaction_wheel_jitter.hpp index 77c8bfc04..f926754dd 100644 --- a/src/components/real/aocs/reaction_wheel_jitter.hpp +++ b/src/components/real/aocs/reaction_wheel_jitter.hpp @@ -7,10 +7,12 @@ #define S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_JITTER_HPP_ #pragma once -#include -#include +#include +#include #include +namespace s2e::components { + /* * @class ReactionWheelJitter * @brief Class to calculate RW high-frequency jitter effect @@ -36,7 +38,7 @@ class ReactionWheelJitter { */ ReactionWheelJitter(std::vector> radial_force_harmonics_coefficients, std::vector> radial_torque_harmonics_coefficients, const double update_interval_s, - const libra::Quaternion quaternion_b2c, const double structural_resonance_frequency_Hz, const double damping_factor, + const math::Quaternion quaternion_b2c, const double structural_resonance_frequency_Hz, const double damping_factor, const double bandwidth, const bool considers_structural_resonance); /** * @fn ~ReactionWheelJitter @@ -55,24 +57,24 @@ class ReactionWheelJitter { * @fn GetJitterForce_b_N * @brief Return generated jitter force in the body fixed frame [N] */ - const libra::Vector<3> GetJitterForce_b_N() const { return jitter_force_b_N_; } + const math::Vector<3> GetJitterForce_b_N() const { return jitter_force_b_N_; } /** * @fn GetJitterTorque_b_Nm * @brief Return generated jitter torque in the body fixed frame [Nm] */ - const libra::Vector<3> GetJitterTorque_b_Nm() const { return jitter_torque_b_Nm_; } + const math::Vector<3> GetJitterTorque_b_Nm() const { return jitter_torque_b_Nm_; } /** * @fn GetJitterForce_c_N * @brief Return generated jitter force in the components frame [N] */ - const libra::Vector<3> GetJitterForce_c_N() const { + const math::Vector<3> GetJitterForce_c_N() const { return considers_structural_resonance_ ? filtered_jitter_force_n_c_ : unfiltered_jitter_force_n_c_; } /** * @fn GetJitterTorque_c_Nm * @brief Return generated jitter torque in the component frame [Nm] */ - const libra::Vector<3> GetJitterTorque_c_Nm() const { + const math::Vector<3> GetJitterTorque_c_Nm() const { return considers_structural_resonance_ ? filtered_jitter_torque_n_c_ : unfiltered_jitter_torque_n_c_; } @@ -80,8 +82,8 @@ class ReactionWheelJitter { std::vector> radial_force_harmonics_coefficients_; //!< Coefficients for radial force harmonics std::vector> radial_torque_harmonics_coefficients_; //!< Coefficients for radial torque harmonics - double update_interval_s_; //!< Jitter update interval [sec] - libra::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame + double update_interval_s_; //!< Jitter update interval [sec] + math::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame double structural_resonance_frequency_Hz_; //!< Frequency of structural resonance [Hz] double structural_resonance_angular_frequency_Hz_; //!< Angular Frequency of structural resonance @@ -94,22 +96,22 @@ class ReactionWheelJitter { std::vector jitter_torque_rotation_phase_; //!< 2 * pi * h_i * Omega * t [rad] // Variables for solving difference equations in component frame - libra::Vector<3> unfiltered_jitter_force_n_c_{0.0}; - libra::Vector<3> unfiltered_jitter_force_n_1_c_{0.0}; - libra::Vector<3> unfiltered_jitter_force_n_2_c_{0.0}; - libra::Vector<3> unfiltered_jitter_torque_n_c_{0.0}; - libra::Vector<3> unfiltered_jitter_torque_n_1_c_{0.0}; - libra::Vector<3> unfiltered_jitter_torque_n_2_c_{0.0}; - libra::Vector<3> filtered_jitter_force_n_c_{0.0}; - libra::Vector<3> filtered_jitter_force_n_1_c_{0.0}; - libra::Vector<3> filtered_jitter_force_n_2_c_{0.0}; - libra::Vector<3> filtered_jitter_torque_n_c_{0.0}; - libra::Vector<3> filtered_jitter_torque_n_1_c_{0.0}; - libra::Vector<3> filtered_jitter_torque_n_2_c_{0.0}; + math::Vector<3> unfiltered_jitter_force_n_c_{0.0}; + math::Vector<3> unfiltered_jitter_force_n_1_c_{0.0}; + math::Vector<3> unfiltered_jitter_force_n_2_c_{0.0}; + math::Vector<3> unfiltered_jitter_torque_n_c_{0.0}; + math::Vector<3> unfiltered_jitter_torque_n_1_c_{0.0}; + math::Vector<3> unfiltered_jitter_torque_n_2_c_{0.0}; + math::Vector<3> filtered_jitter_force_n_c_{0.0}; + math::Vector<3> filtered_jitter_force_n_1_c_{0.0}; + math::Vector<3> filtered_jitter_force_n_2_c_{0.0}; + math::Vector<3> filtered_jitter_torque_n_c_{0.0}; + math::Vector<3> filtered_jitter_torque_n_1_c_{0.0}; + math::Vector<3> filtered_jitter_torque_n_2_c_{0.0}; double coefficients_[6]; //!< Coefficients of difference equation - libra::Vector<3> jitter_force_b_N_{0.0}; //!< Generated jitter force in the body frame [N] - libra::Vector<3> jitter_torque_b_Nm_{0.0}; //!< Generated jitter torque in the body frame [Nm] + math::Vector<3> jitter_force_b_N_{0.0}; //!< Generated jitter force in the body frame [N] + math::Vector<3> jitter_torque_b_Nm_{0.0}; //!< Generated jitter torque in the body frame [Nm] /** * @fn AddStructuralResonance @@ -128,4 +130,6 @@ class ReactionWheelJitter { void CalcCoefficients(); }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_JITTER_HPP_ diff --git a/src/components/real/aocs/reaction_wheel_ode.cpp b/src/components/real/aocs/reaction_wheel_ode.cpp index f90162d53..fa5b1ac69 100644 --- a/src/components/real/aocs/reaction_wheel_ode.cpp +++ b/src/components/real/aocs/reaction_wheel_ode.cpp @@ -4,14 +4,16 @@ */ #include "reaction_wheel_ode.hpp" -#include +#include + +namespace s2e::components { ReactionWheelOde::ReactionWheelOde(const double step_width_s, const double velocity_limit_rad_s, const double initial_angular_velocity_rad_s) : OrdinaryDifferentialEquation<1>(step_width_s), velocity_limit_rad_s_(velocity_limit_rad_s) { - this->Setup(0.0, libra::Vector<1>(initial_angular_velocity_rad_s)); + this->Setup(0.0, math::Vector<1>(initial_angular_velocity_rad_s)); } -void ReactionWheelOde::DerivativeFunction(double x, const libra::Vector<1> &state, libra::Vector<1> &rhs) { +void ReactionWheelOde::DerivativeFunction(double x, const math::Vector<1> &state, math::Vector<1> &rhs) { UNUSED(x); double angular_velocity_rad_s = state[0]; @@ -28,3 +30,5 @@ void ReactionWheelOde::DerivativeFunction(double x, const libra::Vector<1> &stat rhs[0] = angular_acceleration_rad_s2_; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/reaction_wheel_ode.hpp b/src/components/real/aocs/reaction_wheel_ode.hpp index bbedfe60d..13c0b26f2 100644 --- a/src/components/real/aocs/reaction_wheel_ode.hpp +++ b/src/components/real/aocs/reaction_wheel_ode.hpp @@ -6,13 +6,15 @@ #ifndef S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_ODE_HPP_ #define S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_ODE_HPP_ -#include +#include + +namespace s2e::components { /* * @file ReactionWheelOde * @brief Ordinary differential equation of angular velocity of reaction wheel with first-order lag */ -class ReactionWheelOde : public libra::OrdinaryDifferentialEquation<1> { +class ReactionWheelOde : public math::OrdinaryDifferentialEquation<1> { public: /** * @fn ReactionWheelOde @@ -53,10 +55,12 @@ class ReactionWheelOde : public libra::OrdinaryDifferentialEquation<1> { * @param [in] state: State vector * @param [out] rhs: Differentiated value of state vector */ - void DerivativeFunction(double x, const libra::Vector<1>& state, libra::Vector<1>& rhs) override; + void DerivativeFunction(double x, const math::Vector<1>& state, math::Vector<1>& rhs) override; double velocity_limit_rad_s_; double angular_acceleration_rad_s2_ = 0.0; //!< Angular acceleration [rad/s2] }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_AOCS_REACTION_WHEEL_ODE_HPP_ diff --git a/src/components/real/aocs/star_sensor.cpp b/src/components/real/aocs/star_sensor.cpp index 15c4033f6..1ce9315a3 100644 --- a/src/components/real/aocs/star_sensor.cpp +++ b/src/components/real/aocs/star_sensor.cpp @@ -6,27 +6,30 @@ #include "star_sensor.hpp" #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include using namespace std; -using namespace libra; +using namespace s2e::math; -StarSensor::StarSensor(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, - const double standard_deviation_orthogonal_direction, const double standard_deviation_sight_direction, - const double step_time_s, const unsigned int output_delay, const unsigned int output_interval, - const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, const double moon_forbidden_angle_rad, - const double capture_rate_limit_rad_s, const Dynamics* dynamics, const LocalEnvironment* local_environment) +namespace s2e::components { + +StarSensor::StarSensor(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, + const math::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, + const double standard_deviation_sight_direction, const double step_time_s, const unsigned int output_delay, + const unsigned int output_interval, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, + const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, const dynamics::Dynamics* dynamics, + const environment::LocalEnvironment* local_environment) : Component(prescaler, clock_generator), component_id_(component_id), quaternion_b2c_(quaternion_b2c), - rotation_noise_(global_randomization.MakeSeed()), - orthogonal_direction_noise_(0.0, standard_deviation_orthogonal_direction, global_randomization.MakeSeed()), - sight_direction_noise_(0.0, standard_deviation_sight_direction, global_randomization.MakeSeed()), + rotation_noise_(randomization::global_randomization.MakeSeed()), + orthogonal_direction_noise_(0.0, standard_deviation_orthogonal_direction, randomization::global_randomization.MakeSeed()), + sight_direction_noise_(0.0, standard_deviation_sight_direction, randomization::global_randomization.MakeSeed()), buffer_position_(0), step_time_s_(step_time_s), output_delay_(output_delay), @@ -40,18 +43,18 @@ StarSensor::StarSensor(const int prescaler, ClockGenerator* clock_generator, con local_environment_(local_environment) { Initialize(); } -StarSensor::StarSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, +StarSensor::StarSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, const double standard_deviation_sight_direction, const double step_time_s, const unsigned int output_delay, const unsigned int output_interval, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, - const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, const Dynamics* dynamics, - const LocalEnvironment* local_environment) + const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, const dynamics::Dynamics* dynamics, + const environment::LocalEnvironment* local_environment) : Component(prescaler, clock_generator, power_port), component_id_(component_id), quaternion_b2c_(quaternion_b2c), - rotation_noise_(global_randomization.MakeSeed()), - orthogonal_direction_noise_(0.0, standard_deviation_orthogonal_direction, global_randomization.MakeSeed()), - sight_direction_noise_(0.0, standard_deviation_sight_direction, global_randomization.MakeSeed()), + rotation_noise_(randomization::global_randomization.MakeSeed()), + orthogonal_direction_noise_(0.0, standard_deviation_orthogonal_direction, randomization::global_randomization.MakeSeed()), + sight_direction_noise_(0.0, standard_deviation_sight_direction, randomization::global_randomization.MakeSeed()), buffer_position_(0), step_time_s_(step_time_s), output_delay_(output_delay), @@ -67,28 +70,29 @@ StarSensor::StarSensor(const int prescaler, ClockGenerator* clock_generator, Pow } void StarSensor::Initialize() { - measured_quaternion_i2c_ = libra::Quaternion(0.0, 0.0, 0.0, 1.0); + measured_quaternion_i2c_ = math::Quaternion(0.0, 0.0, 0.0, 1.0); // Decide delay buffer size max_delay_ = int(output_delay_ * 2 / step_time_s_); if (max_delay_ <= 0) max_delay_ = 1; - vector temp(max_delay_); + vector temp(max_delay_); delay_buffer_ = temp; // Initialize delay buffer for (int i = 0; i < max_delay_; ++i) { delay_buffer_[i] = measured_quaternion_i2c_; } - sight_direction_c_ = libra::Vector<3>(0.0); - first_orthogonal_direction_c = libra::Vector<3>(0.0); - second_orthogonal_direction_c = libra::Vector<3>(0.0); + sight_direction_c_ = math::Vector<3>(0.0); + first_orthogonal_direction_c = math::Vector<3>(0.0); + second_orthogonal_direction_c = math::Vector<3>(0.0); sight_direction_c_[0] = 1.0; //(1,0,0)@Component coordinates, viewing direction first_orthogonal_direction_c[1] = 1.0; //(0,1,0)@Component coordinates, line-of-sight orthogonal direction second_orthogonal_direction_c[2] = 1.0; //(0,0,1)@Component coordinates, line-of-sight orthogonal direction error_flag_ = true; } -Quaternion StarSensor::Measure(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude) { +Quaternion StarSensor::Measure(const environment::LocalCelestialInformation* local_celestial_information, + const dynamics::attitude::Attitude* attitude) { update(local_celestial_information, attitude); // update delay buffer if (update_count_ == 0) { int hist = buffer_position_ - output_delay_ - 1; @@ -104,16 +108,16 @@ Quaternion StarSensor::Measure(const LocalCelestialInformation* local_celestial_ return measured_quaternion_i2c_; } -void StarSensor::update(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude) { +void StarSensor::update(const environment::LocalCelestialInformation* local_celestial_information, const dynamics::attitude::Attitude* attitude) { Quaternion quaternion_i2b = attitude->GetQuaternion_i2b(); // Read true value Quaternion q_stt_temp = quaternion_i2b * quaternion_b2c_; // Convert to component frame // Add noise on sight direction Quaternion q_sight(sight_direction_c_, sight_direction_noise_); // Random noise on orthogonal direction of sight. Range [0:2pi] - double rot = libra::tau * double(rotation_noise_); + double rot = math::tau * double(rotation_noise_); // Calc observation error on orthogonal direction of sight - libra::Vector<3> rot_axis = cos(rot) * first_orthogonal_direction_c + sin(rot) * second_orthogonal_direction_c; - libra::Quaternion q_ortho(rot_axis, orthogonal_direction_noise_); + math::Vector<3> rot_axis = cos(rot) * first_orthogonal_direction_c + sin(rot) * second_orthogonal_direction_c; + math::Quaternion q_ortho(rot_axis, orthogonal_direction_noise_); // Judge errors AllJudgement(local_celestial_information, attitude); @@ -125,7 +129,8 @@ void StarSensor::update(const LocalCelestialInformation* local_celestial_informa buffer_position_ %= max_delay_; } -void StarSensor::AllJudgement(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude) { +void StarSensor::AllJudgement(const environment::LocalCelestialInformation* local_celestial_information, + const dynamics::attitude::Attitude* attitude) { int judgement = 0; judgement = SunJudgement(local_celestial_information->GetPositionFromSpacecraft_b_m("SUN")); judgement += EarthJudgement(local_celestial_information->GetPositionFromSpacecraft_b_m("EARTH")); @@ -137,9 +142,9 @@ void StarSensor::AllJudgement(const LocalCelestialInformation* local_celestial_i error_flag_ = false; } -int StarSensor::SunJudgement(const libra::Vector<3>& sun_b) { - libra::Quaternion q_c2b = quaternion_b2c_.Conjugate(); - libra::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); +int StarSensor::SunJudgement(const math::Vector<3>& sun_b) { + math::Quaternion q_c2b = quaternion_b2c_.Conjugate(); + math::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); double sun_angle_rad = CalAngleVector_rad(sun_b, sight_b); if (sun_angle_rad < sun_forbidden_angle_rad_) return 1; @@ -147,9 +152,9 @@ int StarSensor::SunJudgement(const libra::Vector<3>& sun_b) { return 0; } -int StarSensor::EarthJudgement(const libra::Vector<3>& earth_b) { - libra::Quaternion q_c2b = quaternion_b2c_.Conjugate(); - libra::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); +int StarSensor::EarthJudgement(const math::Vector<3>& earth_b) { + math::Quaternion q_c2b = quaternion_b2c_.Conjugate(); + math::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); double earth_size_rad = atan2(environment::earth_equatorial_radius_m, earth_b.CalcNorm()); // angles between sat<->earth_center & sat<->earth_edge double earth_center_angle_rad = CalAngleVector_rad(earth_b, sight_b); // angles between sat<->earth_center & sat_sight @@ -160,9 +165,9 @@ int StarSensor::EarthJudgement(const libra::Vector<3>& earth_b) { return 0; } -int StarSensor::MoonJudgement(const libra::Vector<3>& moon_b) { - libra::Quaternion q_c2b = quaternion_b2c_.Conjugate(); - libra::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); +int StarSensor::MoonJudgement(const math::Vector<3>& moon_b) { + math::Quaternion q_c2b = quaternion_b2c_.Conjugate(); + math::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); double moon_angle_rad = CalAngleVector_rad(moon_b, sight_b); if (moon_angle_rad < moon_forbidden_angle_rad_) return 1; @@ -170,7 +175,7 @@ int StarSensor::MoonJudgement(const libra::Vector<3>& moon_b) { return 0; } -int StarSensor::CaptureRateJudgement(const libra::Vector<3>& omega_b_rad_s) { +int StarSensor::CaptureRateJudgement(const math::Vector<3>& omega_b_rad_s) { double omega_norm = omega_b_rad_s.CalcNorm(); if (omega_norm > capture_rate_limit_rad_s_) return 1; @@ -183,8 +188,8 @@ std::string StarSensor::GetLogHeader() const { const std::string sensor_id = std::to_string(static_cast(component_id_)); std::string sensor_name = "stt" + sensor_id + "_"; - str_tmp += WriteQuaternion(sensor_name + "measured_quaternion", "i2c"); - str_tmp += WriteScalar(sensor_name + "error_flag"); + str_tmp += logger::WriteQuaternion(sensor_name + "measured_quaternion", "i2c"); + str_tmp += logger::WriteScalar(sensor_name + "error_flag"); return str_tmp; } @@ -192,15 +197,15 @@ std::string StarSensor::GetLogHeader() const { std::string StarSensor::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteQuaternion(measured_quaternion_i2c_); - str_tmp += WriteScalar(double(error_flag_)); + str_tmp += logger::WriteQuaternion(measured_quaternion_i2c_); + str_tmp += logger::WriteScalar(double(error_flag_)); return str_tmp; } double StarSensor::CalAngleVector_rad(const Vector<3>& vector1, const Vector<3>& vector2) { - libra::Vector<3> vect1_normal = vector1.CalcNormalizedVector(); - libra::Vector<3> vect2_normal = vector2.CalcNormalizedVector(); + math::Vector<3> vect1_normal = vector1.CalcNormalizedVector(); + math::Vector<3> vect2_normal = vector2.CalcNormalizedVector(); double cosTheta = InnerProduct(vect1_normal, vect2_normal); // Calc cos value double theta_rad = acos(cosTheta); @@ -213,9 +218,9 @@ void StarSensor::MainRoutine(const int time_count) { Measure(&(local_environment_->GetCelestialInformation()), &(dynamics_->GetAttitude())); } -StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const string file_name, double component_step_time_s, - const Dynamics* dynamics, const LocalEnvironment* local_environment) { - IniAccess STT_conf(file_name); +StarSensor InitStarSensor(environment::ClockGenerator* clock_generator, int sensor_id, const string file_name, double component_step_time_s, + const dynamics::Dynamics* dynamics, const environment::LocalEnvironment* local_environment) { + setting_file_reader::IniAccess STT_conf(file_name); const char* sensor_name = "STAR_SENSOR_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* STTSection = section_name.c_str(); @@ -223,7 +228,7 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const int prescaler = STT_conf.ReadInt(STTSection, "prescaler"); if (prescaler <= 1) prescaler = 1; double step_time_s = component_step_time_s * prescaler; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; STT_conf.ReadQuaternion(STTSection, "quaternion_b2c", quaternion_b2c); double standard_deviation_orthogonal_direction = STT_conf.ReadDouble(STTSection, "standard_deviation_orthogonal_direction_rad"); double standard_deviation_sight_direction = STT_conf.ReadDouble(STTSection, "standard_deviation_sight_direction_rad"); @@ -232,13 +237,13 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const double output_interval_sec = STT_conf.ReadDouble(STTSection, "output_interval_s"); int output_interval = max(int(output_interval_sec / step_time_s), 1); double sun_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "sun_exclusion_angle_deg"); - double sun_forbidden_angle_rad = sun_forbidden_angle_deg * libra::pi / 180.0; + double sun_forbidden_angle_rad = sun_forbidden_angle_deg * math::pi / 180.0; double earth_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "earth_exclusion_angle_deg"); - double earth_forbidden_angle_rad = earth_forbidden_angle_deg * libra::pi / 180.0; + double earth_forbidden_angle_rad = earth_forbidden_angle_deg * math::pi / 180.0; double moon_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "moon_exclusion_angle_deg"); - double moon_forbidden_angle_rad = moon_forbidden_angle_deg * libra::pi / 180.0; + double moon_forbidden_angle_rad = moon_forbidden_angle_deg * math::pi / 180.0; double capture_rate_deg_s = STT_conf.ReadDouble(STTSection, "angular_rate_limit_deg_s"); - double capture_rate_rad_s = capture_rate_deg_s * libra::pi / 180.0; + double capture_rate_rad_s = capture_rate_deg_s * math::pi / 180.0; StarSensor stt(prescaler, clock_generator, sensor_id, quaternion_b2c, standard_deviation_orthogonal_direction, standard_deviation_sight_direction, step_time_s, output_delay, output_interval, sun_forbidden_angle_rad, earth_forbidden_angle_rad, moon_forbidden_angle_rad, @@ -246,9 +251,9 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const return stt; } -StarSensor InitStarSensor(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const string file_name, double component_step_time_s, - const Dynamics* dynamics, const LocalEnvironment* local_environment) { - IniAccess STT_conf(file_name); +StarSensor InitStarSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const string file_name, + double component_step_time_s, const dynamics::Dynamics* dynamics, const environment::LocalEnvironment* local_environment) { + setting_file_reader::IniAccess STT_conf(file_name); const char* sensor_name = "STAR_SENSOR_"; const std::string section_name = sensor_name + std::to_string(static_cast(sensor_id)); const char* STTSection = section_name.c_str(); @@ -257,7 +262,7 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, PowerPort* power_port if (prescaler <= 1) prescaler = 1; double step_time_s = component_step_time_s * prescaler; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; STT_conf.ReadQuaternion(STTSection, "quaternion_b2c", quaternion_b2c); double standard_deviation_orthogonal_direction = STT_conf.ReadDouble(STTSection, "standard_deviation_orthogonal_direction_rad"); double standard_deviation_sight_direction = STT_conf.ReadDouble(STTSection, "standard_deviation_sight_direction_rad"); @@ -266,13 +271,13 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, PowerPort* power_port double output_interval_sec = STT_conf.ReadDouble(STTSection, "output_interval_s"); int output_interval = max(int(output_interval_sec / step_time_s), 1); double sun_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "sun_exclusion_angle_deg"); - double sun_forbidden_angle_rad = sun_forbidden_angle_deg * libra::pi / 180.0; + double sun_forbidden_angle_rad = sun_forbidden_angle_deg * math::pi / 180.0; double earth_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "earth_exclusion_angle_deg"); - double earth_forbidden_angle_rad = earth_forbidden_angle_deg * libra::pi / 180.0; + double earth_forbidden_angle_rad = earth_forbidden_angle_deg * math::pi / 180.0; double moon_forbidden_angle_deg = STT_conf.ReadDouble(STTSection, "moon_exclusion_angle_deg"); - double moon_forbidden_angle_rad = moon_forbidden_angle_deg * libra::pi / 180.0; + double moon_forbidden_angle_rad = moon_forbidden_angle_deg * math::pi / 180.0; double capture_rate_deg_s = STT_conf.ReadDouble(STTSection, "angular_rate_limit_deg_s"); - double capture_rate_rad_s = capture_rate_deg_s * libra::pi / 180.0; + double capture_rate_rad_s = capture_rate_deg_s * math::pi / 180.0; power_port->InitializeWithInitializeFile(file_name); @@ -281,3 +286,5 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, PowerPort* power_port moon_forbidden_angle_rad, capture_rate_rad_s, dynamics, local_environment); return stt; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/star_sensor.hpp b/src/components/real/aocs/star_sensor.hpp index b2f4daef9..0f3f7e321 100644 --- a/src/components/real/aocs/star_sensor.hpp +++ b/src/components/real/aocs/star_sensor.hpp @@ -8,21 +8,23 @@ #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include "../../base/component.hpp" #include "dynamics/dynamics.hpp" +namespace s2e::components { + /* * @class StarSensor * @brief Class to emulate star tracker */ -class StarSensor : public Component, public ILoggable { +class StarSensor : public Component, public logger::ILoggable { public: /** * @fn StarSensor @@ -43,11 +45,11 @@ class StarSensor : public Component, public ILoggable { * @param [in] dynamics: Dynamics information * @param [in] local_environment: Local environment information */ - StarSensor(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, + StarSensor(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, const math::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, const double standard_deviation_sight_direction, const double step_time_s, const unsigned int output_delay, const unsigned int output_interval, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, - const Dynamics* dynamics, const LocalEnvironment* local_environment); + const dynamics::Dynamics* dynamics, const environment::LocalEnvironment* local_environment); /** * @fn StarSensor * @brief Constructor with power port @@ -68,12 +70,12 @@ class StarSensor : public Component, public ILoggable { * @param [in] dynamics: Dynamics information * @param [in] local_environment: Local environment information */ - StarSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, + StarSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const double standard_deviation_orthogonal_direction, const double standard_deviation_sight_direction, const double step_time_s, const unsigned int output_delay, const unsigned int output_interval, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, - const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, const Dynamics* dynamics, - const LocalEnvironment* local_environment); + const double moon_forbidden_angle_rad, const double capture_rate_limit_rad_s, const dynamics::Dynamics* dynamics, + const environment::LocalEnvironment* local_environment); // Override functions for Component /** @@ -82,15 +84,15 @@ class StarSensor : public Component, public ILoggable { */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -98,7 +100,7 @@ class StarSensor : public Component, public ILoggable { * @fn GetMeasuredQuaternion_i2c * @brief Return observed quaternion from the inertial frame to the component frame */ - inline const libra::Quaternion GetMeasuredQuaternion_i2c() const { return measured_quaternion_i2c_; }; + inline const math::Quaternion GetMeasuredQuaternion_i2c() const { return measured_quaternion_i2c_; }; /** * @fn GetErrorFlag * @brief Return error flag @@ -107,26 +109,26 @@ class StarSensor : public Component, public ILoggable { protected: // StarSensor general parameters - const int component_id_; //!< Sensor ID - libra::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame - libra::Quaternion measured_quaternion_i2c_ = {0.0, 0.0, 0.0, 1.0}; //!< StarSensor observed quaternion - libra::Vector<3> sight_direction_c_; //!< Sight direction vector at component frame - libra::Vector<3> first_orthogonal_direction_c; //!< The first orthogonal direction of sight at component frame - libra::Vector<3> second_orthogonal_direction_c; //!< The second orthogonal direction of sight at component frame + const int component_id_; //!< Sensor ID + math::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame + math::Quaternion measured_quaternion_i2c_ = {0.0, 0.0, 0.0, 1.0}; //!< StarSensor observed quaternion + math::Vector<3> sight_direction_c_; //!< Sight direction vector at component frame + math::Vector<3> first_orthogonal_direction_c; //!< The first orthogonal direction of sight at component frame + math::Vector<3> second_orthogonal_direction_c; //!< The second orthogonal direction of sight at component frame // Noise parameters - libra::MinimalStandardLcgWithShuffle rotation_noise_; //!< Randomize object for orthogonal direction - libra::NormalRand orthogonal_direction_noise_; //!< Random noise for orthogonal direction of sight - libra::NormalRand sight_direction_noise_; //!< Random noise for sight direction + randomization::MinimalStandardLcgWithShuffle rotation_noise_; //!< Randomize object for orthogonal direction + randomization::NormalRand orthogonal_direction_noise_; //!< Random noise for orthogonal direction of sight + randomization::NormalRand sight_direction_noise_; //!< Random noise for sight direction // Delay emulation parameters - int max_delay_; //!< Max delay - std::vector delay_buffer_; //!< Buffer of quaternion for delay emulation - int buffer_position_; //!< Buffer position - double step_time_s_; //!< Step time for delay calculation [sec] - unsigned int output_delay_; //!< Output delay [0, max_delay_] [step_sec] - unsigned int output_interval_; //!< Output interval [step_sec] - std::size_t update_count_; //!< Output update counter + int max_delay_; //!< Max delay + std::vector delay_buffer_; //!< Buffer of quaternion for delay emulation + int buffer_position_; //!< Buffer position + double step_time_s_; //!< Step time for delay calculation [sec] + unsigned int output_delay_; //!< Output delay [0, max_delay_] [step_sec] + unsigned int output_interval_; //!< Output interval [step_sec] + std::size_t update_count_; //!< Output update counter // observation error parameters bool error_flag_; //!< Error flag. true: Error, false: No error @@ -136,60 +138,60 @@ class StarSensor : public Component, public ILoggable { double capture_rate_limit_rad_s_; //!< Angular rate limit to get correct attitude [rad/s] // Observed variables - const Dynamics* dynamics_; //!< Dynamics information - const LocalEnvironment* local_environment_; //!< Local environment information + const dynamics::Dynamics* dynamics_; //!< Dynamics information + const environment::LocalEnvironment* local_environment_; //!< Local environment information // Internal functions /** * @fn update * @brief Update delay buffer * @param [in] local_celestial_information: Local celestial information - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information */ - void update(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude); + void update(const environment::LocalCelestialInformation* local_celestial_information, const dynamics::attitude::Attitude* attitude); /** * @fn Measure * @brief Calculate measured quaternion * @param [in] local_celestial_information: Local celestial information - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information */ - libra::Quaternion Measure(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude); + math::Quaternion Measure(const environment::LocalCelestialInformation* local_celestial_information, const dynamics::attitude::Attitude* attitude); /** * @fn AllJudgement * @brief Calculate all error judgement * @param [in] local_celestial_information: Local celestial information - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information */ - void AllJudgement(const LocalCelestialInformation* local_celestial_information, const Attitude* attitude); + void AllJudgement(const environment::LocalCelestialInformation* local_celestial_information, const dynamics::attitude::Attitude* attitude); /** * @fn SunJudgement * @brief Judge violation of sun forbidden angle * @param [in] sun_b: Sun direction vector in the body fixed frame * @return 1: violated, 0: not violated */ - int SunJudgement(const libra::Vector<3>& sun_b); + int SunJudgement(const math::Vector<3>& sun_b); /** * @fn EarthJudgement * @brief Judge violation of earth forbidden angle * @param [in] earth_b: Earth direction vector in the body fixed frame * @return 1: violated, 0: not violated */ - int EarthJudgement(const libra::Vector<3>& earth_b); + int EarthJudgement(const math::Vector<3>& earth_b); /** * @fn MoonJudgement * @brief Judge violation of moon forbidden angle * @param [in] moon_b: Moon direction vector in the body fixed frame * @return 1: violated, 0: not violated */ - int MoonJudgement(const libra::Vector<3>& moon_b); + int MoonJudgement(const math::Vector<3>& moon_b); /** * @fn CaptureRateJudgement * @brief Judge violation of angular velocity limit * @param [in] omega_b_rad_s: Angular velocity of spacecraft in the body fixed frame * @return 1: violated, 0: not violated */ - int CaptureRateJudgement(const libra::Vector<3>& omega_b_rad_s); + int CaptureRateJudgement(const math::Vector<3>& omega_b_rad_s); /** * @fn CalAngleVector_rad * @brief Calculate angle between two vectors @@ -197,7 +199,7 @@ class StarSensor : public Component, public ILoggable { * @param [in] vector2: Second vector * @return Angle between two vectors [rad] */ - double CalAngleVector_rad(const libra::Vector<3>& vector1, const libra::Vector<3>& vector2); + double CalAngleVector_rad(const math::Vector<3>& vector1, const math::Vector<3>& vector2); /** * @fn Initialize @@ -216,8 +218,8 @@ class StarSensor : public Component, public ILoggable { * @param [in] dynamics: Dynamics information * @param [in] local_environment: Local environment information */ -StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, - const Dynamics* dynamics, const LocalEnvironment* local_environment); +StarSensor InitStarSensor(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, double component_step_time_s, + const dynamics::Dynamics* dynamics, const environment::LocalEnvironment* local_environment); /** * @fn InitStarSensor * @brief Initialize functions for StarSensor with power port @@ -229,7 +231,9 @@ StarSensor InitStarSensor(ClockGenerator* clock_generator, int sensor_id, const * @param [in] dynamics: Dynamics information * @param [in] local_environment: Local environment information */ -StarSensor InitStarSensor(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - double component_step_time_s, const Dynamics* dynamics, const LocalEnvironment* local_environment); +StarSensor InitStarSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + double component_step_time_s, const dynamics::Dynamics* dynamics, const environment::LocalEnvironment* local_environment); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_STAR_SENSOR_HPP_ diff --git a/src/components/real/aocs/sun_sensor.cpp b/src/components/real/aocs/sun_sensor.cpp index c10959a9e..3745d99b7 100644 --- a/src/components/real/aocs/sun_sensor.cpp +++ b/src/components/real/aocs/sun_sensor.cpp @@ -5,19 +5,21 @@ #include "sun_sensor.hpp" -#include -#include -using libra::NormalRand; -#include -#include -#include +#include +#include +#include +#include +#include using namespace std; -SunSensor::SunSensor(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, - const double detectable_angle_rad, const double random_noise_standard_deviation_rad, +namespace s2e::components { + +SunSensor::SunSensor(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, + const math::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, const double bias_noise_standard_deviation_rad, const double intensity_lower_threshold_percent, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information) + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information) : Component(prescaler, clock_generator), component_id_(component_id), quaternion_b2c_(quaternion_b2c), @@ -28,10 +30,11 @@ SunSensor::SunSensor(const int prescaler, ClockGenerator* clock_generator, const Initialize(random_noise_standard_deviation_rad, bias_noise_standard_deviation_rad); } -SunSensor::SunSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, +SunSensor::SunSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, const double bias_noise_standard_deviation_rad, const double intensity_lower_threshold_percent, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information) + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information) : Component(prescaler, clock_generator, power_port), component_id_(component_id), quaternion_b2c_(quaternion_b2c), @@ -44,7 +47,7 @@ SunSensor::SunSensor(const int prescaler, ClockGenerator* clock_generator, Power void SunSensor::Initialize(const double random_noise_standard_deviation_rad, const double bias_noise_standard_deviation_rad) { // Bias - NormalRand nr(0.0, bias_noise_standard_deviation_rad, global_randomization.MakeSeed()); + randomization::NormalRand nr(0.0, bias_noise_standard_deviation_rad, randomization::global_randomization.MakeSeed()); bias_noise_alpha_rad_ += nr; bias_noise_beta_rad_ += nr; @@ -59,8 +62,8 @@ void SunSensor::MainRoutine(const int time_count) { } void SunSensor::Measure() { - libra::Vector<3> sun_pos_b = local_celestial_information_->GetPositionFromSpacecraft_b_m("SUN"); - libra::Vector<3> sun_dir_b = sun_pos_b.CalcNormalizedVector(); + math::Vector<3> sun_pos_b = local_celestial_information_->GetPositionFromSpacecraft_b_m("SUN"); + math::Vector<3> sun_dir_b = sun_pos_b.CalcNormalizedVector(); sun_direction_true_c_ = quaternion_b2c_.FrameConversion(sun_dir_b); // Frame conversion from body to component @@ -87,7 +90,7 @@ void SunSensor::Measure() { measured_sun_direction_c_ = measured_sun_direction_c_.CalcNormalizedVector(); } else { - measured_sun_direction_c_ = libra::Vector<3>(0); + measured_sun_direction_c_ = math::Vector<3>(0); alpha_rad_ = 0.0; beta_rad_ = 0.0; } @@ -96,7 +99,7 @@ void SunSensor::Measure() { } void SunSensor::SunDetectionJudgement() { - libra::Vector<3> sun_direction_c = sun_direction_true_c_.CalcNormalizedVector(); + math::Vector<3> sun_direction_c = sun_direction_true_c_.CalcNormalizedVector(); double sun_angle_ = acos(sun_direction_c[2]); @@ -112,10 +115,10 @@ void SunSensor::SunDetectionJudgement() { } void SunSensor::CalcSolarIlluminance() { - libra::Vector<3> sun_direction_c = sun_direction_true_c_.CalcNormalizedVector(); + math::Vector<3> sun_direction_c = sun_direction_true_c_.CalcNormalizedVector(); double sun_angle_ = acos(sun_direction_c[2]); - if (sun_angle_ > libra::pi_2) { + if (sun_angle_ > math::pi_2) { solar_illuminance_W_m2_ = 0.0; return; } @@ -126,8 +129,8 @@ void SunSensor::CalcSolarIlluminance() { } double SunSensor::TanRange(double x) { - if (x > libra::pi_2) x = libra::pi - x; - if (x < -libra::pi_2) x = -libra::pi - x; + if (x > math::pi_2) x = math::pi - x; + if (x < -math::pi_2) x = -math::pi - x; return x; } @@ -136,8 +139,8 @@ string SunSensor::GetLogHeader() const { const string sensor_id = std::to_string(static_cast(component_id_)); std::string sensor_name = "sun_sensor" + sensor_id + "_"; - str_tmp += WriteVector(sensor_name + "measured_sun_direction", "c", "-", 3); - str_tmp += WriteScalar(sensor_name + "sun_detected_flag", "-"); + str_tmp += logger::WriteVector(sensor_name + "measured_sun_direction", "c", "-", 3); + str_tmp += logger::WriteScalar(sensor_name + "sun_detected_flag", "-"); return str_tmp; } @@ -145,15 +148,16 @@ string SunSensor::GetLogHeader() const { string SunSensor::GetLogValue() const { string str_tmp = ""; - str_tmp += WriteVector(measured_sun_direction_c_); - str_tmp += WriteScalar(double(sun_detected_flag_)); + str_tmp += logger::WriteVector(measured_sun_direction_c_); + str_tmp += logger::WriteScalar(double(sun_detected_flag_)); return str_tmp; } -SunSensor InitSunSensor(ClockGenerator* clock_generator, int ss_id, std::string file_name, const SolarRadiationPressureEnvironment* srp_environment, - const LocalCelestialInformation* local_celestial_information) { - IniAccess ss_conf(file_name); +SunSensor InitSunSensor(environment::ClockGenerator* clock_generator, int ss_id, std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information) { + setting_file_reader::IniAccess ss_conf(file_name); const char* sensor_name = "SUN_SENSOR_"; const std::string section_tmp = sensor_name + std::to_string(static_cast(ss_id)); const char* Section = section_tmp.c_str(); @@ -161,20 +165,20 @@ SunSensor InitSunSensor(ClockGenerator* clock_generator, int ss_id, std::string int prescaler = ss_conf.ReadInt(Section, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; ss_conf.ReadQuaternion(Section, "quaternion_b2c", quaternion_b2c); double detectable_angle_deg = 0.0, detectable_angle_rad = 0.0; detectable_angle_deg = ss_conf.ReadDouble(Section, "field_of_view_deg"); - detectable_angle_rad = libra::pi / 180.0 * detectable_angle_deg; + detectable_angle_rad = math::pi / 180.0 * detectable_angle_deg; double nr_stddev = 0.0; nr_stddev = ss_conf.ReadDouble(Section, "white_noise_standard_deviation_deg"); - nr_stddev *= libra::pi / 180.0; + nr_stddev *= math::pi / 180.0; double nr_bias_stddev = 0.0; nr_bias_stddev = ss_conf.ReadDouble(Section, "bias_standard_deviation_deg"); - nr_bias_stddev *= libra::pi / 180.0; + nr_bias_stddev *= math::pi / 180.0; double intensity_lower_threshold_percent; intensity_lower_threshold_percent = ss_conf.ReadDouble(Section, "intensity_lower_threshold_percent"); @@ -184,9 +188,10 @@ SunSensor InitSunSensor(ClockGenerator* clock_generator, int ss_id, std::string return ss; } -SunSensor InitSunSensor(ClockGenerator* clock_generator, PowerPort* power_port, int ss_id, std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information) { - IniAccess ss_conf(file_name); +SunSensor InitSunSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int ss_id, std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information) { + setting_file_reader::IniAccess ss_conf(file_name); const char* sensor_name = "SUN_SENSOR_"; const std::string section_tmp = sensor_name + std::to_string(static_cast(ss_id)); const char* Section = section_tmp.c_str(); @@ -194,20 +199,20 @@ SunSensor InitSunSensor(ClockGenerator* clock_generator, PowerPort* power_port, int prescaler = ss_conf.ReadInt(Section, "prescaler"); if (prescaler <= 1) prescaler = 1; - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; ss_conf.ReadQuaternion(Section, "quaternion_b2c", quaternion_b2c); double detectable_angle_deg = 0.0, detectable_angle_rad = 0.0; detectable_angle_deg = ss_conf.ReadDouble(Section, "field_of_view_deg"); - detectable_angle_rad = libra::pi / 180.0 * detectable_angle_deg; + detectable_angle_rad = math::pi / 180.0 * detectable_angle_deg; double nr_stddev = 0.0; nr_stddev = ss_conf.ReadDouble(Section, "white_noise_standard_deviation_deg"); - nr_stddev *= libra::pi / 180.0; + nr_stddev *= math::pi / 180.0; double nr_bias_stddev = 0.0; nr_bias_stddev = ss_conf.ReadDouble(Section, "bias_standard_deviation_deg"); - nr_bias_stddev *= libra::pi / 180.0; + nr_bias_stddev *= math::pi / 180.0; double intensity_lower_threshold_percent; intensity_lower_threshold_percent = ss_conf.ReadDouble(Section, "intensity_lower_threshold_percent"); @@ -218,3 +223,5 @@ SunSensor InitSunSensor(ClockGenerator* clock_generator, PowerPort* power_port, intensity_lower_threshold_percent, srp_environment, local_celestial_information); return ss; } + +} // namespace s2e::components diff --git a/src/components/real/aocs/sun_sensor.hpp b/src/components/real/aocs/sun_sensor.hpp index f1c59a670..33dd9c5fd 100644 --- a/src/components/real/aocs/sun_sensor.hpp +++ b/src/components/real/aocs/sun_sensor.hpp @@ -8,18 +8,20 @@ #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "../../base/component.hpp" +namespace s2e::components { + /* * @class SunSensor * @brief Class to emulate sun sensor */ -class SunSensor : public Component, public ILoggable { +class SunSensor : public Component, public logger::ILoggable { public: /** * @fn SunSensor @@ -35,10 +37,10 @@ class SunSensor : public Component, public ILoggable { * @param [in] srp_environment: Solar Radiation Pressure environment * @param [in] local_celestial_information: Local celestial information */ - SunSensor(const int prescaler, ClockGenerator* clock_generator, const int component_id, const libra::Quaternion& quaternion_b2c, + SunSensor(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, const math::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, const double bias_noise_standard_deviation_rad, - const double intensity_lower_threshold_percent, const SolarRadiationPressureEnvironment* srp_environment, - const LocalCelestialInformation* local_celestial_information); + const double intensity_lower_threshold_percent, const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information); /** * @fn SunSensor * @brief Constructor with power port @@ -54,10 +56,11 @@ class SunSensor : public Component, public ILoggable { * @param [in] srp_environment: Solar Radiation Pressure environment * @param [in] local_celestial_information: Local celestial information */ - SunSensor(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, + SunSensor(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Quaternion& quaternion_b2c, const double detectable_angle_rad, const double random_noise_standard_deviation_rad, const double bias_noise_standard_deviation_rad, const double intensity_lower_threshold_percent, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information); + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information); // Override functions for Component /** @@ -66,33 +69,33 @@ class SunSensor : public Component, public ILoggable { */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; // Getter inline bool GetSunDetectedFlag() const { return sun_detected_flag_; }; - inline const libra::Vector<3> GetMeasuredSunDirection_c() const { return measured_sun_direction_c_; }; - inline const libra::Vector<3> GetMeasuredSunDirection_b() const { return quaternion_b2c_.Conjugate().FrameConversion(measured_sun_direction_c_); }; + inline const math::Vector<3> GetMeasuredSunDirection_c() const { return measured_sun_direction_c_; }; + inline const math::Vector<3> GetMeasuredSunDirection_b() const { return quaternion_b2c_.Conjugate().FrameConversion(measured_sun_direction_c_); }; inline double GetSunAngleAlpha_rad() const { return alpha_rad_; }; inline double GetSunAngleBeta_rad() const { return beta_rad_; }; inline double GetSolarIlluminance_W_m2() const { return solar_illuminance_W_m2_; }; protected: const int component_id_; //!< Sensor ID - libra::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame (Z-axis of the component is sight direction) + math::Quaternion quaternion_b2c_; //!< Quaternion from body frame to component frame (Z-axis of the component is sight direction) double intensity_lower_threshold_percent_; //!< If the light intensity becomes smaller than this, it becomes impossible to get the sun direction - libra::Vector<3> sun_direction_true_c_{0.0}; //!< True value of sun vector in the component frame - libra::Vector<3> measured_sun_direction_c_{0.0}; //!< Measured sun vector in the component frame + math::Vector<3> sun_direction_true_c_{0.0}; //!< True value of sun vector in the component frame + math::Vector<3> measured_sun_direction_c_{0.0}; //!< Measured sun vector in the component frame double alpha_rad_ = 0.0; //!< Angle between Z-axis and the sun direction projected on XZ plane [rad] double beta_rad_ = 0.0; //!< Angle between Z-axis and the sun direction projected on YZ plane [rad] @@ -100,14 +103,14 @@ class SunSensor : public Component, public ILoggable { double detectable_angle_rad_; //!< half angle (>0) [rad] bool sun_detected_flag_ = false; //!< Sun detected flag // Noise parameters - libra::NormalRand random_noise_alpha_; //!< Normal random for alpha angle - libra::NormalRand random_noise_beta_; //!< Normal random for beta angle - double bias_noise_alpha_rad_ = 0.0; //!< Constant bias for alpha angle (Value is calculated by random number generator) - double bias_noise_beta_rad_ = 0.0; //!< Constant bias for beta angle (Value is calculated by random number generator) + randomization::NormalRand random_noise_alpha_; //!< Normal random for alpha angle + randomization::NormalRand random_noise_beta_; //!< Normal random for beta angle + double bias_noise_alpha_rad_ = 0.0; //!< Constant bias for alpha angle (Value is calculated by random number generator) + double bias_noise_beta_rad_ = 0.0; //!< Constant bias for beta angle (Value is calculated by random number generator) // Measured variables - const SolarRadiationPressureEnvironment* srp_environment_; //!< Solar Radiation Pressure environment - const LocalCelestialInformation* local_celestial_information_; //!< Local celestial information + const environment::SolarRadiationPressureEnvironment* srp_environment_; //!< Solar Radiation Pressure environment + const environment::LocalCelestialInformation* local_celestial_information_; //!< Local celestial information // functions /** @@ -150,8 +153,9 @@ class SunSensor : public Component, public ILoggable { * @param [in] srp_environment: Solar radiation pressure environment * @param [in] local_environment: Local environment information */ -SunSensor InitSunSensor(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information); +SunSensor InitSunSensor(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information); /** * @fn InitSunSensor * @brief Initialize functions for sun sensor with power port @@ -162,7 +166,10 @@ SunSensor InitSunSensor(ClockGenerator* clock_generator, int sensor_id, const st * @param [in] srp_environment: Solar radiation pressure environment * @param [in] local_environment: Local environment information */ -SunSensor InitSunSensor(ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information); +SunSensor InitSunSensor(environment::ClockGenerator* clock_generator, PowerPort* power_port, int sensor_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_AOCS_SUN_SENSOR_HPP_ diff --git a/src/components/real/cdh/c2a_communication.hpp b/src/components/real/cdh/c2a_communication.hpp new file mode 100644 index 000000000..ea7afef13 --- /dev/null +++ b/src/components/real/cdh/c2a_communication.hpp @@ -0,0 +1,30 @@ +/* + * @file c2a_communication.h + * @brief C2A communication functions + */ + +#ifndef C2A_COMMUNICATION_H_ +#define C2A_COMMUNICATION_H_ + +namespace s2e::components { + +// If the character encoding of C2A is UTF-8, the following functions are not necessary, +// and users can directory use SendFromObc_C2A and ReceivedByObc_C2A UART +// TODO: Delete these functions since C2A is changed to use UTF-8 + +// C2A communication functions +int OBC_C2A_SendFromObc(int port_id, unsigned char* buffer, int offset, int length); +int OBC_C2A_ReceivedByObc(int port_id, unsigned char* buffer, int offset, int length); + +// I2C +int OBC_C2A_I2cWriteCommand(int port_id, const unsigned char i2c_address, const unsigned char* data, const unsigned char length); +int OBC_C2A_I2cWriteRegister(int port_id, const unsigned char i2c_address, const unsigned char* data, const unsigned char length); +int OBC_C2A_I2cReadRegister(int port_id, const unsigned char i2c_address, unsigned char* data, const unsigned char length); + +// GPIO +int OBC_C2A_GpioWrite(int port_id, const bool is_high); +bool OBC_C2A_GpioRead(int port_id); // return false when the port_id is not used + +} // namespace s2e::components + +#endif // C2A_COMMUNICATION_H_ diff --git a/src/components/real/cdh/on_board_computer.cpp b/src/components/real/cdh/on_board_computer.cpp index ad23fadf4..c661fc6d6 100644 --- a/src/components/real/cdh/on_board_computer.cpp +++ b/src/components/real/cdh/on_board_computer.cpp @@ -4,14 +4,16 @@ */ #include "on_board_computer.hpp" -OnBoardComputer::OnBoardComputer(ClockGenerator* clock_generator) : Component(1, clock_generator) { Initialize(); } +namespace s2e::components { -OnBoardComputer::OnBoardComputer(int prescaler, ClockGenerator* clock_generator, PowerPort* power_port) +OnBoardComputer::OnBoardComputer(environment::ClockGenerator* clock_generator) : Component(1, clock_generator) { Initialize(); } + +OnBoardComputer::OnBoardComputer(int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port) : Component(prescaler, clock_generator, power_port) { Initialize(); } -OnBoardComputer::OnBoardComputer(int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const double minimum_voltage_V, +OnBoardComputer::OnBoardComputer(int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const double minimum_voltage_V, const double assumed_power_consumption_W) : Component(prescaler, clock_generator, power_port) { power_port_->SetMinimumVoltage_V(minimum_voltage_V); @@ -132,3 +134,5 @@ bool OnBoardComputer::GpioComponentRead(int port_id) { if (port == nullptr) return false; return port->DigitalRead(); } + +} // namespace s2e::components diff --git a/src/components/real/cdh/on_board_computer.hpp b/src/components/real/cdh/on_board_computer.hpp index 641f1566c..123066539 100644 --- a/src/components/real/cdh/on_board_computer.hpp +++ b/src/components/real/cdh/on_board_computer.hpp @@ -13,6 +13,8 @@ #include "../../base/component.hpp" +namespace s2e::components { + /* * @class OnBoardComputer * @brief Class to emulate on board computer @@ -25,7 +27,7 @@ class OnBoardComputer : public Component { * @brief Constructor * @param [in] clock_generator: Clock generator */ - OnBoardComputer(ClockGenerator* clock_generator); + OnBoardComputer(environment::ClockGenerator* clock_generator); /** * @fn OnBoardComputer * @brief Constructor @@ -33,7 +35,7 @@ class OnBoardComputer : public Component { * @param [in] clock_generator: Clock generator * @param [in] power_port: Power port */ - OnBoardComputer(int prescaler, ClockGenerator* clock_generator, PowerPort* power_port); + OnBoardComputer(int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port); /** * @fn OnBoardComputer * @brief Constructor @@ -43,7 +45,7 @@ class OnBoardComputer : public Component { * @param [in] minimum_voltage_V: Minimum voltage [V] * @param [in] assumed_power_consumption_W: Assumed power consumption [W] */ - OnBoardComputer(int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const double minimum_voltage_V, + OnBoardComputer(int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const double minimum_voltage_V, const double assumed_power_consumption_W); /** * @fn ~OnBoardComputer @@ -207,4 +209,6 @@ class OnBoardComputer : public Component { std::map gpio_ports_; //!< GPIO ports }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_CDH_OBC_HPP_ diff --git a/src/components/real/cdh/on_board_computer_with_c2a.cpp b/src/components/real/cdh/on_board_computer_with_c2a.cpp index 8deb53bec..639e87f5e 100644 --- a/src/components/real/cdh/on_board_computer_with_c2a.cpp +++ b/src/components/real/cdh/on_board_computer_with_c2a.cpp @@ -26,20 +26,22 @@ #endif // c2a-core version header #endif // USE_C2A +namespace s2e::components { + std::map ObcWithC2a::com_ports_c2a_; std::map ObcWithC2a::i2c_com_ports_c2a_; std::map ObcWithC2a::gpio_ports_c2a_; -ObcWithC2a::ObcWithC2a(ClockGenerator* clock_generator) : OnBoardComputer(clock_generator), timing_regulator_(1) { +ObcWithC2a::ObcWithC2a(environment::ClockGenerator* clock_generator) : OnBoardComputer(clock_generator), timing_regulator_(1) { // Initialize(); } -ObcWithC2a::ObcWithC2a(ClockGenerator* clock_generator, int timing_regulator) +ObcWithC2a::ObcWithC2a(environment::ClockGenerator* clock_generator, int timing_regulator) : OnBoardComputer(clock_generator), timing_regulator_(timing_regulator) { // Initialize(); } -ObcWithC2a::ObcWithC2a(int prescaler, ClockGenerator* clock_generator, int timing_regulator, PowerPort* power_port) +ObcWithC2a::ObcWithC2a(int prescaler, environment::ClockGenerator* clock_generator, int timing_regulator, PowerPort* power_port) : OnBoardComputer(prescaler, clock_generator, power_port), timing_regulator_(timing_regulator) { // Initialize(); } @@ -255,4 +257,6 @@ bool ObcWithC2a::GpioRead_C2A(int port_id) { int OBC_C2A_GpioWrite(int port_id, const bool is_high) { return ObcWithC2a::GpioWrite_C2A(port_id, is_high); } -bool OBC_C2A_GpioRead(int port_id) { return ObcWithC2a::GpioRead_C2A(port_id); } \ No newline at end of file +bool OBC_C2A_GpioRead(int port_id) { return ObcWithC2a::GpioRead_C2A(port_id); } + +} // namespace s2e::components diff --git a/src/components/real/cdh/on_board_computer_with_c2a.hpp b/src/components/real/cdh/on_board_computer_with_c2a.hpp index 5d6d4fcb4..4b3c043aa 100644 --- a/src/components/real/cdh/on_board_computer_with_c2a.hpp +++ b/src/components/real/cdh/on_board_computer_with_c2a.hpp @@ -8,8 +8,11 @@ #include +#include "c2a_communication.hpp" #include "on_board_computer.hpp" +namespace s2e::components { + /* * @class ObcWithC2a * @brief Class to emulate on board computer with C2A flight software @@ -21,14 +24,14 @@ class ObcWithC2a : public OnBoardComputer { * @brief Constructor * @param [in] clock_generator: Clock generator */ - ObcWithC2a(ClockGenerator* clock_generator); + ObcWithC2a(environment::ClockGenerator* clock_generator); /** * @fn ObcWithC2a * @brief Constructor * @param [in] clock_generator: Clock generator * @param [in] timing_regulator: Timing regulator to update flight software faster than the component update */ - ObcWithC2a(ClockGenerator* clock_generator, int timing_regulator); + ObcWithC2a(environment::ClockGenerator* clock_generator, int timing_regulator); /** * @fn ObcWithC2a * @brief Constructor @@ -37,7 +40,7 @@ class ObcWithC2a : public OnBoardComputer { * @param [in] timing_regulator: Timing regulator to update flight software faster than the component update * @param [in] power_port: Power port */ - ObcWithC2a(int prescaler, ClockGenerator* clock_generator, int timing_regulator, PowerPort* power_port); + ObcWithC2a(int prescaler, environment::ClockGenerator* clock_generator, int timing_regulator, PowerPort* power_port); /** * @fn ~ObcWithC2a * @brief Destructor @@ -270,21 +273,6 @@ class ObcWithC2a : public OnBoardComputer { static std::map gpio_ports_c2a_; //!< GPIO ports }; -// If the character encoding of C2A is UTF-8, the following functions are not necessary, -// and users can directory use SendFromObc_C2A and ReceivedByObc_C2A UART -// TODO: Delete these functions since C2A is changed to use UTF-8 - -// C2A communication functions -int OBC_C2A_SendFromObc(int port_id, unsigned char* buffer, int offset, int length); -int OBC_C2A_ReceivedByObc(int port_id, unsigned char* buffer, int offset, int length); - -// I2C -int OBC_C2A_I2cWriteCommand(int port_id, const unsigned char i2c_address, const unsigned char* data, const unsigned char length); -int OBC_C2A_I2cWriteRegister(int port_id, const unsigned char i2c_address, const unsigned char* data, const unsigned char length); -int OBC_C2A_I2cReadRegister(int port_id, const unsigned char i2c_address, unsigned char* data, const unsigned char length); - -// GPIO -int OBC_C2A_GpioWrite(int port_id, const bool is_high); -bool OBC_C2A_GpioRead(int port_id); // return false when the port_id is not used +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_CDH_OBC_C2A_HPP_ diff --git a/src/components/real/communication/antenna.cpp b/src/components/real/communication/antenna.cpp index 3941e1690..9d9fec92d 100644 --- a/src/components/real/communication/antenna.cpp +++ b/src/components/real/communication/antenna.cpp @@ -8,11 +8,13 @@ #include #include -#include -#include +#include +#include -Antenna::Antenna(const int component_id, const libra::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, - const double frequency_MHz, const Vector<5> tx_parameters, const Vector<4> rx_parameters) +namespace s2e::components { + +Antenna::Antenna(const int component_id, const math::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, + const double frequency_MHz, const math::Vector<5> tx_parameters, const math::Vector<4> rx_parameters) : component_id_(component_id), is_transmitter_(is_transmitter), is_receiver_(is_receiver), frequency_MHz_(frequency_MHz) { quaternion_b2c_ = quaternion_b2c; @@ -45,7 +47,7 @@ Antenna::Antenna(const int component_id, const libra::Quaternion& quaternion_b2c } } -Antenna::Antenna(const int component_id, const libra::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, +Antenna::Antenna(const int component_id, const math::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, const double frequency_MHz, const double tx_bitrate_bps, const double tx_output_power_W, const AntennaParameters tx_parameters, const double rx_system_noise_temperature_K, const AntennaParameters rx_parameters) : component_id_(component_id), @@ -106,11 +108,11 @@ AntennaGainModel SetAntennaGainModel(const std::string gain_model_name) { } Antenna InitAntenna(const int antenna_id, const std::string file_name) { - IniAccess antenna_conf(file_name); + setting_file_reader::IniAccess antenna_conf(file_name); const std::string section_name = "ANTENNA_" + std::to_string(static_cast(antenna_id)); - Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; antenna_conf.ReadQuaternion(section_name.c_str(), "quaternion_b2c", quaternion_b2c); bool is_transmitter = antenna_conf.ReadBoolean(section_name.c_str(), "is_transmitter"); @@ -164,3 +166,5 @@ Antenna InitAntenna(const int antenna_id, const std::string file_name) { rx_system_noise_temperature_K, rx_parameters); return antenna; } + +} // namespace s2e::components diff --git a/src/components/real/communication/antenna.hpp b/src/components/real/communication/antenna.hpp index 1d487493a..1d317140e 100644 --- a/src/components/real/communication/antenna.hpp +++ b/src/components/real/communication/antenna.hpp @@ -6,14 +6,14 @@ #ifndef S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_HPP_ #define S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_HPP_ -#include -#include -using libra::Quaternion; -using libra::Vector; +#include +#include #include #include "./antenna_radiation_pattern.hpp" +namespace s2e::components { + /* * @enum AntennaGainModel * @brief Antenna gain model definition @@ -54,8 +54,8 @@ class Antenna { * @param [in] tx_parameters: output, gain, loss_feeder, loss_pointing for TX * @param [in] rx_parameters: gain, loss_feeder, loss_pointing, system_temperature for RX */ - Antenna(const int component_id, const libra::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, - const double frequency_MHz, const Vector<5> tx_parameters, const Vector<4> rx_parameters); + Antenna(const int component_id, const math::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, + const double frequency_MHz, const math::Vector<5> tx_parameters, const math::Vector<4> rx_parameters); /** * @fn Antenna @@ -71,7 +71,7 @@ class Antenna { * @param [in] rx_system_noise_temperature_K: Receive system noise temperature [K] * @param [in] rx_parameters: RX antenna parameters */ - Antenna(const int component_id, const libra::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, + Antenna(const int component_id, const math::Quaternion& quaternion_b2c, const bool is_transmitter, const bool is_receiver, const double frequency_MHz, const double tx_bitrate_bps, const double tx_output_power_W, const AntennaParameters tx_parameters, const double rx_system_noise_temperature_K, const AntennaParameters rx_parameters); /** @@ -113,7 +113,7 @@ class Antenna { * @fn GetQuaternion_b2c * @brief Return quaternion from body to component */ - inline Quaternion GetQuaternion_b2c() const { return quaternion_b2c_; } + inline math::Quaternion GetQuaternion_b2c() const { return quaternion_b2c_; } /** * @fn IsTransmitter @@ -128,11 +128,11 @@ class Antenna { protected: // General info - int component_id_; //!< Antenna ID - Quaternion quaternion_b2c_; //!< Coordinate transform from body to component - bool is_transmitter_; //!< Antenna for transmitter or not - bool is_receiver_; //!< Antenna for receiver or not - double frequency_MHz_; //!< Center Frequency [MHz] + int component_id_; //!< Antenna ID + math::Quaternion quaternion_b2c_; //!< Coordinate transform from body to component + bool is_transmitter_; //!< Antenna for transmitter or not + bool is_receiver_; //!< Antenna for receiver or not + double frequency_MHz_; //!< Center Frequency [MHz] // Tx info double tx_bitrate_bps_; //!< Transmit bitrate [bps] @@ -166,4 +166,6 @@ AntennaGainModel SetAntennaGainModel(const std::string gain_model_name); */ Antenna InitAntenna(const int antenna_id, const std::string file_name); +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_HPP_ diff --git a/src/components/real/communication/antenna_radiation_pattern.cpp b/src/components/real/communication/antenna_radiation_pattern.cpp index e1812fe0f..b1a3bced7 100644 --- a/src/components/real/communication/antenna_radiation_pattern.cpp +++ b/src/components/real/communication/antenna_radiation_pattern.cpp @@ -6,15 +6,17 @@ #include "antenna_radiation_pattern.hpp" #include -#include -#include +#include +#include + +namespace s2e::components { AntennaRadiationPattern::AntennaRadiationPattern() { gain_dBi_.assign(length_theta_, std::vector(length_phi_, 0.0)); } AntennaRadiationPattern::AntennaRadiationPattern(const std::string file_path, const size_t length_theta, const size_t length_phi, const double theta_max_rad, const double phi_max_rad) : length_theta_(length_theta), length_phi_(length_phi), theta_max_rad_(theta_max_rad), phi_max_rad_(phi_max_rad) { - IniAccess gain_file(file_path); + setting_file_reader::IniAccess gain_file(file_path); gain_file.ReadCsvDouble(gain_dBi_, (std::max)(length_theta_, length_phi_)); } @@ -37,3 +39,5 @@ double AntennaRadiationPattern::GetGain_dBi(const double theta_rad, const double return gain_dBi_[theta_idx][phi_idx]; } + +} // namespace s2e::components diff --git a/src/components/real/communication/antenna_radiation_pattern.hpp b/src/components/real/communication/antenna_radiation_pattern.hpp index 35490c6b1..a6efac136 100644 --- a/src/components/real/communication/antenna_radiation_pattern.hpp +++ b/src/components/real/communication/antenna_radiation_pattern.hpp @@ -6,10 +6,12 @@ #ifndef S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_RADIATION_PATTERN_HPP_ #define S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_RADIATION_PATTERN_HPP_ -#include +#include #include #include +namespace s2e::components { + /* * @class AntennaRadiationPattern * @brief Antenna radiation pattern @@ -36,7 +38,7 @@ class AntennaRadiationPattern { * @param[in] phi_max_rad_: Maximum value of phi */ AntennaRadiationPattern(const std::string file_path, const size_t length_theta = 360, const size_t length_phi = 181, - const double theta_max_rad = libra::tau, const double phi_max_rad = libra::pi); + const double theta_max_rad = math::tau, const double phi_max_rad = math::pi); /** * @fn ~AntennaRadiationPattern @@ -54,12 +56,14 @@ class AntennaRadiationPattern { double GetGain_dBi(const double theta_rad, const double phi_rad) const; private: - size_t length_theta_ = 360; //!< Length of grid for theta direction - size_t length_phi_ = 181; //!< Length of grid for phi direction - double theta_max_rad_ = libra::tau; //!< Maximum value of theta - double phi_max_rad_ = libra::pi; //!< Maximum value of phi + size_t length_theta_ = 360; //!< Length of grid for theta direction + size_t length_phi_ = 181; //!< Length of grid for phi direction + double theta_max_rad_ = math::tau; //!< Maximum value of theta + double phi_max_rad_ = math::pi; //!< Maximum value of phi std::vector> gain_dBi_; //!< Antenna gain table [dBi] }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_COMMUNICATION_ANTENNA_RADIATION_PATTERN_HPP_ diff --git a/src/components/real/communication/ground_station_calculator.cpp b/src/components/real/communication/ground_station_calculator.cpp index 87a550529..bec0c2fd7 100644 --- a/src/components/real/communication/ground_station_calculator.cpp +++ b/src/components/real/communication/ground_station_calculator.cpp @@ -6,8 +6,10 @@ #include "ground_station_calculator.hpp" #include -#include -#include +#include +#include + +namespace s2e::components { GroundStationCalculator::GroundStationCalculator(const double loss_polarization_dB, const double loss_atmosphere_dB, const double loss_rainfall_dB, const double loss_others_dB, const double ebn0_dB, const double hardware_deterioration_dB, @@ -27,8 +29,8 @@ GroundStationCalculator::GroundStationCalculator(const double loss_polarization_ GroundStationCalculator::~GroundStationCalculator() {} -void GroundStationCalculator::Update(const Spacecraft& spacecraft, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, - const Antenna& ground_station_rx_antenna) { +void GroundStationCalculator::Update(const spacecraft::Spacecraft& spacecraft, const Antenna& spacecraft_tx_antenna, + const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna) { bool is_visible = ground_station.IsVisible(spacecraft.GetSpacecraftId()); if (is_visible) { max_bitrate_Mbps_ = CalcMaxBitrate(spacecraft.GetDynamics(), spacecraft_tx_antenna, ground_station, ground_station_rx_antenna); @@ -40,8 +42,8 @@ void GroundStationCalculator::Update(const Spacecraft& spacecraft, const Antenna } // Private functions -double GroundStationCalculator::CalcMaxBitrate(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, - const Antenna& ground_station_rx_antenna) { +double GroundStationCalculator::CalcMaxBitrate(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, + const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna) { double cn0_dBHz = CalcCn0OnGs(dynamics, spacecraft_tx_antenna, ground_station, ground_station_rx_antenna); double margin_for_bitrate_dB = cn0_dBHz - (ebn0_dB_ + hardware_deterioration_dB_ + coding_gain_dB_) - margin_requirement_dB_; @@ -53,40 +55,40 @@ double GroundStationCalculator::CalcMaxBitrate(const Dynamics& dynamics, const A } } -double GroundStationCalculator::CalcReceiveMarginOnGs(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, - const GroundStation& ground_station, const Antenna& ground_station_rx_antenna) { +double GroundStationCalculator::CalcReceiveMarginOnGs(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, + const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna) { double cn0_dB = CalcCn0OnGs(dynamics, spacecraft_tx_antenna, ground_station, ground_station_rx_antenna); double cn0_requirement_dB = ebn0_dB_ + hardware_deterioration_dB_ + coding_gain_dB_ + 10.0 * log10(spacecraft_tx_antenna.GetBitrate_bps()); return cn0_dB - cn0_requirement_dB; } -double GroundStationCalculator::CalcCn0OnGs(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, - const Antenna& ground_station_rx_antenna) { +double GroundStationCalculator::CalcCn0OnGs(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, + const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna) { if (!spacecraft_tx_antenna.IsTransmitter() || !ground_station_rx_antenna.IsReceiver()) { // Check compatibility of transmitter and receiver return 0.0f; } // Free space path loss - Vector<3> sc_pos_i = dynamics.GetOrbit().GetPosition_i_m(); - Vector<3> gs_pos_i = ground_station.GetPosition_i_m(); - Vector<3> pos_gs2sc_i = sc_pos_i - gs_pos_i; + math::Vector<3> sc_pos_i = dynamics.GetOrbit().GetPosition_i_m(); + math::Vector<3> gs_pos_i = ground_station.GetPosition_i_m(); + math::Vector<3> pos_gs2sc_i = sc_pos_i - gs_pos_i; double dist_sc_gs_km = pos_gs2sc_i.CalcNorm() / 1000.0; - double loss_space_dB = -20.0 * log10(4.0 * libra::pi * dist_sc_gs_km / (300.0 / spacecraft_tx_antenna.GetFrequency_MHz() / 1000.0)); + double loss_space_dB = -20.0 * log10(4.0 * math::pi * dist_sc_gs_km / (300.0 / spacecraft_tx_antenna.GetFrequency_MHz() / 1000.0)); // GS direction on SC TX antenna frame - Vector<3> sc_to_gs_i = gs_pos_i - sc_pos_i; + math::Vector<3> sc_to_gs_i = gs_pos_i - sc_pos_i; sc_to_gs_i = sc_to_gs_i.CalcNormalizedVector(); - Quaternion q_i_to_sc_ant = spacecraft_tx_antenna.GetQuaternion_b2c() * dynamics.GetAttitude().GetQuaternion_i2b(); - Vector<3> gs_direction_on_sc_frame = q_i_to_sc_ant.FrameConversion(sc_to_gs_i); + math::Quaternion q_i_to_sc_ant = spacecraft_tx_antenna.GetQuaternion_b2c() * dynamics.GetAttitude().GetQuaternion_i2b(); + math::Vector<3> gs_direction_on_sc_frame = q_i_to_sc_ant.FrameConversion(sc_to_gs_i); double theta_on_sc_antenna_rad = acos(gs_direction_on_sc_frame[2]); double phi_on_sc_antenna_rad = atan2(gs_direction_on_sc_frame[1], gs_direction_on_sc_frame[0]); // SC direction on GS RX antenna frame - Vector<3> gs_to_sc_ecef = dynamics.GetOrbit().GetPosition_ecef_m() - ground_station.GetPosition_ecef_m(); + math::Vector<3> gs_to_sc_ecef = dynamics.GetOrbit().GetPosition_ecef_m() - ground_station.GetPosition_ecef_m(); gs_to_sc_ecef = gs_to_sc_ecef.CalcNormalizedVector(); - Quaternion q_ecef_to_gs_ant = ground_station_rx_antenna.GetQuaternion_b2c() * ground_station.GetGeodeticPosition().GetQuaternionXcxfToLtc(); - Vector<3> sc_direction_on_gs_frame = q_ecef_to_gs_ant.FrameConversion(gs_to_sc_ecef); + math::Quaternion q_ecef_to_gs_ant = ground_station_rx_antenna.GetQuaternion_b2c() * ground_station.GetGeodeticPosition().GetQuaternionXcxfToLtc(); + math::Vector<3> sc_direction_on_gs_frame = q_ecef_to_gs_ant.FrameConversion(gs_to_sc_ecef); double theta_on_gs_antenna_rad = acos(sc_direction_on_gs_frame[2]); double phi_on_gs_antenna_rad = atan2(sc_direction_on_gs_frame[1], sc_direction_on_gs_frame[0]); @@ -102,8 +104,8 @@ std::string GroundStationCalculator::GetLogHeader() const { std::string str_tmp = ""; std::string component_name = "gs_calculator_"; - str_tmp += WriteScalar(component_name + "max_bitrate", "Mbps"); - str_tmp += WriteScalar(component_name + "receive_margin", "dB"); + str_tmp += logger::WriteScalar(component_name + "max_bitrate", "Mbps"); + str_tmp += logger::WriteScalar(component_name + "receive_margin", "dB"); return str_tmp; } @@ -111,14 +113,14 @@ std::string GroundStationCalculator::GetLogHeader() const { std::string GroundStationCalculator::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(max_bitrate_Mbps_); - str_tmp += WriteScalar(receive_margin_dB_); + str_tmp += logger::WriteScalar(max_bitrate_Mbps_); + str_tmp += logger::WriteScalar(receive_margin_dB_); return str_tmp; } GroundStationCalculator InitGsCalculator(const std::string file_name) { - IniAccess gs_conf(file_name); + setting_file_reader::IniAccess gs_conf(file_name); char Section[30] = "GROUND_STATION_CALCULATOR"; @@ -136,3 +138,5 @@ GroundStationCalculator InitGsCalculator(const std::string file_name) { hardware_deterioration_dB, coding_gain_dB, margin_requirement_dB, downlink_bitrate_bps); return gs_calculator; } + +} // namespace s2e::components diff --git a/src/components/real/communication/ground_station_calculator.hpp b/src/components/real/communication/ground_station_calculator.hpp index 196822295..f0192f2b1 100644 --- a/src/components/real/communication/ground_station_calculator.hpp +++ b/src/components/real/communication/ground_station_calculator.hpp @@ -10,14 +10,16 @@ #include #include #include -#include +#include #include +namespace s2e::components { + /* * @class GroundStationCalculator * @brief Emulation of analysis and calculation for Ground Stations */ -class GroundStationCalculator : public ILoggable { +class GroundStationCalculator : public logger::ILoggable { public: /** * @fn GroundStationCalculator @@ -49,18 +51,18 @@ class GroundStationCalculator : public ILoggable { * @param [in] ground_station: Ground station information * @param [in] ground_station_rx_antenna: Antenna mounted on ground station */ - void Update(const Spacecraft& spacecraft, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, + void Update(const spacecraft::Spacecraft& spacecraft, const Antenna& spacecraft_tx_antenna, const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna); - // Override ILoggable TODO: Maybe we don't need logabble, and this class should be used as library. + // Override logger::ILoggable TODO: Maybe we don't need logabble, and this class should be used as library. /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -109,7 +111,7 @@ class GroundStationCalculator : public ILoggable { * @param [in] ground_station_rx_antenna: Rx Antenna mounted on ground station * @return Max bitrate [Mbps] */ - double CalcMaxBitrate(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, + double CalcMaxBitrate(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna); /** * @fn CalcReceiveMarginOnGs @@ -120,8 +122,8 @@ class GroundStationCalculator : public ILoggable { * @param [in] ground_station_rx_antenna: Rx Antenna mounted on ground station * @return Receive margin [dB] */ - double CalcReceiveMarginOnGs(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, - const Antenna& ground_station_rx_antenna); + double CalcReceiveMarginOnGs(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, + const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna); /** * @fn CalcCn0 @@ -132,7 +134,7 @@ class GroundStationCalculator : public ILoggable { * @param [in] ground_station_rx_antenna: Rx Antenna mounted on ground station * @return CN0 [dB] */ - double CalcCn0OnGs(const Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const GroundStation& ground_station, + double CalcCn0OnGs(const dynamics::Dynamics& dynamics, const Antenna& spacecraft_tx_antenna, const ground_station::GroundStation& ground_station, const Antenna& ground_station_rx_antenna); }; @@ -144,4 +146,6 @@ class GroundStationCalculator : public ILoggable { GroundStationCalculator InitGsCalculator(const std::string file_name); +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_COMMUNICATION_GROUND_STATION_CALCULATOR_HPP_ diff --git a/src/components/real/communication/wings_command_sender_to_c2a.cpp b/src/components/real/communication/wings_command_sender_to_c2a.cpp index 2bb94ec0f..ec6c25da0 100644 --- a/src/components/real/communication/wings_command_sender_to_c2a.cpp +++ b/src/components/real/communication/wings_command_sender_to_c2a.cpp @@ -7,9 +7,9 @@ #include "wings_command_sender_to_c2a.hpp" -#include -#include #include +#include +#include #ifdef USE_C2A #include "src_core/c2a_core_main.h" @@ -26,6 +26,8 @@ #endif // c2a-core version header #endif // USE_C2A +namespace s2e::components { + void WingsCommandSenderToC2a::MainRoutine(const int time_count) { UNUSED(time_count); if (is_enabled_ == false) return; @@ -131,9 +133,9 @@ void WingsCommandSenderToC2a::AnalyzeC2aCommand(const std::vector t #endif } -WingsCommandSenderToC2a InitWingsCommandSenderToC2a(ClockGenerator* clock_generator, const double compo_update_step_s, +WingsCommandSenderToC2a InitWingsCommandSenderToC2a(environment::ClockGenerator* clock_generator, const double compo_update_step_s, const std::string initialize_file) { - IniAccess ini_access(initialize_file); + setting_file_reader::IniAccess ini_access(initialize_file); std::string section = "WINGS_COMMAND_SENDER_TO_C2A"; bool is_enabled = ini_access.ReadEnable(section.c_str(), "command_send_enable"); @@ -148,3 +150,5 @@ WingsCommandSenderToC2a InitWingsCommandSenderToC2a(ClockGenerator* clock_genera return WingsCommandSenderToC2a(prescaler, clock_generator, step_width_s, c2a_command_data_base_file, wings_operation_file, is_enabled); } + +} // namespace s2e::components diff --git a/src/components/real/communication/wings_command_sender_to_c2a.hpp b/src/components/real/communication/wings_command_sender_to_c2a.hpp index d70964826..167563cf9 100644 --- a/src/components/real/communication/wings_command_sender_to_c2a.hpp +++ b/src/components/real/communication/wings_command_sender_to_c2a.hpp @@ -6,11 +6,13 @@ #ifndef S2E_COMPONENTS_REAL_COMMUNICATION_C2A_COMMAND_SENDER_HPP_ #define S2E_COMPONENTS_REAL_COMMUNICATION_C2A_COMMAND_SENDER_HPP_ -#include -#include +#include +#include #include "../../base/component.hpp" +namespace s2e::components { + /* * @class C2aCommandSender * @brief A component to send C2A command using WINGS operation file @@ -22,8 +24,8 @@ class WingsCommandSenderToC2a : public Component { * @brief Constructor * @param [in] */ - WingsCommandSenderToC2a(int prescaler, ClockGenerator* clock_generator, const double step_width_s, const std::string command_database_file, - const std::string operation_file, const bool is_enabled) + WingsCommandSenderToC2a(int prescaler, environment::ClockGenerator* clock_generator, const double step_width_s, + const std::string command_database_file, const std::string operation_file, const bool is_enabled) : Component(prescaler, clock_generator), c2a_command_database_(command_database_file), wings_operation_file_(operation_file), @@ -73,7 +75,9 @@ class WingsCommandSenderToC2a : public Component { * @param[in] compo_update_step_s: Component update step time [s] * @param[in] initialize_file: Initialize file name */ -WingsCommandSenderToC2a InitWingsCommandSenderToC2a(ClockGenerator* clock_generator, const double compo_update_step_s, +WingsCommandSenderToC2a InitWingsCommandSenderToC2a(environment::ClockGenerator* clock_generator, const double compo_update_step_s, const std::string initialize_file); +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_COMMUNICATION_C2A_COMMAND_SENDER_HPP_ diff --git a/src/components/real/mission/telescope.cpp b/src/components/real/mission/telescope.cpp index 21a8efb71..cf17359e4 100644 --- a/src/components/real/mission/telescope.cpp +++ b/src/components/real/mission/telescope.cpp @@ -7,17 +7,16 @@ #include #include -#include -#include +#include +#include -using namespace std; -using namespace libra; +namespace s2e::components { -Telescope::Telescope(ClockGenerator* clock_generator, const libra::Quaternion& quaternion_b2c, const double sun_forbidden_angle_rad, +Telescope::Telescope(environment::ClockGenerator* clock_generator, const math::Quaternion& quaternion_b2c, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, const double moon_forbidden_angle_rad, const int x_number_of_pix, const int y_number_of_pix, const double x_fov_per_pix, const double y_fov_per_pix, size_t number_of_logged_stars, - const Attitude* attitude, const HipparcosCatalogue* hipparcos, const LocalCelestialInformation* local_celestial_information, - const Orbit* orbit) + const dynamics::attitude::Attitude* attitude, const environment::HipparcosCatalogue* hipparcos, + const environment::LocalCelestialInformation* local_celestial_information, const dynamics::orbit::Orbit* orbit) : Component(1, clock_generator), quaternion_b2c_(quaternion_b2c), sun_forbidden_angle_rad_(sun_forbidden_angle_rad), @@ -38,10 +37,10 @@ Telescope::Telescope(ClockGenerator* clock_generator, const libra::Quaternion& q x_field_of_view_rad = x_number_of_pix_ * x_fov_per_pix_; y_field_of_view_rad = y_number_of_pix_ * y_fov_per_pix_; - assert(x_field_of_view_rad < libra::pi_2); // Avoid the case that the field of view is over 90 degrees - assert(y_field_of_view_rad < libra::pi_2); + assert(x_field_of_view_rad < math::pi_2); // Avoid the case that the field of view is over 90 degrees + assert(y_field_of_view_rad < math::pi_2); - sight_direction_c_ = Vector<3>(0); + sight_direction_c_ = math::Vector<3>(0); sight_direction_c_[0] = 1; // (1,0,0) at component frame, Sight direction vector // Set 0 when t=0 @@ -58,7 +57,7 @@ Telescope::Telescope(ClockGenerator* clock_generator, const libra::Quaternion& q } // Get initial spacecraft position in ECEF if (orbit_ != nullptr) { - libra::Vector<3> initial_spacecraft_position_ecef_m = orbit_->GetPosition_ecef_m(); + math::Vector<3> initial_spacecraft_position_ecef_m = orbit_->GetPosition_ecef_m(); initial_ground_position_ecef_m_ = environment::earth_equatorial_radius_m * initial_spacecraft_position_ecef_m; initial_ground_position_ecef_m_ /= (orbit_->GetGeodeticPosition().GetAltitude_m() + environment::earth_equatorial_radius_m); } @@ -83,26 +82,26 @@ void Telescope::MainRoutine(const int time_count) { // sun_pos_c = quaternion_b2c_.FrameConversion(dynamics_->celestial_->GetPositionFromSpacecraft_b_m("SUN")); // earth_pos_c = quaternion_b2c_.FrameConversion(dynamics_->celestial_->GetPositionFromSpacecraft_b_m("EARTH")); // moon_pos_c = quaternion_b2c_.FrameConversion(dynamics_->celestial_->GetPositionFromSpacecraft_b_m("MOON")); - // angle_sun = CalcAngleTwoVectors_rad(sight_direction_c_, sun_pos_c) * 180/libra::pi; - // angle_earth = CalcAngleTwoVectors_rad(sight_direction_c_, earth_pos_c) * 180 / libra::pi; angle_moon = - // CalcAngleTwoVectors_rad(sight_direction_c_, moon_pos_c) * 180 / libra::pi; + // angle_sun = CalcAngleTwoVectors_rad(sight_direction_c_, sun_pos_c) * 180/math::pi; + // angle_earth = CalcAngleTwoVectors_rad(sight_direction_c_, earth_pos_c) * 180 / math::pi; angle_moon = + // CalcAngleTwoVectors_rad(sight_direction_c_, moon_pos_c) * 180 / math::pi; //****************************************************************************** // Direction calculation of ground point ObserveGroundPositionDeviation(); } -bool Telescope::JudgeForbiddenAngle(const libra::Vector<3>& target_b, const double forbidden_angle) { - libra::Quaternion q_c2b = quaternion_b2c_.Conjugate(); - libra::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); - double angle_rad = libra::CalcAngleTwoVectors_rad(target_b, sight_b); +bool Telescope::JudgeForbiddenAngle(const math::Vector<3>& target_b, const double forbidden_angle) { + math::Quaternion q_c2b = quaternion_b2c_.Conjugate(); + math::Vector<3> sight_b = q_c2b.FrameConversion(sight_direction_c_); + double angle_rad = math::CalcAngleTwoVectors_rad(target_b, sight_b); if (angle_rad < forbidden_angle) { return true; } else return false; } -void Telescope::Observe(libra::Vector<2>& position_image_sensor, const libra::Vector<3, double> target_b) { - libra::Vector<3, double> target_c = quaternion_b2c_.FrameConversion(target_b); +void Telescope::Observe(math::Vector<2>& position_image_sensor, const math::Vector<3, double> target_b) { + math::Vector<3, double> target_c = quaternion_b2c_.FrameConversion(target_b); double arg_x = atan2(target_c[2], target_c[0]); // Angle from X-axis on XZ plane in the component frame double arg_y = atan2(target_c[1], target_c[0]); // Angle from X-axis on XY plane in the component frame @@ -116,14 +115,14 @@ void Telescope::Observe(libra::Vector<2>& position_image_sensor, const libra::Ve } void Telescope::ObserveStars() { - Quaternion quaternion_i2b = attitude_->GetQuaternion_i2b(); + math::Quaternion quaternion_i2b = attitude_->GetQuaternion_i2b(); star_list_in_sight.clear(); // Clear first size_t count = 0; // Counter for while loop while (star_list_in_sight.size() < number_of_logged_stars_) { - libra::Vector<3> target_b = hipparcos_->GetStarDirection_b(count, quaternion_i2b); - libra::Vector<3> target_c = quaternion_b2c_.FrameConversion(target_b); + math::Vector<3> target_b = hipparcos_->GetStarDirection_b(count, quaternion_i2b); + math::Vector<3> target_c = quaternion_b2c_.FrameConversion(target_b); double arg_x = atan2(target_c[2], target_c[0]); // Angle from X-axis on XZ plane in the component frame double arg_y = atan2(target_c[1], target_c[0]); // Angle from X-axis on XY plane in the component frame @@ -173,13 +172,13 @@ void Telescope::ObserveGroundPositionDeviation() { return; } - Quaternion quaternion_i2b = attitude_->GetQuaternion_i2b(); - libra::Vector<3> spacecraft_position_ecef_m = orbit_->GetPosition_ecef_m(); - libra::Vector<3> direction_ecef = (initial_ground_position_ecef_m_ - spacecraft_position_ecef_m).CalcNormalizedVector(); - libra::Matrix<3, 3> dcm_ecef_to_i = local_celestial_information_->GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef().Transpose(); - libra::Vector<3> direction_i = (dcm_ecef_to_i * direction_ecef).CalcNormalizedVector(); - libra::Vector<3> direction_b = quaternion_i2b.FrameConversion(direction_i); - libra::Vector<3> target_c = quaternion_b2c_.FrameConversion(direction_b); + math::Quaternion quaternion_i2b = attitude_->GetQuaternion_i2b(); + math::Vector<3> spacecraft_position_ecef_m = orbit_->GetPosition_ecef_m(); + math::Vector<3> direction_ecef = (initial_ground_position_ecef_m_ - spacecraft_position_ecef_m).CalcNormalizedVector(); + math::Matrix<3, 3> dcm_ecef_to_i = local_celestial_information_->GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef().Transpose(); + math::Vector<3> direction_i = (dcm_ecef_to_i * direction_ecef).CalcNormalizedVector(); + math::Vector<3> direction_b = quaternion_i2b.FrameConversion(direction_i); + math::Vector<3> target_c = quaternion_b2c_.FrameConversion(direction_b); // Ground position in the image sensor in the satellite frame double ground_angle_z_rad = atan2(target_c[2], target_c[0]); @@ -188,69 +187,70 @@ void Telescope::ObserveGroundPositionDeviation() { ground_position_y_image_sensor_ = ground_angle_y_rad / y_fov_per_pix_; } -string Telescope::GetLogHeader() const { - string str_tmp = ""; +std::string Telescope::GetLogHeader() const { + std::string str_tmp = ""; std::string component_name = "telescope_"; - str_tmp += WriteScalar(component_name + "sun_in_exclusion_angle", ""); - str_tmp += WriteScalar(component_name + "earth_in_exclusion_angle", ""); - str_tmp += WriteScalar(component_name + "moon_in_exclusion_angle", ""); - str_tmp += WriteVector(component_name + "sun_position", "img", "pix", 2); - str_tmp += WriteVector(component_name + "earth_position", "img", "pix", 2); - str_tmp += WriteVector(component_name + "moon_position", "img", "pix", 2); - str_tmp += WriteScalar(component_name + "ground_position_x", "pix"); - str_tmp += WriteScalar(component_name + "ground_position_y", "pix"); + str_tmp += logger::WriteScalar(component_name + "sun_in_exclusion_angle", ""); + str_tmp += logger::WriteScalar(component_name + "earth_in_exclusion_angle", ""); + str_tmp += logger::WriteScalar(component_name + "moon_in_exclusion_angle", ""); + str_tmp += logger::WriteVector(component_name + "sun_position", "img", "pix", 2); + str_tmp += logger::WriteVector(component_name + "earth_position", "img", "pix", 2); + str_tmp += logger::WriteVector(component_name + "moon_position", "img", "pix", 2); + str_tmp += logger::WriteScalar(component_name + "ground_position_x", "pix"); + str_tmp += logger::WriteScalar(component_name + "ground_position_y", "pix"); // When Hipparcos Catalogue was not read, no output of ObserveStars if (hipparcos_->IsCalcEnabled) { for (size_t i = 0; i < number_of_logged_stars_; i++) { - str_tmp += WriteScalar(component_name + "hipparcos_id (" + to_string(i) + ")", " "); - str_tmp += WriteScalar(component_name + "visible_magnitude (" + to_string(i) + ")", " "); - str_tmp += WriteVector(component_name + "star_position (" + to_string(i) + ")", "img", "pix", 2); + str_tmp += logger::WriteScalar(component_name + "hipparcos_id (" + std::to_string(i) + ")", " "); + str_tmp += logger::WriteScalar(component_name + "visible_magnitude (" + std::to_string(i) + ")", " "); + str_tmp += logger::WriteVector(component_name + "star_position (" + std::to_string(i) + ")", "img", "pix", 2); } } // Debug output ********************************************** - // str_tmp += WriteScalar("angle_sun", ""); - // str_tmp += WriteScalar("angle_earth", ""); - // str_tmp += WriteScalar("angle_moon", ""); + // str_tmp += logger::WriteScalar("angle_sun", ""); + // str_tmp += logger::WriteScalar("angle_earth", ""); + // str_tmp += logger::WriteScalar("angle_moon", ""); //********************************************************** return str_tmp; } -string Telescope::GetLogValue() const { - string str_tmp = ""; - str_tmp += WriteScalar(is_sun_in_forbidden_angle); - str_tmp += WriteScalar(is_earth_in_forbidden_angle); - str_tmp += WriteScalar(is_moon_in_forbidden_angle); - str_tmp += WriteVector(sun_position_image_sensor); - str_tmp += WriteVector(earth_position_image_sensor); - str_tmp += WriteVector(moon_position_image_sensor); - str_tmp += WriteScalar(ground_position_x_image_sensor_); - str_tmp += WriteScalar(ground_position_y_image_sensor_); +std::string Telescope::GetLogValue() const { + std::string str_tmp = ""; + str_tmp += logger::WriteScalar(is_sun_in_forbidden_angle); + str_tmp += logger::WriteScalar(is_earth_in_forbidden_angle); + str_tmp += logger::WriteScalar(is_moon_in_forbidden_angle); + str_tmp += logger::WriteVector(sun_position_image_sensor); + str_tmp += logger::WriteVector(earth_position_image_sensor); + str_tmp += logger::WriteVector(moon_position_image_sensor); + str_tmp += logger::WriteScalar(ground_position_x_image_sensor_); + str_tmp += logger::WriteScalar(ground_position_y_image_sensor_); // When Hipparcos Catalogue was not read, no output of ObserveStars if (hipparcos_->IsCalcEnabled) { for (size_t i = 0; i < number_of_logged_stars_; i++) { - str_tmp += WriteScalar(star_list_in_sight[i].hipparcos_data.hipparcos_id); - str_tmp += WriteScalar(star_list_in_sight[i].hipparcos_data.visible_magnitude); - str_tmp += WriteVector(star_list_in_sight[i].position_image_sensor); + str_tmp += logger::WriteScalar(star_list_in_sight[i].hipparcos_data.hipparcos_id); + str_tmp += logger::WriteScalar(star_list_in_sight[i].hipparcos_data.visible_magnitude); + str_tmp += logger::WriteVector(star_list_in_sight[i].position_image_sensor); } } // Debug output ********************************************** - // str_tmp += WriteScalar(angle_sun); - // str_tmp += WriteScalar(angle_earth); - // str_tmp += WriteScalar(angle_moon); + // str_tmp += logger::WriteScalar(angle_sun); + // str_tmp += logger::WriteScalar(angle_earth); + // str_tmp += logger::WriteScalar(angle_moon); //********************************************************** return str_tmp; } -Telescope InitTelescope(ClockGenerator* clock_generator, int sensor_id, const string file_name, const Attitude* attitude, - const HipparcosCatalogue* hipparcos, const LocalCelestialInformation* local_celestial_information, const Orbit* orbit) { - using libra::pi; +Telescope InitTelescope(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, + const dynamics::attitude::Attitude* attitude, const environment::HipparcosCatalogue* hipparcos, + const environment::LocalCelestialInformation* local_celestial_information, const dynamics::orbit::Orbit* orbit) { + using math::pi; - IniAccess Telescope_conf(file_name); - const string st_sensor_id = std::to_string(static_cast(sensor_id)); + setting_file_reader::IniAccess Telescope_conf(file_name); + const std::string st_sensor_id = std::to_string(static_cast(sensor_id)); const char* cs = st_sensor_id.data(); char TelescopeSection[30] = "TELESCOPE_"; @@ -260,7 +260,7 @@ Telescope InitTelescope(ClockGenerator* clock_generator, int sensor_id, const st strcat(TelescopeSection, cs); #endif - libra::Quaternion quaternion_b2c; + math::Quaternion quaternion_b2c; Telescope_conf.ReadQuaternion(TelescopeSection, "quaternion_b2c", quaternion_b2c); double sun_forbidden_angle_deg = Telescope_conf.ReadDouble(TelescopeSection, "sun_exclusion_angle_deg"); @@ -285,3 +285,5 @@ Telescope InitTelescope(ClockGenerator* clock_generator, int sensor_id, const st orbit); return telescope; } + +} // namespace s2e::components diff --git a/src/components/real/mission/telescope.hpp b/src/components/real/mission/telescope.hpp index 43dd5997f..dc663de90 100644 --- a/src/components/real/mission/telescope.hpp +++ b/src/components/real/mission/telescope.hpp @@ -10,27 +10,29 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include "../../base/component.hpp" +namespace s2e::components { + /* * @struct Star * @brief Information of stars in the telescope's field of view */ struct Star { - HipparcosData hipparcos_data; //!< Hipparcos data - libra::Vector<2> position_image_sensor; //!< Position of image sensor + environment::HipparcosData hipparcos_data; //!< Hipparcos data + math::Vector<2> position_image_sensor; //!< Position of image sensor }; /* * @class Telescope * @brief Component emulation: Telescope */ -class Telescope : public Component, public ILoggable { +class Telescope : public Component, public logger::ILoggable { public: /** * @fn Telescope @@ -45,15 +47,16 @@ class Telescope : public Component, public ILoggable { * @param [in] x_fov_per_pix: Field of view per pixel of X-axis in the image plane [rad/pix] * @param [in] y_fov_per_pix: Field of view per pixel of Y-axis in the image plane [rad/pix] * @param [in] number_of_logged_stars: Number of logged stars - * @param [in] attitude: Attitude Information + * @param [in] attitude: dynamics::attitude::Attitude Information * @param [in] hipparcos: Hipparcos catalogue information * @param [in] local_celestial_information: Local celestial information * @param [in] orbit: Orbit information */ - Telescope(ClockGenerator* clock_generator, const libra::Quaternion& quaternion_b2c, const double sun_forbidden_angle_rad, + Telescope(environment::ClockGenerator* clock_generator, const math::Quaternion& quaternion_b2c, const double sun_forbidden_angle_rad, const double earth_forbidden_angle_rad, const double moon_forbidden_angle_rad, const int x_number_of_pix, const int y_number_of_pix, - const double x_fov_per_pix, const double y_fov_per_pix, size_t number_of_logged_stars, const Attitude* attitude, - const HipparcosCatalogue* hipparcos, const LocalCelestialInformation* local_celestial_information, const Orbit* orbit = nullptr); + const double x_fov_per_pix, const double y_fov_per_pix, size_t number_of_logged_stars, const dynamics::attitude::Attitude* attitude, + const environment::HipparcosCatalogue* hipparcos, const environment::LocalCelestialInformation* local_celestial_information, + const dynamics::orbit::Orbit* orbit = nullptr); /** * @fn ~Telescope * @brief Destructor @@ -67,8 +70,8 @@ class Telescope : public Component, public ILoggable { protected: private: - libra::Quaternion quaternion_b2c_; //!< Quaternion from the body frame to component frame - libra::Vector<3> sight_direction_c_; //!< Sight direction vector in the component frame + math::Quaternion quaternion_b2c_; //!< Quaternion from the body frame to component frame + math::Vector<3> sight_direction_c_; //!< Sight direction vector in the component frame double sun_forbidden_angle_rad_; //!< Sun forbidden angle [rad] double earth_forbidden_angle_rad_; //!< Earth forbidden angle [rad] @@ -89,10 +92,10 @@ class Telescope : public Component, public ILoggable { size_t number_of_logged_stars_; //!< Number of logged stars - libra::Vector<2> sun_position_image_sensor{-1}; //!< Position of the sun on the image plane - libra::Vector<2> earth_position_image_sensor{-1}; //!< Position of the earth on the image plane - libra::Vector<2> moon_position_image_sensor{-1}; //!< Position of the moon on the image plane - libra::Vector<3> initial_ground_position_ecef_m_; //!< Initial spacecraft position + math::Vector<2> sun_position_image_sensor{-1}; //!< Position of the sun on the image plane + math::Vector<2> earth_position_image_sensor{-1}; //!< Position of the earth on the image plane + math::Vector<2> moon_position_image_sensor{-1}; //!< Position of the moon on the image plane + math::Vector<3> initial_ground_position_ecef_m_; //!< Initial spacecraft position std::vector star_list_in_sight; //!< Star information in the field of view @@ -102,7 +105,7 @@ class Telescope : public Component, public ILoggable { * @param [in] target_b: Direction vector of target on the body fixed frame * @param [in] forbidden_angle: Forbidden angle [rad] */ - bool JudgeForbiddenAngle(const libra::Vector<3>& target_b, const double forbidden_angle); + bool JudgeForbiddenAngle(const math::Vector<3>& target_b, const double forbidden_angle); // Override functions for Component /** @@ -117,39 +120,39 @@ class Telescope : public Component, public ILoggable { * @param [out] position_image_sensor: Position on image sensor plane * @param [in] target_b: Direction vector of target on the body fixed frame */ - void Observe(libra::Vector<2>& position_image_sensor, const libra::Vector<3, double> target_b); + void Observe(math::Vector<2>& position_image_sensor, const math::Vector<3, double> target_b); /** * @fn ObserveStars * @brief Observe stars from Hipparcos catalogue */ void ObserveStars(); - const Attitude* attitude_; //!< Attitude information - const HipparcosCatalogue* hipparcos_; //!< Star information - const LocalCelestialInformation* local_celestial_information_; //!< Local celestial information + const dynamics::attitude::Attitude* attitude_; //!< dynamics::attitude::Attitude information + const environment::HipparcosCatalogue* hipparcos_; //!< Star information + const environment::LocalCelestialInformation* local_celestial_information_; //!< Local celestial information /** * @fn ObserveGroundPositionDeviation * @brief Calculate the deviation of the ground position from its initial value in the image sensor */ void ObserveGroundPositionDeviation(); - const Orbit* orbit_; //!< Orbit information - // Override ILoggable + const dynamics::orbit::Orbit* orbit_; //!< Orbit information + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; // For debug ********************************************** - // libra::Vector<3> sun_pos_c; - // libra::Vector<3> earth_pos_c; - // libra::Vector<3> moon_pos_c; + // math::Vector<3> sun_pos_c; + // math::Vector<3> earth_pos_c; + // math::Vector<3> moon_pos_c; // double angle_sun; // double angle_earth; // double angle_moon; @@ -162,12 +165,14 @@ class Telescope : public Component, public ILoggable { * @param [in] clock_generator: Clock generator * @param [in] sensor_id: Sensor ID * @param [in] file_name: Path to initialize file - * @param [in] attitude: Attitude information + * @param [in] attitude: dynamics::attitude::Attitude information * @param [in] hipparcos: Star information by Hipparcos catalogue * @param [in] local_celestial_information: Local celestial information */ -Telescope InitTelescope(ClockGenerator* clock_generator, int sensor_id, const std::string file_name, const Attitude* attitude, - const HipparcosCatalogue* hipparcos, const LocalCelestialInformation* local_celestial_information, - const Orbit* orbit = nullptr); +Telescope InitTelescope(environment::ClockGenerator* clock_generator, int sensor_id, const std::string file_name, + const dynamics::attitude::Attitude* attitude, const environment::HipparcosCatalogue* hipparcos, + const environment::LocalCelestialInformation* local_celestial_information, const dynamics::orbit::Orbit* orbit = nullptr); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_MISSION_TELESCOPE_HPP_P_ diff --git a/src/components/real/power/battery.cpp b/src/components/real/power/battery.cpp index 072f55fc5..247bf082b 100644 --- a/src/components/real/power/battery.cpp +++ b/src/components/real/power/battery.cpp @@ -6,11 +6,13 @@ #include "battery.hpp" #include -#include +#include -Battery::Battery(const int prescaler, ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, - const std::vector cell_discharge_curve_coefficients, double initial_dod, double cc_charge_c_rate, double cv_charge_voltage_V, - double battery_resistance_Ohm, double component_step_time_s) +namespace s2e::components { + +Battery::Battery(const int prescaler, environment::ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, + double cell_capacity_Ah, const std::vector cell_discharge_curve_coefficients, double initial_dod, double cc_charge_c_rate, + double cv_charge_voltage_V, double battery_resistance_Ohm, double component_step_time_s) : Component(prescaler, clock_generator), number_of_series_(number_of_series), number_of_parallel_(number_of_parallel), @@ -22,7 +24,7 @@ Battery::Battery(const int prescaler, ClockGenerator* clock_generator, int numbe battery_resistance_Ohm_(battery_resistance_Ohm), compo_step_time_s_(component_step_time_s) {} -Battery::Battery(ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, +Battery::Battery(environment::ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, const std::vector cell_discharge_curve_coefficients, double initial_dod, double cc_charge_c_rate, double cv_charge_voltage_V, double battery_resistance_Ohm) : Component(10, clock_generator), @@ -56,15 +58,15 @@ Battery::~Battery() {} std::string Battery::GetLogHeader() const { std::string str_tmp = ""; std::string component_name = "battery_"; - str_tmp += WriteScalar(component_name + "voltage", "V"); - str_tmp += WriteScalar(component_name + "dod", "%"); + str_tmp += logger::WriteScalar(component_name + "voltage", "V"); + str_tmp += logger::WriteScalar(component_name + "dod", "%"); return str_tmp; } std::string Battery::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(battery_voltage_V_); - str_tmp += WriteScalar(depth_of_discharge_percent_); + str_tmp += logger::WriteScalar(battery_voltage_V_); + str_tmp += logger::WriteScalar(depth_of_discharge_percent_); return str_tmp; } @@ -87,8 +89,8 @@ void Battery::UpdateBatVoltage() { battery_voltage_V_ = temp * number_of_series_; } -Battery InitBAT(ClockGenerator* clock_generator, int bat_id, const std::string file_name, double component_step_time_s) { - IniAccess bat_conf(file_name); +Battery InitBAT(environment::ClockGenerator* clock_generator, int bat_id, const std::string file_name, double component_step_time_s) { + setting_file_reader::IniAccess bat_conf(file_name); const std::string section_name = "BATTERY_" + std::to_string(static_cast(bat_id)); @@ -130,3 +132,5 @@ Battery InitBAT(ClockGenerator* clock_generator, int bat_id, const std::string f return battery; } + +} // namespace s2e::components diff --git a/src/components/real/power/battery.hpp b/src/components/real/power/battery.hpp index 555d87107..84d2edf9b 100644 --- a/src/components/real/power/battery.hpp +++ b/src/components/real/power/battery.hpp @@ -6,16 +6,18 @@ #ifndef S2E_COMPONENTS_REAL_POWER_BATTERY_HPP_P_ #define S2E_COMPONENTS_REAL_POWER_BATTERY_HPP_P_ -#include +#include #include #include "../../base/component.hpp" +namespace s2e::components { + /* * @class Battery * @brief Component emulation of battery */ -class Battery : public Component, public ILoggable { +class Battery : public Component, public logger::ILoggable { public: /** * @fn Battery @@ -32,7 +34,7 @@ class Battery : public Component, public ILoggable { * @param [in] battery_resistance_Ohm: Battery internal resistance [Ohm] * @param [in] component_step_time_s: Component step time [sec] */ - Battery(const int prescaler, ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, + Battery(const int prescaler, environment::ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, const std::vector cell_discharge_curve_coefficients, double initial_dod, double cc_charge_c_rate, double cv_charge_voltage_V, double battery_resistance_Ohm, double component_step_time_s); /** @@ -49,7 +51,7 @@ class Battery : public Component, public ILoggable { * @param [in] cv_charge_voltage_V: Constant charge voltage [V] * @param [in] battery_resistance_Ohm: Battery internal resistance [Ohm] */ - Battery(ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, + Battery(environment::ClockGenerator* clock_generator, int number_of_series, int number_of_parallel, double cell_capacity_Ah, const std::vector cell_discharge_curve_coefficients, double initial_dod, double cc_charge_c_rate, double cv_charge_voltage_V, double battery_resistance_Ohm); /** @@ -95,15 +97,15 @@ class Battery : public Component, public ILoggable { */ inline double GetCvChargeVoltage_V() const { return cv_charge_voltage_V_; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ std::string GetLogValue() const override; @@ -142,6 +144,8 @@ class Battery : public Component, public ILoggable { * @param [in] file_name: Path to initialize file * @param [in] component_step_time_s: Component step time [sec] */ -Battery InitBAT(ClockGenerator* clock_generator, int bat_id, const std::string file_name, double component_step_time_s); +Battery InitBAT(environment::ClockGenerator* clock_generator, int bat_id, const std::string file_name, double component_step_time_s); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_POWER_BATTERY_HPP_P_ diff --git a/src/components/real/power/csv_scenario_interface.cpp b/src/components/real/power/csv_scenario_interface.cpp index 1ed72c3d7..54ee31a01 100644 --- a/src/components/real/power/csv_scenario_interface.cpp +++ b/src/components/real/power/csv_scenario_interface.cpp @@ -5,14 +5,16 @@ #include "csv_scenario_interface.hpp" -#include +#include + +namespace s2e::components { bool CsvScenarioInterface::is_csv_scenario_enabled_; std::map CsvScenarioInterface::buffer_line_id_; std::map CsvScenarioInterface::buffers_; void CsvScenarioInterface::Initialize(const std::string file_name) { - IniAccess scenario_conf(file_name); + setting_file_reader::IniAccess scenario_conf(file_name); char Section[30] = "SCENARIO"; CsvScenarioInterface::is_csv_scenario_enabled_ = scenario_conf.ReadBoolean(Section, "is_csv_scenario_enabled"); @@ -36,8 +38,8 @@ void CsvScenarioInterface::Initialize(const std::string file_name) { bool CsvScenarioInterface::IsCsvScenarioEnabled() { return CsvScenarioInterface::is_csv_scenario_enabled_; } -libra::Vector<3> CsvScenarioInterface::GetSunDirectionBody(const double time_query) { - libra::Vector<3> sun_dir_b; +math::Vector<3> CsvScenarioInterface::GetSunDirectionBody(const double time_query) { + math::Vector<3> sun_dir_b; sun_dir_b[0] = GetValueFromBuffer("sun_dir_b_x", time_query); sun_dir_b[1] = GetValueFromBuffer("sun_dir_b_y", time_query); sun_dir_b[2] = GetValueFromBuffer("sun_dir_b_z", time_query); @@ -92,3 +94,5 @@ double CsvScenarioInterface::GetValueFromBuffer(const std::string buffer_name, c output = itr->second; return output; } + +} // namespace s2e::components diff --git a/src/components/real/power/csv_scenario_interface.hpp b/src/components/real/power/csv_scenario_interface.hpp index c98812a49..d6c331ad9 100644 --- a/src/components/real/power/csv_scenario_interface.hpp +++ b/src/components/real/power/csv_scenario_interface.hpp @@ -6,11 +6,13 @@ #ifndef S2E_COMPONENTS_REAL_POWER_CSV_SCENARIO_INTERFACE_HPP_ #define S2E_COMPONENTS_REAL_POWER_CSV_SCENARIO_INTERFACE_HPP_ -#include #include +#include #include #include +namespace s2e::components { + typedef std::map DoubleBuffer; /* @@ -36,7 +38,7 @@ class CsvScenarioInterface { * @brief Return sun direction vector in the body fixed frame * @param [in] time_query: Time query */ - static libra::Vector<3> GetSunDirectionBody(const double time_query); + static math::Vector<3> GetSunDirectionBody(const double time_query); /** * @fn GetSunFlag * @brief Return sun flag @@ -78,4 +80,6 @@ class CsvScenarioInterface { static std::map buffers_; //!< Buffer }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_POWER_CSV_SCENARIO_INTERFACE_HPP_ diff --git a/src/components/real/power/pcu_initial_study.cpp b/src/components/real/power/pcu_initial_study.cpp index d7249bd11..b1d35c2a7 100644 --- a/src/components/real/power/pcu_initial_study.cpp +++ b/src/components/real/power/pcu_initial_study.cpp @@ -8,10 +8,12 @@ #include #include #include -#include +#include -PcuInitialStudy::PcuInitialStudy(const int prescaler, ClockGenerator* clock_generator, const std::vector saps, Battery* battery, - double component_step_time_s) +namespace s2e::components { + +PcuInitialStudy::PcuInitialStudy(const int prescaler, environment::ClockGenerator* clock_generator, const std::vector saps, + Battery* battery, double component_step_time_s) : Component(prescaler, clock_generator), saps_(saps), battery_(battery), @@ -22,7 +24,7 @@ PcuInitialStudy::PcuInitialStudy(const int prescaler, ClockGenerator* clock_gene power_consumption_W_ = 0.0; } -PcuInitialStudy::PcuInitialStudy(ClockGenerator* clock_generator, const std::vector saps, Battery* battery) +PcuInitialStudy::PcuInitialStudy(environment::ClockGenerator* clock_generator, const std::vector saps, Battery* battery) : Component(10, clock_generator), saps_(saps), battery_(battery), @@ -38,15 +40,15 @@ PcuInitialStudy::~PcuInitialStudy() {} std::string PcuInitialStudy::GetLogHeader() const { std::string str_tmp = ""; std::string component_name = "pcu_initial_study_"; - str_tmp += WriteScalar(component_name + "power_consumption", "W"); - str_tmp += WriteScalar(component_name + "bus_voltage", "V"); + str_tmp += logger::WriteScalar(component_name + "power_consumption", "W"); + str_tmp += logger::WriteScalar(component_name + "bus_voltage", "V"); return str_tmp; } std::string PcuInitialStudy::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(power_consumption_W_); - str_tmp += WriteScalar(bus_voltage_V_); + str_tmp += logger::WriteScalar(power_consumption_W_); + str_tmp += logger::WriteScalar(bus_voltage_V_); return str_tmp; } @@ -111,9 +113,9 @@ void PcuInitialStudy::UpdateChargeCurrentAndBusVoltage() { } } -PcuInitialStudy InitPCU_InitialStudy(ClockGenerator* clock_generator, int pcu_id, const std::string file_name, +PcuInitialStudy InitPCU_InitialStudy(environment::ClockGenerator* clock_generator, int pcu_id, const std::string file_name, const std::vector saps, Battery* battery, double component_step_time_s) { - IniAccess pcu_conf(file_name); + setting_file_reader::IniAccess pcu_conf(file_name); const std::string section_name = "PCU_INITIAL_STUDY_" + std::to_string(static_cast(pcu_id)); @@ -124,3 +126,5 @@ PcuInitialStudy InitPCU_InitialStudy(ClockGenerator* clock_generator, int pcu_id return pcu; } + +} // namespace s2e::components diff --git a/src/components/real/power/pcu_initial_study.hpp b/src/components/real/power/pcu_initial_study.hpp index 33bc65a00..65f5eda94 100644 --- a/src/components/real/power/pcu_initial_study.hpp +++ b/src/components/real/power/pcu_initial_study.hpp @@ -6,14 +6,16 @@ #ifndef S2E_COMPONENTS_REAL_POWER_PCU_INITIAL_STUDY_HPP_ #define S2E_COMPONENTS_REAL_POWER_PCU_INITIAL_STUDY_HPP_ -#include +#include #include #include "../../base/component.hpp" #include "battery.hpp" #include "solar_array_panel.hpp" -class PcuInitialStudy : public Component, public ILoggable { +namespace s2e::components { + +class PcuInitialStudy : public Component, public logger::ILoggable { public: /** * @fn PcuInitialStudy @@ -24,7 +26,7 @@ class PcuInitialStudy : public Component, public ILoggable { * @param [in] battery: Battery * @param [in] component_step_time_s: Component step time [sec] */ - PcuInitialStudy(const int prescaler, ClockGenerator* clock_generator, const std::vector saps, Battery* battery, + PcuInitialStudy(const int prescaler, environment::ClockGenerator* clock_generator, const std::vector saps, Battery* battery, double component_step_time_s); /** * @fn PcuInitialStudy @@ -33,22 +35,22 @@ class PcuInitialStudy : public Component, public ILoggable { * @param [in] saps: Solar Array Panels * @param [in] battery: Battery */ - PcuInitialStudy(ClockGenerator* clock_generator, const std::vector saps, Battery* battery); + PcuInitialStudy(environment::ClockGenerator* clock_generator, const std::vector saps, Battery* battery); /** * @fn ~PcuInitialStudy * @brief Destructor */ ~PcuInitialStudy(); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ std::string GetLogValue() const override; @@ -92,7 +94,9 @@ class PcuInitialStudy : public Component, public ILoggable { * @param [in] battery: Battery information * @param [in] component_step_time_s: Component step time [sec] */ -PcuInitialStudy InitPCU_InitialStudy(ClockGenerator* clock_generator, int pcu_id, const std::string file_name, +PcuInitialStudy InitPCU_InitialStudy(environment::ClockGenerator* clock_generator, int pcu_id, const std::string file_name, const std::vector saps, Battery* battery, double component_step_time_s); +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_POWER_PCU_INITIAL_STUDY_HPP_ diff --git a/src/components/real/power/power_control_unit.cpp b/src/components/real/power/power_control_unit.cpp index 055300e2c..5ed558949 100644 --- a/src/components/real/power/power_control_unit.cpp +++ b/src/components/real/power/power_control_unit.cpp @@ -4,9 +4,11 @@ */ #include "power_control_unit.hpp" -PowerControlUnit::PowerControlUnit(ClockGenerator* clock_generator) : Component(1, clock_generator) {} +namespace s2e::components { -PowerControlUnit::PowerControlUnit(int prescaler, ClockGenerator* clock_generator) : Component(prescaler, clock_generator) {} +PowerControlUnit::PowerControlUnit(environment::ClockGenerator* clock_generator) : Component(1, clock_generator) {} + +PowerControlUnit::PowerControlUnit(int prescaler, environment::ClockGenerator* clock_generator) : Component(prescaler, clock_generator) {} PowerControlUnit::~PowerControlUnit() {} @@ -52,3 +54,5 @@ std::string PowerControlUnit::GetLogValue() const { std::string str_tmp = ""; return str_tmp; } + +} // namespace s2e::components diff --git a/src/components/real/power/power_control_unit.hpp b/src/components/real/power/power_control_unit.hpp index b35667763..0e16e2547 100644 --- a/src/components/real/power/power_control_unit.hpp +++ b/src/components/real/power/power_control_unit.hpp @@ -7,30 +7,32 @@ #define S2E_COMPONENTS_REAL_POWER_POWER_CONTROL_UNIT_HPP_ #include -#include +#include #include #include "../../base/component.hpp" +namespace s2e::components { + /* * @class PowerControlUnit * @brief Component emulation of Power Control Unit */ -class PowerControlUnit : public Component, public ILoggable { +class PowerControlUnit : public Component, public logger::ILoggable { public: /** * @fn PowerControlUnit * @brief Constructor * @param [in] clock_generator: Clock generator */ - PowerControlUnit(ClockGenerator* clock_generator); + PowerControlUnit(environment::ClockGenerator* clock_generator); /** * @fn PowerControlUnit * @brief Constructor * @param [in] prescaler: Frequency scale factor for update * @param [in] clock_generator: Clock generator */ - PowerControlUnit(int prescaler, ClockGenerator* clock_generator); + PowerControlUnit(int prescaler, environment::ClockGenerator* clock_generator); /** * @fn ~PowerControlUnit * @brief Destructor @@ -44,15 +46,15 @@ class PowerControlUnit : public Component, public ILoggable { */ void MainRoutine(const int time_count) override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ std::string GetLogValue() const override; @@ -95,4 +97,6 @@ class PowerControlUnit : public Component, public ILoggable { std::map power_ports_; //!< Power port list }; +} // namespace s2e::components + #endif // S2E_COMPONENTS_REAL_POWER_POWER_CONTROL_UNIT_HPP_ diff --git a/src/components/real/power/solar_array_panel.cpp b/src/components/real/power/solar_array_panel.cpp index b693e36e6..2bd8632b4 100644 --- a/src/components/real/power/solar_array_panel.cpp +++ b/src/components/real/power/solar_array_panel.cpp @@ -7,12 +7,14 @@ #include #include -#include +#include -SolarArrayPanel::SolarArrayPanel(const int prescaler, ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, - double cell_area_m2, libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, - const LocalCelestialInformation* local_celestial_information, double component_step_time_s) +namespace s2e::components { + +SolarArrayPanel::SolarArrayPanel(const int prescaler, environment::ClockGenerator* clock_generator, int component_id, int number_of_series, + int number_of_parallel, double cell_area_m2, math::Vector<3> normal_vector, double cell_efficiency, + double transmission_efficiency, const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information, double component_step_time_s) : Component(prescaler, clock_generator), component_id_(component_id), number_of_series_(number_of_series), @@ -28,9 +30,10 @@ SolarArrayPanel::SolarArrayPanel(const int prescaler, ClockGenerator* clock_gene power_generation_W_ = 0.0; } -SolarArrayPanel::SolarArrayPanel(const int prescaler, ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, - double cell_area_m2, libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s) +SolarArrayPanel::SolarArrayPanel(const int prescaler, environment::ClockGenerator* clock_generator, int component_id, int number_of_series, + int number_of_parallel, double cell_area_m2, math::Vector<3> normal_vector, double cell_efficiency, + double transmission_efficiency, const environment::SolarRadiationPressureEnvironment* srp_environment, + double component_step_time_s) : Component(prescaler, clock_generator), component_id_(component_id), number_of_series_(number_of_series), @@ -45,10 +48,10 @@ SolarArrayPanel::SolarArrayPanel(const int prescaler, ClockGenerator* clock_gene power_generation_W_ = 0.0; } -SolarArrayPanel::SolarArrayPanel(ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, double cell_area_m2, - libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, - const LocalCelestialInformation* local_celestial_information) +SolarArrayPanel::SolarArrayPanel(environment::ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, + double cell_area_m2, math::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information) : Component(10, clock_generator), component_id_(component_id), number_of_series_(number_of_series), @@ -85,13 +88,13 @@ SolarArrayPanel::~SolarArrayPanel() {} std::string SolarArrayPanel::GetLogHeader() const { std::string str_tmp = ""; std::string component_name = "sap" + std::to_string(component_id_) + "_"; - str_tmp += WriteScalar(component_name + "generated_power", "W"); + str_tmp += logger::WriteScalar(component_name + "generated_power", "W"); return str_tmp; } std::string SolarArrayPanel::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(power_generation_W_); + str_tmp += logger::WriteScalar(power_generation_W_); return str_tmp; } @@ -99,14 +102,14 @@ void SolarArrayPanel::MainRoutine(const int time_count) { if (CsvScenarioInterface::IsCsvScenarioEnabled()) { double time_query = compo_step_time_s_ * time_count; const auto solar_constant = srp_environment_->GetSolarConstant_W_m2(); - libra::Vector<3> sun_direction_body = CsvScenarioInterface::GetSunDirectionBody(time_query); - libra::Vector<3> normalized_sun_direction_body = sun_direction_body.CalcNormalizedVector(); + math::Vector<3> sun_direction_body = CsvScenarioInterface::GetSunDirectionBody(time_query); + math::Vector<3> normalized_sun_direction_body = sun_direction_body.CalcNormalizedVector(); power_generation_W_ = cell_efficiency_ * transmission_efficiency_ * solar_constant * (int)CsvScenarioInterface::GetSunFlag(time_query) * cell_area_m2_ * number_of_parallel_ * number_of_series_ * InnerProduct(normal_vector_, normalized_sun_direction_body); } else { const auto power_density = srp_environment_->GetPowerDensity_W_m2(); - libra::Vector<3> sun_pos_b = local_celestial_information_->GetPositionFromSpacecraft_b_m("SUN"); - libra::Vector<3> sun_dir_b = sun_pos_b.CalcNormalizedVector(); + math::Vector<3> sun_pos_b = local_celestial_information_->GetPositionFromSpacecraft_b_m("SUN"); + math::Vector<3> sun_dir_b = sun_pos_b.CalcNormalizedVector(); power_generation_W_ = cell_efficiency_ * transmission_efficiency_ * power_density * cell_area_m2_ * number_of_parallel_ * number_of_series_ * InnerProduct(normal_vector_, sun_dir_b); // TODO: Improve implementation. For example, update IV curve with sun direction and calculate generated power @@ -114,10 +117,10 @@ void SolarArrayPanel::MainRoutine(const int time_count) { if (power_generation_W_ < 0) power_generation_W_ = 0.0; } -SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information, - double component_step_time_s) { - IniAccess sap_conf(file_name); +SolarArrayPanel InitSAP(environment::ClockGenerator* clock_generator, int sap_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information, double component_step_time_s) { + setting_file_reader::IniAccess sap_conf(file_name); const std::string section_name = "SOLAR_ARRAY_PANEL_" + std::to_string(static_cast(sap_id)); @@ -133,7 +136,7 @@ SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std:: double cell_area_m2; cell_area_m2 = sap_conf.ReadDouble(section_name.c_str(), "cell_area_m2"); - libra::Vector<3> normal_vector; + math::Vector<3> normal_vector; sap_conf.ReadVector(section_name.c_str(), "normal_vector_b", normal_vector); double cell_efficiency; @@ -148,9 +151,9 @@ SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std:: return sap; } -SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s) { - IniAccess sap_conf(file_name); +SolarArrayPanel InitSAP(environment::ClockGenerator* clock_generator, int sap_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s) { + setting_file_reader::IniAccess sap_conf(file_name); const std::string section_name = "SOLAR_ARRAY_PANEL_" + std::to_string(static_cast(sap_id)); @@ -166,7 +169,7 @@ SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std:: double cell_area_m2; cell_area_m2 = sap_conf.ReadDouble(section_name.c_str(), "cell_area_m2"); - libra::Vector<3> normal_vector; + math::Vector<3> normal_vector; sap_conf.ReadVector(section_name.c_str(), "normal_vector_b", normal_vector); double cell_efficiency; @@ -180,3 +183,5 @@ SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std:: return sap; } + +} // namespace s2e::components diff --git a/src/components/real/power/solar_array_panel.hpp b/src/components/real/power/solar_array_panel.hpp index c45c1e7c3..63e7d796f 100644 --- a/src/components/real/power/solar_array_panel.hpp +++ b/src/components/real/power/solar_array_panel.hpp @@ -8,12 +8,14 @@ #include #include -#include -#include +#include +#include #include "../../base/component.hpp" -class SolarArrayPanel : public Component, public ILoggable { +namespace s2e::components { + +class SolarArrayPanel : public Component, public logger::ILoggable { public: /** * @fn SolarArrayPanel @@ -31,10 +33,10 @@ class SolarArrayPanel : public Component, public ILoggable { * @param [in] local_celestial_information: Local celestial information * @param [in] component_step_time_s: Component step time [sec] */ - SolarArrayPanel(const int prescaler, ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, - double cell_area_m2, libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information, - double component_step_time_s); + SolarArrayPanel(const int prescaler, environment::ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, + double cell_area_m2, math::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information, double component_step_time_s); /** * @fn SolarArrayPanel * @brief Constructor with prescaler @@ -50,9 +52,9 @@ class SolarArrayPanel : public Component, public ILoggable { * @param [in] srp_environment: Solar Radiation Pressure environment * @param [in] component_step_time_s: Component step time [sec] */ - SolarArrayPanel(const int prescaler, ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, - double cell_area_m2, libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s); + SolarArrayPanel(const int prescaler, environment::ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, + double cell_area_m2, math::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, + const environment::SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s); /** * @fn SolarArrayPanel * @brief Constructor without prescaler @@ -68,9 +70,10 @@ class SolarArrayPanel : public Component, public ILoggable { * @param [in] srp_environment: Solar Radiation Pressure environment * @param [in] local_celestial_information: Local celestial information */ - SolarArrayPanel(ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, double cell_area_m2, - libra::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information); + SolarArrayPanel(environment::ClockGenerator* clock_generator, int component_id, int number_of_series, int number_of_parallel, double cell_area_m2, + math::Vector<3> normal_vector, double cell_efficiency, double transmission_efficiency, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information); /** * @fn SolarArrayPanel * @brief Copy constructor @@ -94,15 +97,15 @@ class SolarArrayPanel : public Component, public ILoggable { */ void SetVoltage_V(const double voltage_V) { voltage_V_ = voltage_V; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ std::string GetLogValue() const override; @@ -111,12 +114,12 @@ class SolarArrayPanel : public Component, public ILoggable { const int number_of_series_; //!< Number of series connected solar cells const int number_of_parallel_; //!< Number of parallel connected solar cells const double cell_area_m2_; //!< Solar cell area [m^2] - const libra::Vector<3> normal_vector_; //!< Normal vector of SolarArrayPanel on the body fixed frame + const math::Vector<3> normal_vector_; //!< Normal vector of SolarArrayPanel on the body fixed frame const double cell_efficiency_; //!< Power generation efficiency of solar cell const double transmission_efficiency_; //!< Efficiency of transmission to PCU - const SolarRadiationPressureEnvironment* const srp_environment_; //!< Solar Radiation Pressure environment - const LocalCelestialInformation* local_celestial_information_; //!< Local celestial information + const environment::SolarRadiationPressureEnvironment* const srp_environment_; //!< Solar Radiation Pressure environment + const environment::LocalCelestialInformation* local_celestial_information_; //!< Local celestial information double voltage_V_; //!< Voltage [V] double power_generation_W_; //!< Generated power [W] @@ -141,9 +144,9 @@ class SolarArrayPanel : public Component, public ILoggable { * @param [in] local_celestial_information: Local celestial information * @param [in] component_step_time_s: Component step time [sec] */ -SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, const LocalCelestialInformation* local_celestial_information, - double component_step_time_s); +SolarArrayPanel InitSAP(environment::ClockGenerator* clock_generator, int sap_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::LocalCelestialInformation* local_celestial_information, double component_step_time_s); /* * @fn InitSAP @@ -154,7 +157,9 @@ SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std:: * @param [in] srp_environment: Solar Radiation Pressure environment * @param [in] component_step_time_s: Component step time [sec] */ -SolarArrayPanel InitSAP(ClockGenerator* clock_generator, int sap_id, const std::string file_name, - const SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s); +SolarArrayPanel InitSAP(environment::ClockGenerator* clock_generator, int sap_id, const std::string file_name, + const environment::SolarRadiationPressureEnvironment* srp_environment, double component_step_time_s); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_POWER_SOLAR_ARRAY_PANEL_HPP_ diff --git a/src/components/real/propulsion/simple_thruster.cpp b/src/components/real/propulsion/simple_thruster.cpp index 31078a501..e30d4b0ce 100644 --- a/src/components/real/propulsion/simple_thruster.cpp +++ b/src/components/real/propulsion/simple_thruster.cpp @@ -5,15 +5,17 @@ #include "simple_thruster.hpp" #include -#include -#include -#include +#include +#include +#include + +namespace s2e::components { // Constructor -SimpleThruster::SimpleThruster(const int prescaler, ClockGenerator* clock_generator, const int component_id, - const libra::Vector<3> thruster_position_b_m, const libra::Vector<3> thrust_direction_b, const double max_magnitude_N, - const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, const Structure* structure, - const Dynamics* dynamics) +SimpleThruster::SimpleThruster(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, + const math::Vector<3> thruster_position_b_m, const math::Vector<3> thrust_direction_b, const double max_magnitude_N, + const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator), component_id_(component_id), thruster_position_b_m_(thruster_position_b_m), @@ -25,10 +27,10 @@ SimpleThruster::SimpleThruster(const int prescaler, ClockGenerator* clock_genera Initialize(magnitude_standard_deviation_N, direction_standard_deviation_rad); } -SimpleThruster::SimpleThruster(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const libra::Vector<3> thruster_position_b_m, const libra::Vector<3> thrust_direction_b, const double max_magnitude_N, - const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, const Structure* structure, - const Dynamics* dynamics) +SimpleThruster::SimpleThruster(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Vector<3> thruster_position_b_m, const math::Vector<3> thrust_direction_b, const double max_magnitude_N, + const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics) : Component(prescaler, clock_generator, power_port), component_id_(component_id), thruster_position_b_m_(thruster_position_b_m), @@ -66,9 +68,9 @@ void SimpleThruster::CalcThrust() { output_thrust_b_N_ = mag * CalcThrustDirection(); } -void SimpleThruster::CalcTorque(const libra::Vector<3> center_of_mass_b_m) { - libra::Vector<3> vector_center2thruster = thruster_position_b_m_ - center_of_mass_b_m; - libra::Vector<3> torque = OuterProduct(vector_center2thruster, output_thrust_b_N_); +void SimpleThruster::CalcTorque(const math::Vector<3> center_of_mass_b_m) { + math::Vector<3> vector_center2thruster = thruster_position_b_m_ - center_of_mass_b_m; + math::Vector<3> torque = OuterProduct(vector_center2thruster, output_thrust_b_N_); output_torque_b_Nm_ = torque; } @@ -77,62 +79,62 @@ std::string SimpleThruster::GetLogHeader() const { std::string str_tmp = ""; std::string head = "simple_thruster" + std::to_string(component_id_) + "_"; - str_tmp += WriteVector(head + "output_thrust", "b", "N", 3); - str_tmp += WriteVector(head + "output_torque", "b", "Nm", 3); - str_tmp += WriteScalar(head + "output_thrust_norm", "N"); + str_tmp += logger::WriteVector(head + "output_thrust", "b", "N", 3); + str_tmp += logger::WriteVector(head + "output_torque", "b", "Nm", 3); + str_tmp += logger::WriteScalar(head + "output_thrust_norm", "N"); return str_tmp; } std::string SimpleThruster::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(output_thrust_b_N_); - str_tmp += WriteVector(output_torque_b_Nm_); - str_tmp += WriteScalar(output_thrust_b_N_.CalcNorm()); + str_tmp += logger::WriteVector(output_thrust_b_N_); + str_tmp += logger::WriteVector(output_torque_b_Nm_); + str_tmp += logger::WriteScalar(output_thrust_b_N_.CalcNorm()); return str_tmp; } double SimpleThruster::CalcThrustMagnitude() { return duty_ * thrust_magnitude_max_N_; } -libra::Vector<3> SimpleThruster::CalcThrustDirection() { - libra::Vector<3> thrust_dir_b_true = thrust_direction_b_; +math::Vector<3> SimpleThruster::CalcThrustDirection() { + math::Vector<3> thrust_dir_b_true = thrust_direction_b_; if (direction_noise_standard_deviation_rad_ > 0.0 + DBL_EPSILON) { - libra::Vector<3> ex; // Fixme: to use outer product to generate orthogonal vector + math::Vector<3> ex; // Fixme: to use outer product to generate orthogonal vector ex[0] = 1.0; ex[1] = 0.0; ex[2] = 0.0; int flag = rand() % 2; double make_axis_rot_rad; if (flag == 0) { - make_axis_rot_rad = libra::pi * (double)rand() / RAND_MAX; + make_axis_rot_rad = math::pi * (double)rand() / RAND_MAX; } else { - make_axis_rot_rad = -libra::pi * (double)rand() / RAND_MAX; + make_axis_rot_rad = -math::pi * (double)rand() / RAND_MAX; } - libra::Quaternion make_axis_rot(thrust_dir_b_true, make_axis_rot_rad); - libra::Vector<3> axis_rot = make_axis_rot.FrameConversion(ex); + math::Quaternion make_axis_rot(thrust_dir_b_true, make_axis_rot_rad); + math::Vector<3> axis_rot = make_axis_rot.FrameConversion(ex); - libra::Quaternion err_rot(axis_rot, direction_random_noise_); // Generate error quaternion + math::Quaternion err_rot(axis_rot, direction_random_noise_); // Generate error quaternion thrust_dir_b_true = err_rot.FrameConversion(thrust_dir_b_true); // Add error } return thrust_dir_b_true; } -SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, int thruster_id, const std::string file_name, const Structure* structure, - const Dynamics* dynamics) { - IniAccess thruster_conf(file_name); +SimpleThruster InitSimpleThruster(environment::ClockGenerator* clock_generator, int thruster_id, const std::string file_name, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics) { + setting_file_reader::IniAccess thruster_conf(file_name); std::string section_str = "THRUSTER_" + std::to_string(thruster_id); auto* Section = section_str.c_str(); int prescaler = thruster_conf.ReadInt(Section, "prescaler"); if (prescaler <= 1) prescaler = 1; - Vector<3> thruster_pos; + math::Vector<3> thruster_pos; thruster_conf.ReadVector(Section, "thruster_position_b_m", thruster_pos); - Vector<3> thruster_dir; + math::Vector<3> thruster_dir; thruster_conf.ReadVector(Section, "thruster_direction_b", thruster_dir); double max_magnitude_N = thruster_conf.ReadDouble(Section, "thrust_magnitude_N"); @@ -141,26 +143,26 @@ SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, int thruster_ magnitude_standard_deviation_N = thruster_conf.ReadDouble(Section, "thrust_error_standard_deviation_N"); double deg_err; - deg_err = thruster_conf.ReadDouble(Section, "direction_error_standard_deviation_deg") * libra::pi / 180.0; + deg_err = thruster_conf.ReadDouble(Section, "direction_error_standard_deviation_deg") * math::pi / 180.0; SimpleThruster thruster(prescaler, clock_generator, thruster_id, thruster_pos, thruster_dir, max_magnitude_N, magnitude_standard_deviation_N, deg_err, structure, dynamics); return thruster; } -SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, PowerPort* power_port, int thruster_id, const std::string file_name, - const Structure* structure, const Dynamics* dynamics) { - IniAccess thruster_conf(file_name); +SimpleThruster InitSimpleThruster(environment::ClockGenerator* clock_generator, PowerPort* power_port, int thruster_id, const std::string file_name, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics) { + setting_file_reader::IniAccess thruster_conf(file_name); std::string section_str = "THRUSTER_" + std::to_string(thruster_id); auto* Section = section_str.c_str(); int prescaler = thruster_conf.ReadInt(Section, "prescaler"); if (prescaler <= 1) prescaler = 1; - Vector<3> thruster_pos; + math::Vector<3> thruster_pos; thruster_conf.ReadVector(Section, "thruster_position_b_m", thruster_pos); - Vector<3> thruster_dir; + math::Vector<3> thruster_dir; thruster_conf.ReadVector(Section, "thruster_direction_b", thruster_dir); double max_magnitude_N = thruster_conf.ReadDouble(Section, "thrust_magnitude_N"); @@ -169,7 +171,7 @@ SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, PowerPort* po magnitude_standard_deviation_N = thruster_conf.ReadDouble(Section, "thrust_error_standard_deviation_N"); double deg_err; - deg_err = thruster_conf.ReadDouble(Section, "direction_error_standard_deviation_deg") * libra::pi / 180.0; + deg_err = thruster_conf.ReadDouble(Section, "direction_error_standard_deviation_deg") * math::pi / 180.0; power_port->InitializeWithInitializeFile(file_name); @@ -177,3 +179,5 @@ SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, PowerPort* po magnitude_standard_deviation_N, deg_err, structure, dynamics); return thruster; } + +} // namespace s2e::components diff --git a/src/components/real/propulsion/simple_thruster.hpp b/src/components/real/propulsion/simple_thruster.hpp index 37496490f..c6d1901b7 100644 --- a/src/components/real/propulsion/simple_thruster.hpp +++ b/src/components/real/propulsion/simple_thruster.hpp @@ -7,19 +7,21 @@ #define S2E_COMPONENTS_REAL_PROPULSION_SIMPLE_THRUSTER_HPP_ #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include "../../base/component.hpp" +namespace s2e::components { + /* * @class SimpleThruster * @brief Component emulation of simple thruster */ -class SimpleThruster : public Component, public ILoggable { +class SimpleThruster : public Component, public logger::ILoggable { public: /** * @fn SimpleThruster @@ -35,9 +37,10 @@ class SimpleThruster : public Component, public ILoggable { * @param [in] structure: Spacecraft structure information * @param [in] dynamics: Spacecraft dynamics information */ - SimpleThruster(const int prescaler, ClockGenerator* clock_generator, const int component_id, const Vector<3> thruster_position_b_m, - const Vector<3> thrust_direction_b, const double max_magnitude_N, const double magnitude_standard_deviation_N, - const double direction_standard_deviation_rad, const Structure* structure, const Dynamics* dynamics); + SimpleThruster(const int prescaler, environment::ClockGenerator* clock_generator, const int component_id, + const math::Vector<3> thruster_position_b_m, const math::Vector<3> thrust_direction_b, const double max_magnitude_N, + const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, const spacecraft::Structure* structure, + const dynamics::Dynamics* dynamics); /** * @fn SimpleThruster * @brief Constructor with power port @@ -53,10 +56,10 @@ class SimpleThruster : public Component, public ILoggable { * @param [in] structure: Spacecraft structure information * @param [in] dynamics: Spacecraft dynamics information */ - SimpleThruster(const int prescaler, ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, - const Vector<3> thruster_position_b_m, const Vector<3> thrust_direction_b, const double max_magnitude_N, - const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, const Structure* structure, - const Dynamics* dynamics); + SimpleThruster(const int prescaler, environment::ClockGenerator* clock_generator, PowerPort* power_port, const int component_id, + const math::Vector<3> thruster_position_b_m, const math::Vector<3> thrust_direction_b, const double max_magnitude_N, + const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad, const spacecraft::Structure* structure, + const dynamics::Dynamics* dynamics); /** * @fn ~SimpleThruster * @brief Destructor @@ -75,15 +78,15 @@ class SimpleThruster : public Component, public ILoggable { */ void PowerOffRoutine() override; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const override; @@ -92,12 +95,12 @@ class SimpleThruster : public Component, public ILoggable { * @fn GetOutputThrust_b_N * @brief Return generated thrust on the body fixed frame [N] */ - inline const Vector<3> GetOutputThrust_b_N() const { return output_thrust_b_N_; }; + inline const math::Vector<3> GetOutputThrust_b_N() const { return output_thrust_b_N_; }; /** * @fn GetOutputTorque_b_Nm * @brief Return generated torque on the body fixed frame [Nm] */ - inline const Vector<3> GetOutputTorque_b_Nm() const { return output_torque_b_Nm_; }; + inline const math::Vector<3> GetOutputTorque_b_Nm() const { return output_torque_b_Nm_; }; // Setter /** @@ -109,16 +112,16 @@ class SimpleThruster : public Component, public ILoggable { protected: // parameters const int component_id_; //!< Thruster ID - Vector<3> thruster_position_b_m_{0.0}; //!< Thruster position @ body frame [m] - Vector<3> thrust_direction_b_{0.0}; //!< Thrust direction @ body frame + math::Vector<3> thruster_position_b_m_{0.0}; //!< Thruster position @ body frame [m] + math::Vector<3> thrust_direction_b_{0.0}; //!< Thrust direction @ body frame double duty_ = 0.0; //!< PWM Duty [0.0 : 1.0] double thrust_magnitude_max_N_ = 0.0; //!< Maximum thrust magnitude [N] double direction_noise_standard_deviation_rad_ = 0.0; //!< Standard deviation of thrust direction error [rad] - libra::NormalRand magnitude_random_noise_; //!< Normal random for thrust magnitude error - libra::NormalRand direction_random_noise_; //!< Normal random for thrust direction error + randomization::NormalRand magnitude_random_noise_; //!< Normal random for thrust magnitude error + randomization::NormalRand direction_random_noise_; //!< Normal random for thrust direction error // outputs - Vector<3> output_thrust_b_N_{0.0}; //!< Generated thrust on the body fixed frame [N] - Vector<3> output_torque_b_Nm_{0.0}; //!< Generated torque on the body fixed frame [Nm] + math::Vector<3> output_thrust_b_N_{0.0}; //!< Generated thrust on the body fixed frame [N] + math::Vector<3> output_torque_b_Nm_{0.0}; //!< Generated torque on the body fixed frame [Nm] /** * @fn CalcThrust @@ -130,7 +133,7 @@ class SimpleThruster : public Component, public ILoggable { * @brief Calculate generated torque * @param [in] center_of_mass_b_m: Center of mass_kg position at body frame [m] */ - void CalcTorque(const Vector<3> center_of_mass_b_m); + void CalcTorque(const math::Vector<3> center_of_mass_b_m); /** * @fn CalcThrustMagnitude * @brief Calculate thrust magnitude @@ -142,7 +145,7 @@ class SimpleThruster : public Component, public ILoggable { * @brief Calculate thrust direction * @return Thrust direction */ - Vector<3> CalcThrustDirection(); + math::Vector<3> CalcThrustDirection(); /** * @fn Initialize * @brief Initialize function @@ -151,8 +154,8 @@ class SimpleThruster : public Component, public ILoggable { */ void Initialize(const double magnitude_standard_deviation_N, const double direction_standard_deviation_rad); - const Structure* structure_; //!< Spacecraft structure information - const Dynamics* dynamics_; //!< Spacecraft dynamics information + const spacecraft::Structure* structure_; //!< Spacecraft structure information + const dynamics::Dynamics* dynamics_; //!< Spacecraft dynamics information }; /** @@ -164,8 +167,8 @@ class SimpleThruster : public Component, public ILoggable { * @param [in] structure: Spacecraft structure information * @param [in] dynamics: Spacecraft dynamics information */ -SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, int thruster_id, const std::string file_name, const Structure* structure, - const Dynamics* dynamics); +SimpleThruster InitSimpleThruster(environment::ClockGenerator* clock_generator, int thruster_id, const std::string file_name, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics); /** * @fn InitSimpleThruster * @brief Initialize function os SimpleThruster @@ -176,7 +179,9 @@ SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, int thruster_ * @param [in] structure: Spacecraft structure information * @param [in] dynamics: Spacecraft dynamics information */ -SimpleThruster InitSimpleThruster(ClockGenerator* clock_generator, PowerPort* power_port, int thruster_id, const std::string file_name, - const Structure* structure, const Dynamics* dynamics); +SimpleThruster InitSimpleThruster(environment::ClockGenerator* clock_generator, PowerPort* power_port, int thruster_id, const std::string file_name, + const spacecraft::Structure* structure, const dynamics::Dynamics* dynamics); + +} // namespace s2e::components #endif // S2E_COMPONENTS_REAL_PROPULSION_SIMPLE_THRUSTER_HPP_ diff --git a/src/disturbances/air_drag.cpp b/src/disturbances/air_drag.cpp index df23967a7..2c9254070 100644 --- a/src/disturbances/air_drag.cpp +++ b/src/disturbances/air_drag.cpp @@ -7,12 +7,14 @@ #include #include -#include -#include +#include +#include -#include "../library/logger/log_utility.hpp" +#include "../logger/log_utility.hpp" -AirDrag::AirDrag(const std::vector& surfaces, const libra::Vector<3>& center_of_gravity_b_m, const double wall_temperature_K, +namespace s2e::disturbances { + +AirDrag::AirDrag(const std::vector& surfaces, const math::Vector<3>& center_of_gravity_b_m, const double wall_temperature_K, const double molecular_temperature_K, const double molecular_weight_g_mol, const bool is_calculation_enabled) : SurfaceForce(surfaces, center_of_gravity_b_m, is_calculation_enabled), wall_temperature_K_(wall_temperature_K), @@ -23,18 +25,18 @@ AirDrag::AirDrag(const std::vector& surfaces, const libra::Vector<3>& c cn_.assign(num, 0.0); } -void AirDrag::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) { +void AirDrag::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { double air_density_kg_m3 = local_environment.GetAtmosphere().GetAirDensity_kg_m3(); - libra::Matrix<3, 3> dcm_ecef2eci = + math::Matrix<3, 3> dcm_ecef2eci = local_environment.GetCelestialInformation().GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef().Transpose(); - libra::Vector<3> relative_velocity_wrt_atmosphere_i_m_s = dcm_ecef2eci * dynamics.GetOrbit().GetVelocity_ecef_m_s(); - libra::Quaternion quaternion_i2b = dynamics.GetAttitude().GetQuaternion_i2b(); - libra::Vector<3> velocity_b_m_s = quaternion_i2b.FrameConversion(relative_velocity_wrt_atmosphere_i_m_s); + math::Vector<3> relative_velocity_wrt_atmosphere_i_m_s = dcm_ecef2eci * dynamics.GetOrbit().GetVelocity_ecef_m_s(); + math::Quaternion quaternion_i2b = dynamics.GetAttitude().GetQuaternion_i2b(); + math::Vector<3> velocity_b_m_s = quaternion_i2b.FrameConversion(relative_velocity_wrt_atmosphere_i_m_s); CalcTorqueForce(velocity_b_m_s, air_density_kg_m3); } -void AirDrag::CalcCoefficients(const libra::Vector<3>& velocity_b_m_s, const double air_density_kg_m3) { +void AirDrag::CalcCoefficients(const math::Vector<3>& velocity_b_m_s, const double air_density_kg_m3) { double velocity_norm_m_s = velocity_b_m_s.CalcNorm(); CalcCnCt(velocity_b_m_s); for (size_t i = 0; i < surfaces_.size(); i++) { @@ -47,18 +49,18 @@ void AirDrag::CalcCoefficients(const libra::Vector<3>& velocity_b_m_s, const dou double AirDrag::CalcFunctionPi(const double s) { double x; double erfs = erf(s); // ERF function is defined in math standard library - x = s * exp(-s * s) + sqrt(libra::pi) * (s * s + 0.5) * (1.0 + erfs); + x = s * exp(-s * s) + sqrt(math::pi) * (s * s + 0.5) * (1.0 + erfs); return x; } double AirDrag::CalcFunctionChi(const double s) { double x; double erfs = erf(s); - x = exp(-s * s) + sqrt(libra::pi) * s * (1.0 + erfs); + x = exp(-s * s) + sqrt(math::pi) * s * (1.0 + erfs); return x; } -void AirDrag::CalcCnCt(const Vector<3>& velocity_b_m_s) { +void AirDrag::CalcCnCt(const math::Vector<3>& velocity_b_m_s) { double velocity_norm_m_s = velocity_b_m_s.CalcNorm(); // Re-emitting speed @@ -69,17 +71,17 @@ void AirDrag::CalcCnCt(const Vector<3>& velocity_b_m_s) { double speed_n = speed * cos_theta_[i]; double speed_t = speed * sin_theta_[i]; double diffuse = 1.0 - surfaces_[i].GetAirSpecularity(); - cn_[i] = (2.0 - diffuse) / sqrt(libra::pi) * CalcFunctionPi(speed_n) / (speed * speed) + + cn_[i] = (2.0 - diffuse) / sqrt(math::pi) * CalcFunctionPi(speed_n) / (speed * speed) + diffuse / 2.0 * CalcFunctionChi(speed_n) / (speed * speed) * sqrt(wall_temperature_K_ / molecular_temperature_K_); - ct_[i] = diffuse * speed_t * CalcFunctionChi(speed_n) / (sqrt(libra::pi) * speed * speed); + ct_[i] = diffuse * speed_t * CalcFunctionChi(speed_n) / (sqrt(math::pi) * speed * speed); } } std::string AirDrag::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("air_drag_torque", "b", "Nm", 3); - str_tmp += WriteVector("air_drag_force", "b", "N", 3); + str_tmp += logger::WriteVector("air_drag_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector("air_drag_force", "b", "N", 3); return str_tmp; } @@ -87,14 +89,15 @@ std::string AirDrag::GetLogHeader() const { std::string AirDrag::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(torque_b_Nm_); - str_tmp += WriteVector(force_b_N_); + str_tmp += logger::WriteVector(torque_b_Nm_); + str_tmp += logger::WriteVector(force_b_N_); return str_tmp; } -AirDrag InitAirDrag(const std::string initialize_file_path, const std::vector& surfaces, const Vector<3>& center_of_gravity_b_m) { - auto conf = IniAccess(initialize_file_path); +AirDrag InitAirDrag(const std::string initialize_file_path, const std::vector& surfaces, + const math::Vector<3>& center_of_gravity_b_m) { + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "AIR_DRAG"; const double wall_temperature_K = conf.ReadDouble(section, "wall_temperature_degC") + 273.0; @@ -109,3 +112,5 @@ AirDrag InitAirDrag(const std::string initialize_file_path, const std::vector #include "../environment/local/atmosphere.hpp" -#include "../library/logger/loggable.hpp" -#include "../library/math/quaternion.hpp" -#include "../library/math/vector.hpp" +#include "../logger/loggable.hpp" +#include "../math_physics/math/quaternion.hpp" +#include "../math_physics/math/vector.hpp" #include "surface_force.hpp" +namespace s2e::disturbances { + /** * @class AirDrag * @brief Class to calculate the air drag disturbance force and torque @@ -30,26 +32,26 @@ class AirDrag : public SurfaceForce { * @param [in] molecular_weight_g_mol: Molecular weight [g/mol] * @param [in] is_calculation_enabled: Calculation flag */ - AirDrag(const std::vector& surfaces, const libra::Vector<3>& center_of_gravity_b_m, const double wall_temperature_K, + AirDrag(const std::vector& surfaces, const math::Vector<3>& center_of_gravity_b_m, const double wall_temperature_K, const double molecular_temperature_K, const double molecular_weight_g_mol, const bool is_calculation_enabled = true); /** * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics); + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -66,7 +68,7 @@ class AirDrag : public SurfaceForce { * @param [in] velocity_b_m_s: Spacecraft's velocity vector in the body frame [m/s] * @param [in] air_density_kg_m3: Air density around the spacecraft [kg/m^3] */ - void CalcCoefficients(const libra::Vector<3>& velocity_b_m_s, const double air_density_kg_m3); + void CalcCoefficients(const math::Vector<3>& velocity_b_m_s, const double air_density_kg_m3); // internal function for calculation /** @@ -74,7 +76,7 @@ class AirDrag : public SurfaceForce { * @brief Calculate the Cn and Ct * @param [in] velocity_b_m_s: Spacecraft's velocity vector in the body frame [m/s] */ - void CalcCnCt(const libra::Vector<3>& velocity_b_m_s); + void CalcCnCt(const math::Vector<3>& velocity_b_m_s); /** * @fn CalcFunctionPi * @brief Calculate The Pi function in the algorithm @@ -96,6 +98,9 @@ class AirDrag : public SurfaceForce { * @param [in] surfaces: surface information of the spacecraft * @param [in] center_of_gravity_b_m: Center of gravity position vector at body frame [m] */ -AirDrag InitAirDrag(const std::string initialize_file_path, const std::vector& surfaces, const Vector<3>& center_of_gravity_b_m); +AirDrag InitAirDrag(const std::string initialize_file_path, const std::vector& surfaces, + const math::Vector<3>& center_of_gravity_b_m); + +} // namespace s2e::disturbances #endif // S2E_DISTURBANCES_AIR_DRAG_HPP_ diff --git a/src/disturbances/disturbance.hpp b/src/disturbances/disturbance.hpp index f43285374..d9de38dd9 100644 --- a/src/disturbances/disturbance.hpp +++ b/src/disturbances/disturbance.hpp @@ -7,26 +7,28 @@ #define S2E_DISTURBANCES_DISTURBANCE_HPP_ #include "../environment/local/local_environment.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/math/vector.hpp" + +namespace s2e::disturbances { /** * @class Disturbance * @brief Base class for a disturbance */ -class Disturbance : public ILoggable { +class Disturbance : public logger::ILoggable { public: /** * @fn Disturbance * @brief Constructor * @param [in] is_calculation_enabled: Calculation flag - * @param [in] is_attitude_dependent: Attitude dependent flag + * @param [in] is_attitude_dependent: dynamics::attitude::Attitude dependent flag */ Disturbance(const bool is_calculation_enabled = true, const bool is_attitude_dependent = true) : is_calculation_enabled_(is_calculation_enabled), is_attitude_dependent_(is_attitude_dependent) { - force_b_N_ = libra::Vector<3>(0.0); - torque_b_Nm_ = libra::Vector<3>(0.0); - acceleration_i_m_s2_ = libra::Vector<3>(0.0); - acceleration_b_m_s2_ = libra::Vector<3>(0.0); + force_b_N_ = math::Vector<3>(0.0); + torque_b_Nm_ = math::Vector<3>(0.0); + acceleration_i_m_s2_ = math::Vector<3>(0.0); + acceleration_b_m_s2_ = math::Vector<3>(0.0); } /** @@ -39,7 +41,7 @@ class Disturbance : public ILoggable { * @fn UpdateIfEnabled * @brief Update calculated disturbance when the calculation flag is true */ - virtual inline void UpdateIfEnabled(const LocalEnvironment& local_environment, const Dynamics& dynamics) { + virtual inline void UpdateIfEnabled(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { if (is_calculation_enabled_) { Update(local_environment, dynamics); } else { @@ -54,28 +56,28 @@ class Disturbance : public ILoggable { * @fn Update * @brief Pure virtual function to define the disturbance calculation */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) = 0; + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) = 0; /** * @fn GetTorque_b_Nm * @brief Return the disturbance torque in the body frame [Nm] */ - virtual inline libra::Vector<3> GetTorque_b_Nm() { return torque_b_Nm_; } + virtual inline math::Vector<3> GetTorque_b_Nm() { return torque_b_Nm_; } /** * @fn GetForce_b_N * @brief Return the disturbance force in the body frame [N] */ - virtual inline libra::Vector<3> GetForce_b_N() { return force_b_N_; } + virtual inline math::Vector<3> GetForce_b_N() { return force_b_N_; } /** * @fn GetAcceleration_b_m_s2 * @brief Return the disturbance acceleration in the body frame [m/s2] */ - virtual inline libra::Vector<3> GetAcceleration_b_m_s2() { return acceleration_b_m_s2_; } + virtual inline math::Vector<3> GetAcceleration_b_m_s2() { return acceleration_b_m_s2_; } /** * @fn GetAcceleration_i_m_s2 * @brief Return the disturbance acceleration in the inertial frame [m/s2] */ - virtual inline libra::Vector<3> GetAcceleration_i_m_s2() { return acceleration_i_m_s2_; } + virtual inline math::Vector<3> GetAcceleration_i_m_s2() { return acceleration_i_m_s2_; } /** * @fn IsAttitudeDependent * @brief Return the attitude dependent flag @@ -83,12 +85,14 @@ class Disturbance : public ILoggable { virtual inline bool IsAttitudeDependent() { return is_attitude_dependent_; } protected: - bool is_calculation_enabled_; //!< Flag to calculate the disturbance - bool is_attitude_dependent_; //!< Flag to show the disturbance depends on attitude information - libra::Vector<3> force_b_N_; //!< Disturbance force in the body frame [N] - libra::Vector<3> torque_b_Nm_; //!< Disturbance torque in the body frame [Nm] - libra::Vector<3> acceleration_b_m_s2_; //!< Disturbance acceleration in the body frame [m/s2] - libra::Vector<3> acceleration_i_m_s2_; //!< Disturbance acceleration in the inertial frame [m/s2] + bool is_calculation_enabled_; //!< Flag to calculate the disturbance + bool is_attitude_dependent_; //!< Flag to show the disturbance depends on attitude information + math::Vector<3> force_b_N_; //!< Disturbance force in the body frame [N] + math::Vector<3> torque_b_Nm_; //!< Disturbance torque in the body frame [Nm] + math::Vector<3> acceleration_b_m_s2_; //!< Disturbance acceleration in the body frame [m/s2] + math::Vector<3> acceleration_i_m_s2_; //!< Disturbance acceleration in the inertial frame [m/s2] }; +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_DISTURBANCE_HPP_ diff --git a/src/disturbances/disturbances.cpp b/src/disturbances/disturbances.cpp index 709200464..c3e3fd018 100644 --- a/src/disturbances/disturbances.cpp +++ b/src/disturbances/disturbances.cpp @@ -5,7 +5,7 @@ #include "disturbances.hpp" -#include +#include #include "air_drag.hpp" #include "geopotential.hpp" @@ -15,8 +15,10 @@ #include "solar_radiation_pressure_disturbance.hpp" #include "third_body_gravity.hpp" -Disturbances::Disturbances(const SimulationConfiguration* simulation_configuration, const int spacecraft_id, const Structure* structure, - const GlobalEnvironment* global_environment) { +namespace s2e::disturbances { + +Disturbances::Disturbances(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id, + const spacecraft::Structure* structure, const environment::GlobalEnvironment* global_environment) { InitializeInstances(simulation_configuration, spacecraft_id, structure, global_environment); InitializeForceAndTorque(); InitializeAcceleration(); @@ -28,7 +30,8 @@ Disturbances::~Disturbances() { } } -void Disturbances::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics, const SimulationTime* simulation_time) { +void Disturbances::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics, + const environment::SimulationTime* simulation_time) { InitializeForceAndTorque(); InitializeAcceleration(); @@ -48,16 +51,16 @@ void Disturbances::Update(const LocalEnvironment& local_environment, const Dynam } } -void Disturbances::LogSetup(Logger& logger) { +void Disturbances::LogSetup(logger::Logger& logger) { for (auto disturbance : disturbances_list_) { logger.AddLogList(disturbance); } logger.CopyFileToLogDirectory(initialize_file_name_); } -void Disturbances::InitializeInstances(const SimulationConfiguration* simulation_configuration, const int spacecraft_id, const Structure* structure, - const GlobalEnvironment* global_environment) { - IniAccess ini_access = IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); +void Disturbances::InitializeInstances(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id, + const spacecraft::Structure* structure, const environment::GlobalEnvironment* global_environment) { + setting_file_reader::IniAccess ini_access = setting_file_reader::IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); initialize_file_name_ = ini_access.ReadString("SETTING_FILES", "disturbance_file"); GravityGradient* gg_dist = new GravityGradient( @@ -91,8 +94,10 @@ void Disturbances::InitializeInstances(const SimulationConfiguration* simulation } void Disturbances::InitializeForceAndTorque() { - total_torque_b_Nm_ = Vector<3>(0.0); - total_force_b_N_ = Vector<3>(0.0); + total_torque_b_Nm_ = math::Vector<3>(0.0); + total_force_b_N_ = math::Vector<3>(0.0); } -void Disturbances::InitializeAcceleration() { total_acceleration_i_m_s2_ = Vector<3>(0.0); } +void Disturbances::InitializeAcceleration() { total_acceleration_i_m_s2_ = math::Vector<3>(0.0); } + +} // namespace s2e::disturbances diff --git a/src/disturbances/disturbances.hpp b/src/disturbances/disturbances.hpp index d5eeaaa40..6e242e058 100644 --- a/src/disturbances/disturbances.hpp +++ b/src/disturbances/disturbances.hpp @@ -14,6 +14,8 @@ class Logger; +namespace s2e::disturbances { + /** * @class Disturbances * @brief Class to manage all disturbances @@ -28,8 +30,8 @@ class Disturbances { * @param [in] structure: Structure information of spacecraft * @param [in] global_environment: Global environment information */ - Disturbances(const SimulationConfiguration* simulation_configuration, const int spacecraft_id, const Structure* structure, - const GlobalEnvironment* global_environment); + Disturbances(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id, const spacecraft::Structure* structure, + const environment::GlobalEnvironment* global_environment); /** * @fn ~Disturbances * @brief Destructor @@ -40,42 +42,43 @@ class Disturbances { * @fn Update * @brief Update all disturbance calculation * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information * @param [in] simulation_time: Simulation time */ - void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics, const SimulationTime* simulation_time); + void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics, + const environment::SimulationTime* simulation_time); /** * @fn LogSetup * @brief log setup for all disturbances * @param [in] logger: Logger */ - void LogSetup(Logger& logger); + void LogSetup(logger::Logger& logger); /** * @fn GetTorque * @brief Return total disturbance torque in the body frame [Nm] */ - inline libra::Vector<3> GetTorque_b_Nm() { return total_torque_b_Nm_; } + inline math::Vector<3> GetTorque_b_Nm() { return total_torque_b_Nm_; } /** * @fn GetTorque * @brief Return total disturbance force in the body frame [N] */ - inline libra::Vector<3> GetForce_b_N() { return total_force_b_N_; } + inline math::Vector<3> GetForce_b_N() { return total_force_b_N_; } /** * @fn GetTorque * @brief Return total disturbance acceleration in the inertial frame [m/s2] */ - inline libra::Vector<3> GetAcceleration_i_m_s2() { return total_acceleration_i_m_s2_; } + inline math::Vector<3> GetAcceleration_i_m_s2() { return total_acceleration_i_m_s2_; } private: std::string initialize_file_name_; //!< Initialization file name std::vector disturbances_list_; //!< List of disturbances - Vector<3> total_torque_b_Nm_; //!< Total disturbance torque in the body frame [Nm] - Vector<3> total_force_b_N_; //!< Total disturbance force in the body frame [N] - Vector<3> total_acceleration_i_m_s2_; //!< Total disturbance acceleration in the inertial frame [m/s2] + math::Vector<3> total_torque_b_Nm_; //!< Total disturbance torque in the body frame [Nm] + math::Vector<3> total_force_b_N_; //!< Total disturbance force in the body frame [N] + math::Vector<3> total_acceleration_i_m_s2_; //!< Total disturbance acceleration in the inertial frame [m/s2] /** * @fn InitializeInstances @@ -85,8 +88,8 @@ class Disturbances { * @param [in] structure: Structure information of spacecraft * @param [in] global_environment: Global environment information */ - void InitializeInstances(const SimulationConfiguration* simulation_configuration, const int spacecraft_id, const Structure* structure, - const GlobalEnvironment* global_environment); + void InitializeInstances(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id, + const spacecraft::Structure* structure, const environment::GlobalEnvironment* global_environment); /** * @fn InitializeForceAndTorque * @brief Initialize disturbance force and torque @@ -99,4 +102,6 @@ class Disturbances { void InitializeAcceleration(); }; +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_DISTURBANCES_HPP_ diff --git a/src/disturbances/geopotential.cpp b/src/disturbances/geopotential.cpp index 39b3e4300..cb6ba222c 100644 --- a/src/disturbances/geopotential.cpp +++ b/src/disturbances/geopotential.cpp @@ -10,18 +10,20 @@ #include #include #include -#include +#include -#include "../library/logger/log_utility.hpp" -#include "../library/utilities/macros.hpp" +#include "../logger/log_utility.hpp" +#include "../utilities/macros.hpp" + +namespace s2e::disturbances { // #define DEBUG_GEOPOTENTIAL Geopotential::Geopotential(const int degree, const std::string file_path, const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, false), degree_(degree) { // Initialize - acceleration_ecef_m_s2_ = libra::Vector<3>(0.0); - debug_pos_ecef_m_ = libra::Vector<3>(0.0); + acceleration_ecef_m_s2_ = math::Vector<3>(0.0); + debug_pos_ecef_m_ = math::Vector<3>(0.0); // degree if (degree_ > 360) { degree_ = 360; @@ -43,7 +45,7 @@ Geopotential::Geopotential(const int degree, const std::string file_path, const } } // Initialize GravityPotential - geopotential_ = GravityPotential(degree, c_, s_); + geopotential_ = gravity::GravityPotential(degree, c_, s_); } bool Geopotential::ReadCoefficientsEgm96(std::string file_name) { @@ -68,7 +70,7 @@ bool Geopotential::ReadCoefficientsEgm96(std::string file_name) { return true; } -void Geopotential::Update(const LocalEnvironment &local_environment, const Dynamics &dynamics) { +void Geopotential::Update(const environment::LocalEnvironment &local_environment, const dynamics::Dynamics &dynamics) { #ifdef DEBUG_GEOPOTENTIAL chrono::system_clock::time_point start, end; start = chrono::system_clock::now(); @@ -83,8 +85,8 @@ void Geopotential::Update(const LocalEnvironment &local_environment, const Dynam UNUSED(time_ms_); #endif - libra::Matrix<3, 3> trans_eci2ecef_ = local_environment.GetCelestialInformation().GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef(); - libra::Matrix<3, 3> trans_ecef2eci = trans_eci2ecef_.Transpose(); + math::Matrix<3, 3> trans_eci2ecef_ = local_environment.GetCelestialInformation().GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef(); + math::Matrix<3, 3> trans_ecef2eci = trans_eci2ecef_.Transpose(); acceleration_i_m_s2_ = trans_ecef2eci * acceleration_ecef_m_s2_; } @@ -92,10 +94,10 @@ std::string Geopotential::GetLogHeader() const { std::string str_tmp = ""; #ifdef DEBUG_GEOPOTENTIAL - str_tmp += WriteVector("geopotential_calculation_position_", "ecef", "m", 3); - str_tmp += WriteScalar("geopotential_calculation_time", "ms"); + str_tmp += logger::WriteVector("geopotential_calculation_position_", "ecef", "m", 3); + str_tmp += logger::WriteScalar("geopotential_calculation_time", "ms"); #endif - str_tmp += WriteVector("geopotential_acceleration", "ecef", "m/s2", 3); + str_tmp += logger::WriteVector("geopotential_acceleration", "ecef", "m/s2", 3); return str_tmp; } @@ -104,17 +106,17 @@ std::string Geopotential::GetLogValue() const { std::string str_tmp = ""; #ifdef DEBUG_GEOPOTENTIAL - str_tmp += WriteVector(debug_pos_ecef_m_, 15); - str_tmp += WriteScalar(time_ms_); + str_tmp += logger::WriteVector(debug_pos_ecef_m_, 15); + str_tmp += logger::WriteScalar(time_ms_); #endif - str_tmp += WriteVector(acceleration_ecef_m_s2_, 15); + str_tmp += logger::WriteVector(acceleration_ecef_m_s2_, 15); return str_tmp; } Geopotential InitGeopotential(const std::string initialize_file_path) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char *section = "GEOPOTENTIAL"; const int degree = conf.ReadInt(section, "degree"); @@ -125,4 +127,6 @@ Geopotential InitGeopotential(const std::string initialize_file_path) { geopotential_disturbance.is_log_enabled_ = conf.ReadEnable(section, INI_LOG_LABEL); return geopotential_disturbance; -} \ No newline at end of file +} + +} // namespace s2e::disturbances diff --git a/src/disturbances/geopotential.hpp b/src/disturbances/geopotential.hpp index abe79028d..13be1f20c 100644 --- a/src/disturbances/geopotential.hpp +++ b/src/disturbances/geopotential.hpp @@ -8,9 +8,12 @@ #include -#include "../library/gravity/gravity_potential.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/gravity/gravity_potential.hpp" +#include "../math_physics/math/vector.hpp" #include "disturbance.hpp" + +namespace s2e::disturbances { + /** * @class Geopotential * @brief Class to calculate the high-order earth gravity acceleration @@ -43,32 +46,32 @@ class Geopotential : public Disturbance { * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment &local_environment, const Dynamics &dynamics); + virtual void Update(const environment::LocalEnvironment &local_environment, const dynamics::Dynamics &dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; private: - GravityPotential geopotential_; - size_t degree_; //!< Maximum degree setting to calculate the geo-potential - std::vector> c_; //!< Cosine coefficients - std::vector> s_; //!< Sine coefficients - Vector<3> acceleration_ecef_m_s2_; //!< Calculated acceleration in the ECEF frame [m/s2] + s2e::gravity::GravityPotential geopotential_; + size_t degree_; //!< Maximum degree setting to calculate the geo-potential + std::vector> c_; //!< Cosine coefficients + std::vector> s_; //!< Sine coefficients + math::Vector<3> acceleration_ecef_m_s2_; //!< Calculated acceleration in the ECEF frame [m/s2] // debug - libra::Vector<3> debug_pos_ecef_m_; //!< Spacecraft position in ECEF frame [m] - double time_ms_ = 0.0; //!< Calculation time [ms] + math::Vector<3> debug_pos_ecef_m_; //!< Spacecraft position in ECEF frame [m] + double time_ms_ = 0.0; //!< Calculation time [ms] /** * @fn ReadCoefficientsEgm96 @@ -85,4 +88,6 @@ class Geopotential : public Disturbance { */ Geopotential InitGeopotential(const std::string initialize_file_path); +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_GEOPOTENTIAL_HPP_ diff --git a/src/disturbances/gravity_gradient.cpp b/src/disturbances/gravity_gradient.cpp index 2efbd14a1..bf1b0ff1a 100644 --- a/src/disturbances/gravity_gradient.cpp +++ b/src/disturbances/gravity_gradient.cpp @@ -7,9 +7,11 @@ #include #include -#include +#include -#include "../library/logger/log_utility.hpp" +#include "../logger/log_utility.hpp" + +namespace s2e::disturbances { GravityGradient::GravityGradient(const bool is_calculation_enabled) : GravityGradient(environment::earth_gravitational_constant_m3_s2, is_calculation_enabled) {} @@ -17,16 +19,15 @@ GravityGradient::GravityGradient(const bool is_calculation_enabled) GravityGradient::GravityGradient(const double gravity_constant_m3_s2, const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, true), gravity_constant_m3_s2_(gravity_constant_m3_s2) {} -void GravityGradient::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) { +void GravityGradient::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { // TODO: use structure information to get inertia tensor CalcTorque_b_Nm(local_environment.GetCelestialInformation().GetCenterBodyPositionFromSpacecraft_b_m(), dynamics.GetAttitude().GetInertiaTensor_b_kgm2()); } -libra::Vector<3> GravityGradient::CalcTorque_b_Nm(const libra::Vector<3> earth_position_from_sc_b_m, - const libra::Matrix<3, 3> inertia_tensor_b_kgm2) { +math::Vector<3> GravityGradient::CalcTorque_b_Nm(const math::Vector<3> earth_position_from_sc_b_m, const math::Matrix<3, 3> inertia_tensor_b_kgm2) { double r_norm_m = earth_position_from_sc_b_m.CalcNorm(); - libra::Vector<3> u_b = earth_position_from_sc_b_m; // TODO: make undestructive normalize function for Vector + math::Vector<3> u_b = earth_position_from_sc_b_m; // TODO: make undestructive normalize function for Vector u_b /= r_norm_m; double coeff = 3.0 * gravity_constant_m3_s2_ / pow(r_norm_m, 3.0); @@ -37,7 +38,7 @@ libra::Vector<3> GravityGradient::CalcTorque_b_Nm(const libra::Vector<3> earth_p std::string GravityGradient::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("gravity_gradient_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector("gravity_gradient_torque", "b", "Nm", 3); return str_tmp; } @@ -45,13 +46,13 @@ std::string GravityGradient::GetLogHeader() const { std::string GravityGradient::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(torque_b_Nm_); + str_tmp += logger::WriteVector(torque_b_Nm_); return str_tmp; } GravityGradient InitGravityGradient(const std::string initialize_file_path) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "GRAVITY_GRADIENT"; const bool is_calc_enable = conf.ReadEnable(section, INI_CALC_LABEL); @@ -62,7 +63,7 @@ GravityGradient InitGravityGradient(const std::string initialize_file_path) { } GravityGradient InitGravityGradient(const std::string initialize_file_path, const double gravity_constant_m3_s2) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "GRAVITY_GRADIENT"; const bool is_calc_enable = conf.ReadEnable(section, INI_CALC_LABEL); @@ -71,3 +72,5 @@ GravityGradient InitGravityGradient(const std::string initialize_file_path, cons return gg_disturbance; } + +} // namespace s2e::disturbances diff --git a/src/disturbances/gravity_gradient.hpp b/src/disturbances/gravity_gradient.hpp index 400027442..4a5f99e65 100644 --- a/src/disturbances/gravity_gradient.hpp +++ b/src/disturbances/gravity_gradient.hpp @@ -8,12 +8,14 @@ #include -#include "../library/logger/loggable.hpp" -#include "../library/math/matrix.hpp" -#include "../library/math/matrix_vector.hpp" -#include "../library/math/vector.hpp" +#include "../logger/loggable.hpp" +#include "../math_physics/math/matrix.hpp" +#include "../math_physics/math/matrix_vector.hpp" +#include "../math_physics/math/vector.hpp" #include "disturbance.hpp" +namespace s2e::disturbances { + /** * @class GravityGradient * @brief Class to calculate the gravity gradient torque @@ -39,19 +41,19 @@ class GravityGradient : public Disturbance { * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics); + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -65,7 +67,7 @@ class GravityGradient : public Disturbance { * @param [in] inertia_tensor_b_kgm2: Inertia Tensor at body frame [kg*m^2] * @return Calculated torque at body frame [Nm] */ - libra::Vector<3> CalcTorque_b_Nm(const libra::Vector<3> earth_position_from_sc_b_m, const libra::Matrix<3, 3> inertia_tensor_b_kgm2); + math::Vector<3> CalcTorque_b_Nm(const math::Vector<3> earth_position_from_sc_b_m, const math::Matrix<3, 3> inertia_tensor_b_kgm2); }; /** @@ -83,4 +85,6 @@ GravityGradient InitGravityGradient(const std::string initialize_file_path); */ GravityGradient InitGravityGradient(const std::string initialize_file_path, const double gravity_constant_m3_s2); +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_GRAVITY_GRADIENT_HPP_ diff --git a/src/disturbances/lunar_gravity_field.cpp b/src/disturbances/lunar_gravity_field.cpp index 26adc70ad..182b4472d 100644 --- a/src/disturbances/lunar_gravity_field.cpp +++ b/src/disturbances/lunar_gravity_field.cpp @@ -10,18 +10,20 @@ #include #include #include -#include +#include -#include "../library/logger/log_utility.hpp" -#include "../library/utilities/macros.hpp" +#include "../logger/log_utility.hpp" +#include "../utilities/macros.hpp" + +namespace s2e::disturbances { // #define DEBUG_LUNAR_GRAVITY_FIELD LunarGravityField::LunarGravityField(const int degree, const std::string file_path, const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, false), degree_(degree) { // Initialize - acceleration_mcmf_m_s2_ = libra::Vector<3>(0.0); - debug_pos_mcmf_m_ = libra::Vector<3>(0.0); + acceleration_mcmf_m_s2_ = math::Vector<3>(0.0); + debug_pos_mcmf_m_ = math::Vector<3>(0.0); debug_pos_mcmf_m_[0] = 2000000; debug_pos_mcmf_m_[1] = 2000000; debug_pos_mcmf_m_[2] = 2000000; @@ -46,7 +48,7 @@ LunarGravityField::LunarGravityField(const int degree, const std::string file_pa } } // Initialize GravityPotential - lunar_potential_ = GravityPotential(degree, c_, s_, gravity_constants_km3_s2_ * 1e9, reference_radius_km_ * 1e3); + lunar_potential_ = gravity::GravityPotential(degree, c_, s_, gravity_constants_km3_s2_ * 1e9, reference_radius_km_ * 1e3); } bool LunarGravityField::ReadCoefficientsGrgm1200a(std::string file_name) { @@ -86,12 +88,12 @@ bool LunarGravityField::ReadCoefficientsGrgm1200a(std::string file_name) { return true; } -void LunarGravityField::Update(const LocalEnvironment &local_environment, const Dynamics &dynamics) { - const CelestialInformation global_celestial_information = local_environment.GetCelestialInformation().GetGlobalInformation(); - libra::Matrix<3, 3> dcm_mci2mcmf_ = global_celestial_information.GetMoonRotation().GetDcmJ2000ToMcmf(); +void LunarGravityField::Update(const environment::LocalEnvironment &local_environment, const dynamics::Dynamics &dynamics) { + const environment::CelestialInformation global_celestial_information = local_environment.GetCelestialInformation().GetGlobalInformation(); + math::Matrix<3, 3> dcm_mci2mcmf_ = global_celestial_information.GetMoonRotation().GetDcmJ2000ToMcmf(); - libra::Vector<3> spacecraft_position_mci_m = dynamics.GetOrbit().GetPosition_i_m(); - libra::Vector<3> spacecraft_position_mcmf_m = dcm_mci2mcmf_ * spacecraft_position_mci_m; + math::Vector<3> spacecraft_position_mci_m = dynamics.GetOrbit().GetPosition_i_m(); + math::Vector<3> spacecraft_position_mcmf_m = dcm_mci2mcmf_ * spacecraft_position_mci_m; #ifdef DEBUG_LUNAR_GRAVITY_FIELD std::chrono::system_clock::time_point start, end; @@ -107,7 +109,7 @@ void LunarGravityField::Update(const LocalEnvironment &local_environment, const UNUSED(time_ms_); #endif - libra::Matrix<3, 3> dcm_mcmf2i = dcm_mci2mcmf_.Transpose(); + math::Matrix<3, 3> dcm_mcmf2i = dcm_mci2mcmf_.Transpose(); acceleration_i_m_s2_ = dcm_mcmf2i * acceleration_mcmf_m_s2_; } @@ -115,10 +117,10 @@ std::string LunarGravityField::GetLogHeader() const { std::string str_tmp = ""; #ifdef DEBUG_LUNAR_GRAVITY_FIELD - str_tmp += WriteVector("lunar_gravity_calculation_position", "mcmf", "m", 3); - str_tmp += WriteScalar("lunar_gravity_calculation_time", "ms"); + str_tmp += logger::WriteVector("lunar_gravity_calculation_position", "mcmf", "m", 3); + str_tmp += logger::WriteScalar("lunar_gravity_calculation_time", "ms"); #endif - str_tmp += WriteVector("lunar_gravity_acceleration", "mcmf", "m/s2", 3); + str_tmp += logger::WriteVector("lunar_gravity_acceleration", "mcmf", "m/s2", 3); return str_tmp; } @@ -127,17 +129,17 @@ std::string LunarGravityField::GetLogValue() const { std::string str_tmp = ""; #ifdef DEBUG_LUNAR_GRAVITY_FIELD - str_tmp += WriteVector(debug_pos_mcmf_m_, 15); - str_tmp += WriteScalar(time_ms_); + str_tmp += logger::WriteVector(debug_pos_mcmf_m_, 15); + str_tmp += logger::WriteScalar(time_ms_); #endif - str_tmp += WriteVector(acceleration_mcmf_m_s2_, 15); + str_tmp += logger::WriteVector(acceleration_mcmf_m_s2_, 15); return str_tmp; } LunarGravityField InitLunarGravityField(const std::string initialize_file_path) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char *section = "LUNAR_GRAVITY_FIELD"; const int degree = conf.ReadInt(section, "degree"); @@ -150,3 +152,5 @@ LunarGravityField InitLunarGravityField(const std::string initialize_file_path) return lunar_gravity_field; } + +} // namespace s2e::disturbances diff --git a/src/disturbances/lunar_gravity_field.hpp b/src/disturbances/lunar_gravity_field.hpp index 13f1b9f22..04727d670 100644 --- a/src/disturbances/lunar_gravity_field.hpp +++ b/src/disturbances/lunar_gravity_field.hpp @@ -8,9 +8,12 @@ #include -#include "../library/gravity/gravity_potential.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/gravity/gravity_potential.hpp" +#include "../math_physics/math/vector.hpp" #include "disturbance.hpp" + +namespace s2e::disturbances { + /** * @class LunarGravityField * @brief Class to calculate the high-order earth gravity acceleration @@ -45,34 +48,34 @@ class LunarGravityField : public Disturbance { * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment &local_environment, const Dynamics &dynamics); + virtual void Update(const environment::LocalEnvironment &local_environment, const dynamics::Dynamics &dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; private: - GravityPotential lunar_potential_; + gravity::GravityPotential lunar_potential_; double reference_radius_km_; double gravity_constants_km3_s2_; - size_t degree_; //!< Maximum degree setting to calculate the geo-potential - std::vector> c_; //!< Cosine coefficients - std::vector> s_; //!< Sine coefficients - Vector<3> acceleration_mcmf_m_s2_; //!< Calculated acceleration in the MCMF(Moon Centered Moon Fixed) frame [m/s2] + size_t degree_; //!< Maximum degree setting to calculate the geo-potential + std::vector> c_; //!< Cosine coefficients + std::vector> s_; //!< Sine coefficients + math::Vector<3> acceleration_mcmf_m_s2_; //!< Calculated acceleration in the MCMF(Moon Centered Moon Fixed) frame [m/s2] // debug - libra::Vector<3> debug_pos_mcmf_m_; //!< Spacecraft position in MCMF frame [m] - double time_ms_ = 0.0; //!< Calculation time [ms] + math::Vector<3> debug_pos_mcmf_m_; //!< Spacecraft position in MCMF frame [m] + double time_ms_ = 0.0; //!< Calculation time [ms] /** * @fn ReadCoefficientsGrgm1200a @@ -89,4 +92,6 @@ class LunarGravityField : public Disturbance { */ LunarGravityField InitLunarGravityField(const std::string initialize_file_path); +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_LUNAR_GRAVITY_FIELD_HPP_ diff --git a/src/disturbances/magnetic_disturbance.cpp b/src/disturbances/magnetic_disturbance.cpp index 8e9fe05b3..ea0029218 100644 --- a/src/disturbances/magnetic_disturbance.cpp +++ b/src/disturbances/magnetic_disturbance.cpp @@ -5,36 +5,39 @@ #include "magnetic_disturbance.hpp" -#include -#include +#include +#include -#include "../library/logger/log_utility.hpp" -#include "../library/randomization/global_randomization.hpp" -#include "../library/randomization/normal_randomization.hpp" -#include "../library/randomization/random_walk.hpp" +#include "../logger/log_utility.hpp" +#include "../math_physics/randomization/global_randomization.hpp" +#include "../math_physics/randomization/normal_randomization.hpp" +#include "../math_physics/randomization/random_walk.hpp" -MagneticDisturbance::MagneticDisturbance(const ResidualMagneticMoment& rmm_params, const bool is_calculation_enabled) +namespace s2e::disturbances { + +MagneticDisturbance::MagneticDisturbance(const spacecraft::ResidualMagneticMoment& rmm_params, const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, true), residual_magnetic_moment_(rmm_params) { rmm_b_Am2_ = residual_magnetic_moment_.GetConstantValue_b_Am2(); } -Vector<3> MagneticDisturbance::CalcTorque_b_Nm(const Vector<3>& magnetic_field_b_nT) { +math::Vector<3> MagneticDisturbance::CalcTorque_b_Nm(const math::Vector<3>& magnetic_field_b_nT) { CalcRMM(); - torque_b_Nm_ = kMagUnit_ * OuterProduct(rmm_b_Am2_, magnetic_field_b_nT); + torque_b_Nm_ = kMagUnit_ * math::OuterProduct(rmm_b_Am2_, magnetic_field_b_nT); return torque_b_Nm_; } -void MagneticDisturbance::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) { +void MagneticDisturbance::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { UNUSED(dynamics); CalcTorque_b_Nm(local_environment.GetGeomagneticField().GetGeomagneticField_b_nT()); } void MagneticDisturbance::CalcRMM() { - static libra::Vector<3> random_walk_std_dev(residual_magnetic_moment_.GetRandomWalkStandardDeviation_Am2()); - static libra::Vector<3> random_walk_limit(residual_magnetic_moment_.GetRandomWalkLimit_Am2()); - static RandomWalk<3> random_walk(0.1, random_walk_std_dev, random_walk_limit); // [FIXME] step width is constant - static libra::NormalRand normal_random(0.0, residual_magnetic_moment_.GetRandomNoiseStandardDeviation_Am2(), global_randomization.MakeSeed()); + static math::Vector<3> random_walk_std_dev(residual_magnetic_moment_.GetRandomWalkStandardDeviation_Am2()); + static math::Vector<3> random_walk_limit(residual_magnetic_moment_.GetRandomWalkLimit_Am2()); + static randomization::RandomWalk<3> random_walk(0.1, random_walk_std_dev, random_walk_limit); // [FIXME] step width is constant + static randomization::NormalRand normal_random(0.0, residual_magnetic_moment_.GetRandomNoiseStandardDeviation_Am2(), + randomization::global_randomization.MakeSeed()); rmm_b_Am2_ = residual_magnetic_moment_.GetConstantValue_b_Am2(); for (int i = 0; i < 3; ++i) { @@ -46,8 +49,8 @@ void MagneticDisturbance::CalcRMM() { std::string MagneticDisturbance::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("spacecraft_magnetic_moment", "b", "Am2", 3); - str_tmp += WriteVector("magnetic_disturbance_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector("spacecraft_magnetic_moment", "b", "Am2", 3); + str_tmp += logger::WriteVector("magnetic_disturbance_torque", "b", "Nm", 3); return str_tmp; } @@ -55,14 +58,14 @@ std::string MagneticDisturbance::GetLogHeader() const { std::string MagneticDisturbance::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(rmm_b_Am2_); - str_tmp += WriteVector(torque_b_Nm_); + str_tmp += logger::WriteVector(rmm_b_Am2_); + str_tmp += logger::WriteVector(torque_b_Nm_); return str_tmp; } -MagneticDisturbance InitMagneticDisturbance(const std::string initialize_file_path, const ResidualMagneticMoment& rmm_params) { - auto conf = IniAccess(initialize_file_path); +MagneticDisturbance InitMagneticDisturbance(const std::string initialize_file_path, const spacecraft::ResidualMagneticMoment& rmm_params) { + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "MAGNETIC_DISTURBANCE"; const bool is_calc_enable = conf.ReadEnable(section, INI_CALC_LABEL); @@ -71,3 +74,5 @@ MagneticDisturbance InitMagneticDisturbance(const std::string initialize_file_pa return mag_disturbance; } + +} // namespace s2e::disturbances diff --git a/src/disturbances/magnetic_disturbance.hpp b/src/disturbances/magnetic_disturbance.hpp index c60bf8a40..f51b3924b 100644 --- a/src/disturbances/magnetic_disturbance.hpp +++ b/src/disturbances/magnetic_disturbance.hpp @@ -8,11 +8,13 @@ #include -#include "../library/logger/loggable.hpp" -#include "../library/math/vector.hpp" +#include "../logger/loggable.hpp" +#include "../math_physics/math/vector.hpp" #include "../simulation/spacecraft/structure/residual_magnetic_moment.hpp" #include "disturbance.hpp" +namespace s2e::disturbances { + /** * @class MagneticDisturbance * @brief Class to calculate the magnetic disturbance torque @@ -25,33 +27,33 @@ class MagneticDisturbance : public Disturbance { * @param [in] rmm_parameters: RMM parameters of the spacecraft * @param [in] is_calculation_enabled: Calculation flag */ - MagneticDisturbance(const ResidualMagneticMoment& rmm_parameters, const bool is_calculation_enabled = true); + MagneticDisturbance(const spacecraft::ResidualMagneticMoment& rmm_parameters, const bool is_calculation_enabled = true); /** * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics); + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; private: const double kMagUnit_ = 1.0e-9; //!< Constant value to change the unit [nT] -> [T] - libra::Vector<3> rmm_b_Am2_; //!< True RMM of the spacecraft in the body frame [Am2] - const ResidualMagneticMoment& residual_magnetic_moment_; //!< RMM parameters + math::Vector<3> rmm_b_Am2_; //!< True RMM of the spacecraft in the body frame [Am2] + const spacecraft::ResidualMagneticMoment& residual_magnetic_moment_; //!< RMM parameters /** * @fn CalcRMM @@ -64,7 +66,7 @@ class MagneticDisturbance : public Disturbance { * @param [in] magnetic_field_b_nT: Magnetic field vector at the body frame [nT] * @return Calculated disturbance torque in body frame [Nm] */ - libra::Vector<3> CalcTorque_b_Nm(const libra::Vector<3>& magnetic_field_b_nT); + math::Vector<3> CalcTorque_b_Nm(const math::Vector<3>& magnetic_field_b_nT); }; /** @@ -73,6 +75,8 @@ class MagneticDisturbance : public Disturbance { * @param [in] initialize_file_path: Initialize file path * @param [in] rmm_params: RMM parameters */ -MagneticDisturbance InitMagneticDisturbance(const std::string initialize_file_path, const ResidualMagneticMoment& rmm_params); +MagneticDisturbance InitMagneticDisturbance(const std::string initialize_file_path, const spacecraft::ResidualMagneticMoment& rmm_params); + +} // namespace s2e::disturbances #endif // S2E_DISTURBANCES_MAGNETIC_DISTURBANCE_HPP_ diff --git a/src/disturbances/solar_radiation_pressure_disturbance.cpp b/src/disturbances/solar_radiation_pressure_disturbance.cpp index 711a52cec..369048683 100644 --- a/src/disturbances/solar_radiation_pressure_disturbance.cpp +++ b/src/disturbances/solar_radiation_pressure_disturbance.cpp @@ -6,22 +6,24 @@ #include "solar_radiation_pressure_disturbance.hpp" #include -#include +#include -#include "../library/logger/log_utility.hpp" +#include "../logger/log_utility.hpp" -SolarRadiationPressureDisturbance::SolarRadiationPressureDisturbance(const std::vector& surfaces, - const libra::Vector<3>& center_of_gravity_b_m, const bool is_calculation_enabled) +namespace s2e::disturbances { + +SolarRadiationPressureDisturbance::SolarRadiationPressureDisturbance(const std::vector& surfaces, + const math::Vector<3>& center_of_gravity_b_m, const bool is_calculation_enabled) : SurfaceForce(surfaces, center_of_gravity_b_m, is_calculation_enabled) {} -void SolarRadiationPressureDisturbance::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) { +void SolarRadiationPressureDisturbance::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { UNUSED(dynamics); - libra::Vector<3> sun_position_from_sc_b_m = local_environment.GetCelestialInformation().GetPositionFromSpacecraft_b_m("SUN"); + math::Vector<3> sun_position_from_sc_b_m = local_environment.GetCelestialInformation().GetPositionFromSpacecraft_b_m("SUN"); CalcTorqueForce(sun_position_from_sc_b_m, local_environment.GetSolarRadiationPressure().GetPressure_N_m2()); } -void SolarRadiationPressureDisturbance::CalcCoefficients(const libra::Vector<3>& input_direction_b, const double item) { +void SolarRadiationPressureDisturbance::CalcCoefficients(const math::Vector<3>& input_direction_b, const double item) { UNUSED(input_direction_b); for (size_t i = 0; i < surfaces_.size(); i++) { // Calculate for each surface @@ -37,8 +39,8 @@ void SolarRadiationPressureDisturbance::CalcCoefficients(const libra::Vector<3>& std::string SolarRadiationPressureDisturbance::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("srp_torque", "b", "Nm", 3); - str_tmp += WriteVector("srp_force", "b", "N", 3); + str_tmp += logger::WriteVector("srp_torque", "b", "Nm", 3); + str_tmp += logger::WriteVector("srp_force", "b", "N", 3); return str_tmp; } @@ -46,15 +48,16 @@ std::string SolarRadiationPressureDisturbance::GetLogHeader() const { std::string SolarRadiationPressureDisturbance::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(torque_b_Nm_); - str_tmp += WriteVector(force_b_N_); + str_tmp += logger::WriteVector(torque_b_Nm_); + str_tmp += logger::WriteVector(force_b_N_); return str_tmp; } -SolarRadiationPressureDisturbance InitSolarRadiationPressureDisturbance(const std::string initialize_file_path, const std::vector& surfaces, - const Vector<3>& center_of_gravity_b_m) { - auto conf = IniAccess(initialize_file_path); +SolarRadiationPressureDisturbance InitSolarRadiationPressureDisturbance(const std::string initialize_file_path, + const std::vector& surfaces, + const math::Vector<3>& center_of_gravity_b_m) { + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "SOLAR_RADIATION_PRESSURE_DISTURBANCE"; const bool is_calc_enable = conf.ReadEnable(section, INI_CALC_LABEL); @@ -65,3 +68,5 @@ SolarRadiationPressureDisturbance InitSolarRadiationPressureDisturbance(const st return srp_disturbance; } + +} // namespace s2e::disturbances diff --git a/src/disturbances/solar_radiation_pressure_disturbance.hpp b/src/disturbances/solar_radiation_pressure_disturbance.hpp index 7db45f45a..8f2d22f82 100644 --- a/src/disturbances/solar_radiation_pressure_disturbance.hpp +++ b/src/disturbances/solar_radiation_pressure_disturbance.hpp @@ -6,12 +6,14 @@ #ifndef S2E_DISTURBANCES_SOLAR_RADIATION_PRESSURE_DISTURBANCE_HPP_ #define S2E_DISTURBANCES_SOLAR_RADIATION_PRESSURE_DISTURBANCE_HPP_ -#include +#include -#include "../library/logger/loggable.hpp" -#include "../library/math/vector.hpp" +#include "../logger/loggable.hpp" +#include "../math_physics/math/vector.hpp" #include "surface_force.hpp" +namespace s2e::disturbances { + /** * @class SolarRadiationPressureDisturbance * @brief Class to calculate the solar radiation pressure disturbance force and torque @@ -25,26 +27,26 @@ class SolarRadiationPressureDisturbance : public SurfaceForce { * @param [in] center_of_gravity_b_m: Center of gravity position at the body frame [m] * @param [in] is_calculation_enabled: Calculation flag */ - SolarRadiationPressureDisturbance(const std::vector& surfaces, const libra::Vector<3>& center_of_gravity_b_m, + SolarRadiationPressureDisturbance(const std::vector& surfaces, const math::Vector<3>& center_of_gravity_b_m, const bool is_calculation_enabled = true); /** * @fn Update * @brief Override Updates function of SimpleDisturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics); + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -55,7 +57,7 @@ class SolarRadiationPressureDisturbance : public SurfaceForce { * @param [in] input_direction_b: Direction vector of the sun at the body frame * @param [in] item: Solar pressure [N/m^2] */ - void CalcCoefficients(const libra::Vector<3>& input_direction_b, const double item); + void CalcCoefficients(const math::Vector<3>& input_direction_b, const double item); }; /** @@ -65,7 +67,10 @@ class SolarRadiationPressureDisturbance : public SurfaceForce { * @param [in] surfaces: surface information of the spacecraft * @param [in] center_of_gravity_b_m: Center of gravity position vector at body frame [m] */ -SolarRadiationPressureDisturbance InitSolarRadiationPressureDisturbance(const std::string initialize_file_path, const std::vector& surfaces, - const Vector<3>& center_of_gravity_b_m); +SolarRadiationPressureDisturbance InitSolarRadiationPressureDisturbance(const std::string initialize_file_path, + const std::vector& surfaces, + const math::Vector<3>& center_of_gravity_b_m); + +} // namespace s2e::disturbances #endif // S2E_DISTURBANCES_SOLAR_RADIATION_PRESSURE_DISTURBANCE_HPP_ diff --git a/src/disturbances/surface_force.cpp b/src/disturbances/surface_force.cpp index e6dce0716..391a78274 100644 --- a/src/disturbances/surface_force.cpp +++ b/src/disturbances/surface_force.cpp @@ -5,9 +5,12 @@ #include "surface_force.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/math/vector.hpp" -SurfaceForce::SurfaceForce(const std::vector& surfaces, const libra::Vector<3>& center_of_gravity_b_m, const bool is_calculation_enabled) +namespace s2e::disturbances { + +SurfaceForce::SurfaceForce(const std::vector& surfaces, const math::Vector<3>& center_of_gravity_b_m, + const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, true), surfaces_(surfaces), center_of_gravity_b_m_(center_of_gravity_b_m) { // Initialize vectors size_t num = surfaces_.size(); @@ -17,23 +20,23 @@ SurfaceForce::SurfaceForce(const std::vector& surfaces, const libra::Ve sin_theta_.assign(num, 0.0); } -libra::Vector<3> SurfaceForce::CalcTorqueForce(libra::Vector<3>& input_direction_b, double item) { +math::Vector<3> SurfaceForce::CalcTorqueForce(math::Vector<3>& input_direction_b, double item) { CalcTheta(input_direction_b); CalcCoefficients(input_direction_b, item); - libra::Vector<3> force_b_N(0.0); - libra::Vector<3> torque_b_Nm(0.0); - libra::Vector<3> input_b_normal = input_direction_b.CalcNormalizedVector(); + math::Vector<3> force_b_N(0.0); + math::Vector<3> torque_b_Nm(0.0); + math::Vector<3> input_b_normal = input_direction_b.CalcNormalizedVector(); for (size_t i = 0; i < surfaces_.size(); i++) { if (cos_theta_[i] > 0.0) { // if the surface faces to the disturbance source (sun or air) // calc direction of in-plane force - libra::Vector<3> normal = surfaces_[i].GetNormal_b(); - libra::Vector<3> ncu = OuterProduct(input_b_normal, normal); - libra::Vector<3> ncu_normalized = ncu.CalcNormalizedVector(); - libra::Vector<3> in_plane_force_direction = OuterProduct(ncu_normalized, normal); + math::Vector<3> normal = surfaces_[i].GetNormal_b(); + math::Vector<3> ncu = OuterProduct(input_b_normal, normal); + math::Vector<3> ncu_normalized = ncu.CalcNormalizedVector(); + math::Vector<3> in_plane_force_direction = OuterProduct(ncu_normalized, normal); // calc force - libra::Vector<3> force_per_surface_b_N = -1.0 * normal_coefficients_[i] * normal + tangential_coefficients_[i] * in_plane_force_direction; + math::Vector<3> force_per_surface_b_N = -1.0 * normal_coefficients_[i] * normal + tangential_coefficients_[i] * in_plane_force_direction; force_b_N += force_per_surface_b_N; // calc torque torque_b_Nm += OuterProduct(surfaces_[i].GetPosition_b_m() - center_of_gravity_b_m_, force_per_surface_b_N); @@ -44,11 +47,13 @@ libra::Vector<3> SurfaceForce::CalcTorqueForce(libra::Vector<3>& input_direction return torque_b_Nm_; } -void SurfaceForce::CalcTheta(libra::Vector<3>& input_direction_b) { - libra::Vector<3> input_b_normal = input_direction_b.CalcNormalizedVector(); +void SurfaceForce::CalcTheta(math::Vector<3>& input_direction_b) { + math::Vector<3> input_b_normal = input_direction_b.CalcNormalizedVector(); for (size_t i = 0; i < surfaces_.size(); i++) { cos_theta_[i] = InnerProduct(surfaces_[i].GetNormal_b(), input_b_normal); sin_theta_[i] = sqrt(1.0 - cos_theta_[i] * cos_theta_[i]); } } + +} // namespace s2e::disturbances diff --git a/src/disturbances/surface_force.hpp b/src/disturbances/surface_force.hpp index ad82c9fba..36af265a5 100644 --- a/src/disturbances/surface_force.hpp +++ b/src/disturbances/surface_force.hpp @@ -10,11 +10,13 @@ #include -#include "../library/math/quaternion.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/math/quaternion.hpp" +#include "../math_physics/math/vector.hpp" #include "../simulation/spacecraft/structure/surface.hpp" #include "disturbance.hpp" +namespace s2e::disturbances { + /** * @class ThirdBodyGravity * @brief Class to calculate third body gravity disturbance @@ -28,7 +30,8 @@ class SurfaceForce : public Disturbance { * @param [in] center_of_gravity_b_m: Center of gravity position at the body frame [m] * @param [in] is_calculation_enabled: Calculation flag */ - SurfaceForce(const std::vector& surfaces, const libra::Vector<3>& center_of_gravity_b_m, const bool is_calculation_enabled = true); + SurfaceForce(const std::vector& surfaces, const math::Vector<3>& center_of_gravity_b_m, + const bool is_calculation_enabled = true); /** * @fn ~SurfaceForce * @brief Destructor @@ -37,8 +40,8 @@ class SurfaceForce : public Disturbance { protected: // Spacecraft Structure parameters - const std::vector& surfaces_; //!< List of surfaces - const libra::Vector<3>& center_of_gravity_b_m_; //!< Position vector of the center of mass_kg at body frame [m] + const std::vector& surfaces_; //!< List of surfaces + const math::Vector<3>& center_of_gravity_b_m_; //!< Position vector of the center of mass_kg at body frame [m] // Internal calculated variables std::vector normal_coefficients_; //!< coefficients for out-plane force for each surface @@ -54,13 +57,13 @@ class SurfaceForce : public Disturbance { * @param [in] item: Parameter which decide the magnitude of the disturbances (e.g., Solar flux, air density) * @return Calculated disturbance torque in body frame [Nm] */ - libra::Vector<3> CalcTorqueForce(libra::Vector<3>& input_direction_b, double item); + math::Vector<3> CalcTorqueForce(math::Vector<3>& input_direction_b, double item); /** * @fn CalcTheta * @brief Calculate cosX and sinX * @param [in] input_direction_b: Direction of disturbance source at the body frame */ - void CalcTheta(libra::Vector<3>& input_direction_b); + void CalcTheta(math::Vector<3>& input_direction_b); /** * @fn CalcCoefficients @@ -68,7 +71,9 @@ class SurfaceForce : public Disturbance { * @param [in] input_direction_b: Direction of disturbance source at the body frame * @param [in] item: Parameter which decide the magnitude of the disturbances (e.g., Solar flux, air density) */ - virtual void CalcCoefficients(const libra::Vector<3>& input_direction_b, const double item) = 0; + virtual void CalcCoefficients(const math::Vector<3>& input_direction_b, const double item) = 0; }; +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_SURFACE_FORCE_HPP_ diff --git a/src/disturbances/third_body_gravity.cpp b/src/disturbances/third_body_gravity.cpp index b7ed2ed63..9e2d6881c 100644 --- a/src/disturbances/third_body_gravity.cpp +++ b/src/disturbances/third_body_gravity.cpp @@ -5,22 +5,24 @@ #include "third_body_gravity.hpp" -#include +#include + +namespace s2e::disturbances { ThirdBodyGravity::ThirdBodyGravity(std::set third_body_list, const bool is_calculation_enabled) : Disturbance(is_calculation_enabled, false), third_body_list_(third_body_list) { - acceleration_i_m_s2_ = libra::Vector<3>(0.0); + acceleration_i_m_s2_ = math::Vector<3>(0.0); } ThirdBodyGravity::~ThirdBodyGravity() {} -void ThirdBodyGravity::Update(const LocalEnvironment& local_environment, const Dynamics& dynamics) { - acceleration_i_m_s2_ = libra::Vector<3>(0.0); // initialize +void ThirdBodyGravity::Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics) { + acceleration_i_m_s2_ = math::Vector<3>(0.0); // initialize - libra::Vector<3> sc_position_i_m = dynamics.GetOrbit().GetPosition_i_m(); + math::Vector<3> sc_position_i_m = dynamics.GetOrbit().GetPosition_i_m(); for (auto third_body : third_body_list_) { - libra::Vector<3> third_body_position_from_sc_i_m = local_environment.GetCelestialInformation().GetPositionFromSpacecraft_i_m(third_body.c_str()); - libra::Vector<3> third_body_pos_i_m = sc_position_i_m + third_body_position_from_sc_i_m; + math::Vector<3> third_body_position_from_sc_i_m = local_environment.GetCelestialInformation().GetPositionFromSpacecraft_i_m(third_body.c_str()); + math::Vector<3> third_body_pos_i_m = sc_position_i_m + third_body_position_from_sc_i_m; double gravity_constant = local_environment.GetCelestialInformation().GetGlobalInformation().GetGravityConstant_m3_s2(third_body.c_str()); third_body_acceleration_i_m_s2_ = CalcAcceleration_i_m_s2(third_body_pos_i_m, third_body_position_from_sc_i_m, gravity_constant); @@ -28,8 +30,8 @@ void ThirdBodyGravity::Update(const LocalEnvironment& local_environment, const D } } -libra::Vector<3> ThirdBodyGravity::CalcAcceleration_i_m_s2(const libra::Vector<3> s, const libra::Vector<3> sr, const double gravity_constant_m_s2) { - libra::Vector<3> acceleration_i_m_s2; +math::Vector<3> ThirdBodyGravity::CalcAcceleration_i_m_s2(const math::Vector<3> s, const math::Vector<3> sr, const double gravity_constant_m_s2) { + math::Vector<3> acceleration_i_m_s2; double s_norm = s.CalcNorm(); double s_norm3 = s_norm * s_norm * s_norm; @@ -44,21 +46,21 @@ libra::Vector<3> ThirdBodyGravity::CalcAcceleration_i_m_s2(const libra::Vector<3 std::string ThirdBodyGravity::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("third_body_acceleration", "i", "m/s2", 3); + str_tmp += logger::WriteVector("third_body_acceleration", "i", "m/s2", 3); return str_tmp; } std::string ThirdBodyGravity::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(acceleration_i_m_s2_); + str_tmp += logger::WriteVector(acceleration_i_m_s2_); return str_tmp; } ThirdBodyGravity InitThirdBodyGravity(const std::string initialize_file_path, const std::string ini_path_celes) { // Generate a list of bodies to be calculated in "CelesInfo" - auto conf_celes = IniAccess(ini_path_celes); + auto conf_celes = setting_file_reader::IniAccess(ini_path_celes); const char* section_celes = "CELESTIAL_INFORMATION"; const int num_of_selected_body = conf_celes.ReadInt(section_celes, "number_of_selected_body"); const std::string center_object = conf_celes.ReadString(section_celes, "center_object"); @@ -70,7 +72,7 @@ ThirdBodyGravity InitThirdBodyGravity(const std::string initialize_file_path, co } // Generate a list of bodies to be calculated in "ThirdBodyGravity" from the list of bodies of "CelesInfo" - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "THIRD_BODY_GRAVITY"; const int num_of_third_body = conf.ReadInt(section, "number_of_third_body"); @@ -99,3 +101,5 @@ ThirdBodyGravity InitThirdBodyGravity(const std::string initialize_file_path, co return third_body_disturbance; } + +} // namespace s2e::disturbances diff --git a/src/disturbances/third_body_gravity.hpp b/src/disturbances/third_body_gravity.hpp index b244660ac..bb45bec30 100644 --- a/src/disturbances/third_body_gravity.hpp +++ b/src/disturbances/third_body_gravity.hpp @@ -10,10 +10,12 @@ #include #include -#include "../library/logger/loggable.hpp" -#include "../library/math/vector.hpp" +#include "../logger/loggable.hpp" +#include "../math_physics/math/vector.hpp" #include "disturbance.hpp" +namespace s2e::disturbances { + /** * @class ThirdBodyGravity * @brief Class to calculate third body gravity disturbance @@ -37,15 +39,15 @@ class ThirdBodyGravity : public Disturbance { * @fn Update * @brief Update third body disturbance * @param [in] local_environment: Local environment information - * @param [in] dynamics: Dynamics information + * @param [in] dynamics: dynamics::Dynamics information */ - virtual void Update(const LocalEnvironment& local_environment, const Dynamics& dynamics); + virtual void Update(const environment::LocalEnvironment& local_environment, const dynamics::Dynamics& dynamics); private: - std::set third_body_list_; //!< List of celestial bodies to calculate the third body disturbances - libra::Vector<3> third_body_acceleration_i_m_s2_{0.0}; //!< Calculated third body disturbance acceleration in the inertial frame [m/s2] + std::set third_body_list_; //!< List of celestial bodies to calculate the third body disturbances + math::Vector<3> third_body_acceleration_i_m_s2_{0.0}; //!< Calculated third body disturbance acceleration in the inertial frame [m/s2] - // Override classes for ILoggable + // Override classes for logger::ILoggable /** * @fn GetLogHeader * @brief Override function of GetLogHeader @@ -65,7 +67,7 @@ class ThirdBodyGravity : public Disturbance { * @param [in] GM: The gravitational constants of the third celestial body [m3/s2] * @return Third body disturbance acceleration in the inertial frame in unit [m/s2] */ - libra::Vector<3> CalcAcceleration_i_m_s2(const libra::Vector<3> s, const libra::Vector<3> sr, const double gravity_constant_m_s2); + math::Vector<3> CalcAcceleration_i_m_s2(const math::Vector<3> s, const math::Vector<3> sr, const double gravity_constant_m_s2); }; /** @@ -76,4 +78,6 @@ class ThirdBodyGravity : public Disturbance { */ ThirdBodyGravity InitThirdBodyGravity(const std::string initialize_file_path, const std::string ini_path_celes); +} // namespace s2e::disturbances + #endif // S2E_DISTURBANCES_THIRD_BODY_GRAVITY_HPP_ diff --git a/src/dynamics/CMakeLists.txt b/src/dynamics/CMakeLists.txt index bc95612b4..72f038590 100644 --- a/src/dynamics/CMakeLists.txt +++ b/src/dynamics/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(${PROJECT_NAME} STATIC orbit/relative_orbit.cpp orbit/kepler_orbit_propagation.cpp orbit/encke_orbit_propagation.cpp + orbit/time_series_file_orbit_propagation.cpp orbit/initialize_orbit.cpp thermal/node.cpp @@ -18,6 +19,7 @@ add_library(${PROJECT_NAME} STATIC attitude/attitude.cpp attitude/attitude_rk4.cpp + attitude/attitude_with_cantilever_vibration.cpp attitude/controlled_attitude.cpp attitude/initialize_attitude.cpp diff --git a/src/dynamics/attitude/attitude.cpp b/src/dynamics/attitude/attitude.cpp index b96e0f6bd..86a6b2443 100644 --- a/src/dynamics/attitude/attitude.cpp +++ b/src/dynamics/attitude/attitude.cpp @@ -4,17 +4,19 @@ */ #include "attitude.hpp" -#include +#include -Attitude::Attitude(const libra::Matrix<3, 3>& inertia_tensor_kgm2, const std::string& simulation_object_name) +namespace s2e::dynamics::attitude { + +Attitude::Attitude(const math::Matrix<3, 3>& inertia_tensor_kgm2, const std::string& simulation_object_name) : SimulationObject(simulation_object_name), inertia_tensor_kgm2_(inertia_tensor_kgm2) { - angular_velocity_b_rad_s_ = libra::Vector<3>(0.0); - quaternion_i2b_ = libra::Quaternion(0.0, 0.0, 0.0, 1.0); - torque_b_Nm_ = libra::Vector<3>(0.0); - angular_momentum_spacecraft_b_Nms_ = libra::Vector<3>(0.0); - angular_momentum_reaction_wheel_b_Nms_ = libra::Vector<3>(0.0); - angular_momentum_total_b_Nms_ = libra::Vector<3>(0.0); - angular_momentum_total_i_Nms_ = libra::Vector<3>(0.0); + angular_velocity_b_rad_s_ = math::Vector<3>(0.0); + quaternion_i2b_ = math::Quaternion(0.0, 0.0, 0.0, 1.0); + torque_b_Nm_ = math::Vector<3>(0.0); + angular_momentum_spacecraft_b_Nms_ = math::Vector<3>(0.0); + angular_momentum_reaction_wheel_b_Nms_ = math::Vector<3>(0.0); + angular_momentum_total_b_Nms_ = math::Vector<3>(0.0); + angular_momentum_total_i_Nms_ = math::Vector<3>(0.0); angular_momentum_total_Nms_ = 0.0; kinetic_energy_J_ = 0.0; } @@ -22,11 +24,11 @@ Attitude::Attitude(const libra::Matrix<3, 3>& inertia_tensor_kgm2, const std::st std::string Attitude::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("spacecraft_angular_velocity", "b", "rad/s", 3); - str_tmp += WriteQuaternion("spacecraft_quaternion", "i2b"); - str_tmp += WriteVector("spacecraft_torque", "b", "Nm", 3); - str_tmp += WriteScalar("spacecraft_total_angular_momentum", "Nms"); - str_tmp += WriteScalar("spacecraft_kinematic_energy", "J"); + str_tmp += logger::WriteVector("spacecraft_angular_velocity", "b", "rad/s", 3); + str_tmp += logger::WriteQuaternion("spacecraft_quaternion", "i2b"); + str_tmp += logger::WriteVector("spacecraft_torque", "b", "Nm", 3); + str_tmp += logger::WriteScalar("spacecraft_total_angular_momentum", "Nms"); + str_tmp += logger::WriteScalar("spacecraft_kinematic_energy", "J"); return str_tmp; } @@ -34,25 +36,50 @@ std::string Attitude::GetLogHeader() const { std::string Attitude::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(angular_velocity_b_rad_s_); - str_tmp += WriteQuaternion(quaternion_i2b_); - str_tmp += WriteVector(torque_b_Nm_); - str_tmp += WriteScalar(angular_momentum_total_Nms_); - str_tmp += WriteScalar(kinetic_energy_J_); + str_tmp += logger::WriteVector(angular_velocity_b_rad_s_); + str_tmp += logger::WriteQuaternion(quaternion_i2b_); + str_tmp += logger::WriteVector(torque_b_Nm_); + str_tmp += logger::WriteScalar(angular_momentum_total_Nms_); + str_tmp += logger::WriteScalar(kinetic_energy_J_); return str_tmp; } -void Attitude::SetParameters(const MonteCarloSimulationExecutor& mc_simulator) { +void Attitude::SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator) { GetInitializedMonteCarloParameterQuaternion(mc_simulator, "quaternion_i2b", quaternion_i2b_); } void Attitude::CalcAngularMomentum(void) { angular_momentum_spacecraft_b_Nms_ = inertia_tensor_kgm2_ * angular_velocity_b_rad_s_; angular_momentum_total_b_Nms_ = angular_momentum_reaction_wheel_b_Nms_ + angular_momentum_spacecraft_b_Nms_; - libra::Quaternion q_b2i = quaternion_i2b_.Conjugate(); + math::Quaternion q_b2i = quaternion_i2b_.Conjugate(); angular_momentum_total_i_Nms_ = q_b2i.FrameConversion(angular_momentum_total_b_Nms_); angular_momentum_total_Nms_ = angular_momentum_total_i_Nms_.CalcNorm(); - kinetic_energy_J_ = 0.5 * libra::InnerProduct(angular_momentum_spacecraft_b_Nms_, angular_velocity_b_rad_s_); + kinetic_energy_J_ = 0.5 * math::InnerProduct(angular_momentum_spacecraft_b_Nms_, angular_velocity_b_rad_s_); +} + +math::Matrix<4, 4> CalcAngularVelocityMatrix(math::Vector<3> angular_velocity_b_rad_s) { + math::Matrix<4, 4> angular_velocity_matrix; + + angular_velocity_matrix[0][0] = 0.0f; + angular_velocity_matrix[0][1] = angular_velocity_b_rad_s[2]; + angular_velocity_matrix[0][2] = -angular_velocity_b_rad_s[1]; + angular_velocity_matrix[0][3] = angular_velocity_b_rad_s[0]; + angular_velocity_matrix[1][0] = -angular_velocity_b_rad_s[2]; + angular_velocity_matrix[1][1] = 0.0f; + angular_velocity_matrix[1][2] = angular_velocity_b_rad_s[0]; + angular_velocity_matrix[1][3] = angular_velocity_b_rad_s[1]; + angular_velocity_matrix[2][0] = angular_velocity_b_rad_s[1]; + angular_velocity_matrix[2][1] = -angular_velocity_b_rad_s[0]; + angular_velocity_matrix[2][2] = 0.0f; + angular_velocity_matrix[2][3] = angular_velocity_b_rad_s[2]; + angular_velocity_matrix[3][0] = -angular_velocity_b_rad_s[0]; + angular_velocity_matrix[3][1] = -angular_velocity_b_rad_s[1]; + angular_velocity_matrix[3][2] = -angular_velocity_b_rad_s[2]; + angular_velocity_matrix[3][3] = 0.0f; + + return angular_velocity_matrix; } + +} // namespace s2e::dynamics::attitude diff --git a/src/dynamics/attitude/attitude.hpp b/src/dynamics/attitude/attitude.hpp index 2b88b19be..59076b6ef 100644 --- a/src/dynamics/attitude/attitude.hpp +++ b/src/dynamics/attitude/attitude.hpp @@ -6,24 +6,26 @@ #ifndef S2E_DYNAMICS_ATTITUDE_ATTITUDE_HPP_ #define S2E_DYNAMICS_ATTITUDE_ATTITUDE_HPP_ -#include -#include -#include +#include +#include +#include #include #include +namespace s2e::dynamics::attitude { + /** * @class Attitude * @brief Base class for attitude of spacecraft */ -class Attitude : public ILoggable, public SimulationObject { +class Attitude : public logger::ILoggable, public simulation::SimulationObject { public: /** * @fn Attitude * @brief Constructor * @param [in] simulation_object_name: Simulation object name for Monte-Carlo simulation */ - Attitude(const libra::Matrix<3, 3>& inertia_tensor_kgm2, const std::string& simulation_object_name = "attitude"); + Attitude(const math::Matrix<3, 3>& inertia_tensor_kgm2, const std::string& simulation_object_name = "attitude"); /** * @fn ~Attitude * @brief Destructor @@ -40,12 +42,12 @@ class Attitude : public ILoggable, public SimulationObject { * @fn GetAngularVelocity_b_rad_s * @brief Return angular velocity of spacecraft body-fixed frame with respect to the inertial frame [rad/s] */ - inline libra::Vector<3> GetAngularVelocity_b_rad_s() const { return angular_velocity_b_rad_s_; } + inline math::Vector<3> GetAngularVelocity_b_rad_s() const { return angular_velocity_b_rad_s_; } /** * @fn GetQuaternion_i2b * @brief Return attitude quaternion from the inertial frame to the body fixed frame */ - inline libra::Quaternion GetQuaternion_i2b() const { return quaternion_i2b_; } + inline math::Quaternion GetQuaternion_i2b() const { return quaternion_i2b_; } /** * @fn GetTotalAngularMomentNorm_Nms * @brief Return norm of total angular momentum of the spacecraft [Nms] @@ -60,34 +62,34 @@ class Attitude : public ILoggable, public SimulationObject { * @fn GetInertiaTensor_b_kgm2 * @brief Return inertia tensor [kg m^2] */ - inline libra::Matrix<3, 3> GetInertiaTensor_b_kgm2() const { return inertia_tensor_kgm2_; } + inline math::Matrix<3, 3> GetInertiaTensor_b_kgm2() const { return inertia_tensor_kgm2_; } // Setter /** * @fn SetAngularVelocity_b_rad_s * @brief Set angular velocity of the body fixed frame with respect to the inertial frame [rad/s] */ - inline void SetAngularVelocity_b_rad_s(const libra::Vector<3> angular_velocity_b_rad_s) { angular_velocity_b_rad_s_ = angular_velocity_b_rad_s; } + inline void SetAngularVelocity_b_rad_s(const math::Vector<3> angular_velocity_b_rad_s) { angular_velocity_b_rad_s_ = angular_velocity_b_rad_s; } /** * @fn SetQuaternion_i2b * @brief Set attitude quaternion from the inertial frame to the body frame */ - inline void SetQuaternion_i2b(const libra::Quaternion quaternion_i2b) { quaternion_i2b_ = quaternion_i2b; } + inline void SetQuaternion_i2b(const math::Quaternion quaternion_i2b) { quaternion_i2b_ = quaternion_i2b; } /** * @fn SetTorque_b_Nm * @brief Set torque acting on the spacecraft on the body fixed frame [Nm] */ - inline void SetTorque_b_Nm(const libra::Vector<3> torque_b_Nm) { torque_b_Nm_ = torque_b_Nm; } + inline void SetTorque_b_Nm(const math::Vector<3> torque_b_Nm) { torque_b_Nm_ = torque_b_Nm; } /** * @fn AddTorque_b_Nm * @brief Add torque acting on the spacecraft on the body fixed frame [Nm] */ - inline void AddTorque_b_Nm(const libra::Vector<3> torque_b_Nm) { torque_b_Nm_ += torque_b_Nm; } + inline void AddTorque_b_Nm(const math::Vector<3> torque_b_Nm) { torque_b_Nm_ += torque_b_Nm; } /** * @fn SetRwAngularMomentum_b_Nms * @brief Set angular momentum of reaction wheel in the body fixed frame [Nms] */ - inline void SetRwAngularMomentum_b_Nms(const libra::Vector<3> angular_momentum_rw_b_Nms) { + inline void SetRwAngularMomentum_b_Nms(const math::Vector<3> angular_momentum_rw_b_Nms) { angular_momentum_reaction_wheel_b_Nms_ = angular_momentum_rw_b_Nms; } @@ -98,36 +100,35 @@ class Attitude : public ILoggable, public SimulationObject { */ virtual void Propagate(const double end_time_s) = 0; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; // SimulationObject for McSim - virtual void SetParameters(const MonteCarloSimulationExecutor& mc_simulator); + virtual void SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator); protected: - bool is_calc_enabled_ = true; //!< Calculation flag - double propagation_step_s_; //!< Propagation step [sec] - libra::Vector<3> angular_velocity_b_rad_s_; //!< Angular velocity of spacecraft body fixed frame with respect to the inertial frame [rad/s] - libra::Quaternion quaternion_i2b_; //!< Attitude quaternion from the inertial frame to the body fixed frame - libra::Vector<3> torque_b_Nm_; //!< Torque in the body fixed frame [Nm] - - const libra::Matrix<3, 3>& inertia_tensor_kgm2_; //!< Inertia tensor of the spacecraft [kg m^2] + bool is_calc_enabled_ = true; //!< Calculation flag + double propagation_step_s_; //!< Propagation step [sec] + math::Vector<3> angular_velocity_b_rad_s_; //!< Angular velocity of spacecraft body fixed frame with respect to the inertial frame [rad/s] + math::Quaternion quaternion_i2b_; //!< Attitude quaternion from the inertial frame to the body fixed frame + math::Vector<3> torque_b_Nm_; //!< Torque in the body fixed frame [Nm] + const math::Matrix<3, 3>& inertia_tensor_kgm2_; //!< Inertia tensor of the spacecraft [kg m^2] - libra::Vector<3> angular_momentum_spacecraft_b_Nms_; //!< Angular momentum of spacecraft in the body fixed frame [Nms] - libra::Vector<3> angular_momentum_reaction_wheel_b_Nms_; //!< Angular momentum of reaction wheel in the body fixed frame [Nms] - libra::Vector<3> angular_momentum_total_b_Nms_; //!< Total angular momentum of spacecraft in the body fixed frame [Nms] - libra::Vector<3> angular_momentum_total_i_Nms_; //!< Total angular momentum of spacecraft in the inertial frame [Nms] - double angular_momentum_total_Nms_; //!< Norm of total angular momentum [Nms] - double kinetic_energy_J_; //!< Rotational Kinetic Energy of Spacecraft [J] + math::Vector<3> angular_momentum_spacecraft_b_Nms_; //!< Angular momentum of spacecraft in the body fixed frame [Nms] + math::Vector<3> angular_momentum_reaction_wheel_b_Nms_; //!< Angular momentum of reaction wheel in the body fixed frame [Nms] + math::Vector<3> angular_momentum_total_b_Nms_; //!< Total angular momentum of spacecraft in the body fixed frame [Nms] + math::Vector<3> angular_momentum_total_i_Nms_; //!< Total angular momentum of spacecraft in the inertial frame [Nms] + double angular_momentum_total_Nms_; //!< Norm of total angular momentum [Nms] + double kinetic_energy_J_; //!< Rotational Kinetic Energy of Spacecraft [J] /** * @fn CalcAngularMomentum @@ -136,4 +137,13 @@ class Attitude : public ILoggable, public SimulationObject { void CalcAngularMomentum(void); }; +/** + * @fn CalcAngularVelocityMatrix + * @brief Generate angular velocity matrix for kinematics calculation + * @param [in] angular_velocity_b_rad_s: Angular velocity [rad/s] + */ +math::Matrix<4, 4> CalcAngularVelocityMatrix(math::Vector<3> angular_velocity_b_rad_s); + +} // namespace s2e::dynamics::attitude + #endif // S2E_DYNAMICS_ATTITUDE_ATTITUDE_HPP_ diff --git a/src/dynamics/attitude/attitude_rk4.cpp b/src/dynamics/attitude/attitude_rk4.cpp index c419229ad..e432e665c 100644 --- a/src/dynamics/attitude/attitude_rk4.cpp +++ b/src/dynamics/attitude/attitude_rk4.cpp @@ -5,12 +5,14 @@ #include "attitude_rk4.hpp" #include -#include -#include +#include #include +#include -AttitudeRk4::AttitudeRk4(const libra::Vector<3>& angular_velocity_b_rad_s, const libra::Quaternion& quaternion_i2b, - const libra::Matrix<3, 3>& inertia_tensor_kgm2, const libra::Vector<3>& torque_b_Nm, const double propagation_step_s, +namespace s2e::dynamics::attitude { + +AttitudeRk4::AttitudeRk4(const math::Vector<3>& angular_velocity_b_rad_s, const math::Quaternion& quaternion_i2b, + const math::Matrix<3, 3>& inertia_tensor_kgm2, const math::Vector<3>& torque_b_Nm, const double propagation_step_s, const std::string& simulation_object_name) : Attitude(inertia_tensor_kgm2, simulation_object_name) { angular_velocity_b_rad_s_ = angular_velocity_b_rad_s; @@ -18,7 +20,7 @@ AttitudeRk4::AttitudeRk4(const libra::Vector<3>& angular_velocity_b_rad_s, const torque_b_Nm_ = torque_b_Nm; propagation_step_s_ = propagation_step_s; current_propagation_time_s_ = 0.0; - angular_momentum_reaction_wheel_b_Nms_ = libra::Vector<3>(0.0); + angular_momentum_reaction_wheel_b_Nms_ = math::Vector<3>(0.0); previous_inertia_tensor_kgm2_ = inertia_tensor_kgm2_; inverse_inertia_tensor_ = CalcInverseMatrix(inertia_tensor_kgm2_); CalcAngularMomentum(); @@ -26,21 +28,20 @@ AttitudeRk4::AttitudeRk4(const libra::Vector<3>& angular_velocity_b_rad_s, const AttitudeRk4::~AttitudeRk4() {} -void AttitudeRk4::SetParameters(const MonteCarloSimulationExecutor& mc_simulator) { +void AttitudeRk4::SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator) { Attitude::SetParameters(mc_simulator); GetInitializedMonteCarloParameterVector(mc_simulator, "angular_velocity_b_rad_s", angular_velocity_b_rad_s_); // TODO: Consider the following calculation is needed here? current_propagation_time_s_ = 0.0; - angular_momentum_reaction_wheel_b_Nms_ = libra::Vector<3>(0.0); //!< Consider how to handle this variable + angular_momentum_reaction_wheel_b_Nms_ = math::Vector<3>(0.0); //!< Consider how to handle this variable CalcAngularMomentum(); } void AttitudeRk4::Propagate(const double end_time_s) { if (!is_calc_enabled_) return; - libra::Matrix<3, 3> dot_inertia_tensor = - (1.0 / (end_time_s - current_propagation_time_s_)) * (inertia_tensor_kgm2_ - previous_inertia_tensor_kgm2_); + math::Matrix<3, 3> dot_inertia_tensor = (1.0 / (end_time_s - current_propagation_time_s_)) * (inertia_tensor_kgm2_ - previous_inertia_tensor_kgm2_); torque_inertia_tensor_change_b_Nm_ = dot_inertia_tensor * angular_velocity_b_rad_s_; inverse_inertia_tensor_ = CalcInverseMatrix(inertia_tensor_kgm2_); @@ -56,52 +57,29 @@ void AttitudeRk4::Propagate(const double end_time_s) { CalcAngularMomentum(); } -libra::Matrix<4, 4> AttitudeRk4::CalcAngularVelocityMatrix(libra::Vector<3> angular_velocity_b_rad_s) { - libra::Matrix<4, 4> angular_velocity_matrix; - - angular_velocity_matrix[0][0] = 0.0f; - angular_velocity_matrix[0][1] = angular_velocity_b_rad_s[2]; - angular_velocity_matrix[0][2] = -angular_velocity_b_rad_s[1]; - angular_velocity_matrix[0][3] = angular_velocity_b_rad_s[0]; - angular_velocity_matrix[1][0] = -angular_velocity_b_rad_s[2]; - angular_velocity_matrix[1][1] = 0.0f; - angular_velocity_matrix[1][2] = angular_velocity_b_rad_s[0]; - angular_velocity_matrix[1][3] = angular_velocity_b_rad_s[1]; - angular_velocity_matrix[2][0] = angular_velocity_b_rad_s[1]; - angular_velocity_matrix[2][1] = -angular_velocity_b_rad_s[0]; - angular_velocity_matrix[2][2] = 0.0f; - angular_velocity_matrix[2][3] = angular_velocity_b_rad_s[2]; - angular_velocity_matrix[3][0] = -angular_velocity_b_rad_s[0]; - angular_velocity_matrix[3][1] = -angular_velocity_b_rad_s[1]; - angular_velocity_matrix[3][2] = -angular_velocity_b_rad_s[2]; - angular_velocity_matrix[3][3] = 0.0f; - - return angular_velocity_matrix; -} - -libra::Vector<7> AttitudeRk4::AttitudeDynamicsAndKinematics(libra::Vector<7> x, double t) { +math::Vector<7> AttitudeRk4::AttitudeDynamicsAndKinematics(math::Vector<7> x, double t) { UNUSED(t); - libra::Vector<7> dxdt; + math::Vector<7> dxdt; - libra::Vector<3> omega_b; + math::Vector<3> omega_b; for (int i = 0; i < 3; i++) { omega_b[i] = x[i]; } - libra::Vector<3> angular_momentum_total_b_Nms = (previous_inertia_tensor_kgm2_ * omega_b) + angular_momentum_reaction_wheel_b_Nms_; - libra::Vector<3> rhs = - inverse_inertia_tensor_ * (torque_b_Nm_ - libra::OuterProduct(omega_b, angular_momentum_total_b_Nms) - torque_inertia_tensor_change_b_Nm_); + math::Vector<3> angular_momentum_total_b_Nms = (previous_inertia_tensor_kgm2_ * omega_b) + angular_momentum_reaction_wheel_b_Nms_; + math::Vector<3> rhs = + inverse_inertia_tensor_ * (torque_b_Nm_ - math::OuterProduct(omega_b, angular_momentum_total_b_Nms) - torque_inertia_tensor_change_b_Nm_); for (int i = 0; i < 3; ++i) { dxdt[i] = rhs[i]; } - libra::Vector<4> quaternion_i2b; + math::Vector<4> quaternion_i2b; for (int i = 0; i < 4; i++) { quaternion_i2b[i] = x[i + 3]; } - libra::Vector<4> d_quaternion = 0.5 * CalcAngularVelocityMatrix(omega_b) * quaternion_i2b; + math::Vector<4> d_quaternion = 0.5 * CalcAngularVelocityMatrix(omega_b) * quaternion_i2b; for (int i = 0; i < 4; i++) { dxdt[i + 3] = d_quaternion[i]; @@ -111,7 +89,7 @@ libra::Vector<7> AttitudeRk4::AttitudeDynamicsAndKinematics(libra::Vector<7> x, } void AttitudeRk4::RungeKuttaOneStep(double t, double dt) { - libra::Vector<7> x; + math::Vector<7> x; for (int i = 0; i < 3; i++) { x[i] = angular_velocity_b_rad_s_[i]; } @@ -119,8 +97,8 @@ void AttitudeRk4::RungeKuttaOneStep(double t, double dt) { x[i + 3] = quaternion_i2b_[i]; } - libra::Vector<7> k1, k2, k3, k4; - libra::Vector<7> xk2, xk3, xk4; + math::Vector<7> k1, k2, k3, k4; + math::Vector<7> xk2, xk3, xk4; k1 = AttitudeDynamicsAndKinematics(x, t); xk2 = x + (dt / 2.0) * k1; @@ -133,7 +111,7 @@ void AttitudeRk4::RungeKuttaOneStep(double t, double dt) { k4 = AttitudeDynamicsAndKinematics(xk4, (t + dt)); - libra::Vector<7> next_x = x + (dt / 6.0) * (k1 + 2.0 * k2 + 2.0 * k3 + k4); + math::Vector<7> next_x = x + (dt / 6.0) * (k1 + 2.0 * k2 + 2.0 * k3 + k4); for (int i = 0; i < 3; i++) { angular_velocity_b_rad_s_[i] = next_x[i]; @@ -143,3 +121,5 @@ void AttitudeRk4::RungeKuttaOneStep(double t, double dt) { } quaternion_i2b_.Normalize(); } + +} // namespace s2e::dynamics::attitude diff --git a/src/dynamics/attitude/attitude_rk4.hpp b/src/dynamics/attitude/attitude_rk4.hpp index 58e09a703..5924bd4cf 100644 --- a/src/dynamics/attitude/attitude_rk4.hpp +++ b/src/dynamics/attitude/attitude_rk4.hpp @@ -8,6 +8,8 @@ #include "attitude.hpp" +namespace s2e::dynamics::attitude { + /** * @class AttitudeRk4 * @brief Class to calculate spacecraft attitude with Runge-Kutta method @@ -24,9 +26,8 @@ class AttitudeRk4 : public Attitude { * @param [in] propagation_step_s: Initial value of propagation step width [sec] * @param [in] simulation_object_name: Simulation object name for Monte-Carlo simulation */ - AttitudeRk4(const libra::Vector<3>& angular_velocity_b_rad_s, const libra::Quaternion& quaternion_i2b, - const libra::Matrix<3, 3>& inertia_tensor_kgm2, const libra::Vector<3>& torque_b_Nm, const double propagation_step_s, - const std::string& simulation_object_name = "attitude"); + AttitudeRk4(const math::Vector<3>& angular_velocity_b_rad_s, const math::Quaternion& quaternion_i2b, const math::Matrix<3, 3>& inertia_tensor_kgm2, + const math::Vector<3>& torque_b_Nm, const double propagation_step_s, const std::string& simulation_object_name = "attitude"); /** * @fn ~AttitudeRk4 * @brief Destructor @@ -45,27 +46,21 @@ class AttitudeRk4 : public Attitude { * @brief Set parameters for Monte-Carlo simulation * @param [in] mc_simulator: Monte-Carlo simulation executor */ - virtual void SetParameters(const MonteCarloSimulationExecutor& mc_simulator); + virtual void SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator); private: - double current_propagation_time_s_; //!< current time [sec] - libra::Matrix<3, 3> inverse_inertia_tensor_; //!< Inverse of inertia tensor - libra::Matrix<3, 3> previous_inertia_tensor_kgm2_; //!< Previous inertia tensor [kgm2] - libra::Vector<3> torque_inertia_tensor_change_b_Nm_; //!< Torque generated by inertia tensor change [Nm] + double current_propagation_time_s_; //!< current time [sec] + math::Matrix<3, 3> inverse_inertia_tensor_; //!< Inverse of inertia tensor + math::Matrix<3, 3> previous_inertia_tensor_kgm2_; //!< Previous inertia tensor [kgm2] + math::Vector<3> torque_inertia_tensor_change_b_Nm_; //!< Torque generated by inertia tensor change [Nm] - /** - * @fn CalcAngularVelocityMatrix - * @brief Generate angular velocity matrix for kinematics calculation - * @param [in] angular_velocity_b_rad_s: Angular velocity [rad/s] - */ - libra::Matrix<4, 4> CalcAngularVelocityMatrix(libra::Vector<3> angular_velocity_b_rad_s); /** * @fn AttitudeDynamicsAndKinematics * @brief Dynamics equation with kinematics * @param [in] x: State vector (angular velocity and quaternion) * @param [in] t: Unused TODO: remove? */ - libra::Vector<7> AttitudeDynamicsAndKinematics(libra::Vector<7> x, double t); + math::Vector<7> AttitudeDynamicsAndKinematics(math::Vector<7> x, double t); /** * @fn RungeKuttaOneStep * @brief Equation for one step of Runge-Kutta method @@ -75,4 +70,6 @@ class AttitudeRk4 : public Attitude { void RungeKuttaOneStep(double t, double dt); }; +} // namespace s2e::dynamics::attitude + #endif // S2E_DYNAMICS_ATTITUDE_ATTITUDE_RK4_HPP_ diff --git a/src/dynamics/attitude/attitude_with_cantilever_vibration.cpp b/src/dynamics/attitude/attitude_with_cantilever_vibration.cpp new file mode 100644 index 000000000..bcda0d5c2 --- /dev/null +++ b/src/dynamics/attitude/attitude_with_cantilever_vibration.cpp @@ -0,0 +1,105 @@ +/** + * @file attitude_with_cantilever_vibration.cpp + * @brief Class to calculate spacecraft attitude with cantilever vibration + */ +#include "attitude_with_cantilever_vibration.hpp" + +#include +#include +#include + +namespace s2e::dynamics::attitude { + +AttitudeWithCantileverVibration::AttitudeWithCantileverVibration( + const math::Vector<3>& angular_velocity_b_rad_s, const math::Quaternion& quaternion_i2b, const math::Matrix<3, 3>& inertia_tensor_kgm2, + const math::Matrix<3, 3>& inertia_tensor_cantilever_kgm2, const double damping_ratio_cantilever, + const double intrinsic_angular_velocity_cantilever_rad_s, const math::Vector<3>& torque_b_Nm, const double propagation_step_s, + const std::string& simulation_object_name) + : Attitude(inertia_tensor_kgm2, simulation_object_name), + numerical_integrator_(propagation_step_s, attitude_ode_, + numerical_integration::NumericalIntegrationMethod::kRk4) { //!< TODO: Set NumericalIntegrationMethod in *.ini file + angular_velocity_b_rad_s_ = angular_velocity_b_rad_s; + quaternion_i2b_ = quaternion_i2b; + torque_b_Nm_ = torque_b_Nm; + propagation_step_s_ = propagation_step_s; + current_propagation_time_s_ = 0.0; + angular_momentum_reaction_wheel_b_Nms_ = math::Vector<3>(0.0); + + attitude_ode_.SetInertiaTensorCantilever_kgm2(inertia_tensor_cantilever_kgm2); + attitude_ode_.SetPreviousInertiaTensor_kgm2(inertia_tensor_kgm2_); + double attenuation_coefficient = 2 * damping_ratio_cantilever * intrinsic_angular_velocity_cantilever_rad_s; + attitude_ode_.SetAttenuationCoefficient(attenuation_coefficient); + double spring_coefficient = pow(intrinsic_angular_velocity_cantilever_rad_s, 2.0); + attitude_ode_.SetSpringCoefficient(spring_coefficient); + attitude_ode_.SetInverseInertiaTensor(CalcInverseMatrix(inertia_tensor_kgm2_)); + math::Matrix<3, 3> inverse_equivalent_inertia_tensor_cantilever = + CalcInverseMatrix(inertia_tensor_kgm2_ - inertia_tensor_cantilever_kgm2) * inertia_tensor_kgm2_; + attitude_ode_.SetInverseEquivalentInertiaTensorCantilever(inverse_equivalent_inertia_tensor_cantilever); + attitude_ode_.SetTorque_b_Nm(torque_b_Nm_); + attitude_ode_.SetAngularMomentumReactionWheel_b_Nms(angular_momentum_reaction_wheel_b_Nms_); + + CalcAngularMomentum(); +} + +AttitudeWithCantileverVibration::~AttitudeWithCantileverVibration() {} + +std::string AttitudeWithCantileverVibration::GetLogHeader() const { + std::string str_tmp = Attitude::GetLogHeader(); + + str_tmp += logger::WriteVector("euler_angular_cantilever", "c", "rad", 3); + str_tmp += logger::WriteVector("angular_velocity_cantilever", "c", "rad/s", 3); + + return str_tmp; +} + +std::string AttitudeWithCantileverVibration::GetLogValue() const { + std::string str_tmp = Attitude::GetLogValue(); + + str_tmp += logger::WriteVector(euler_angular_cantilever_rad_); + str_tmp += logger::WriteVector(angular_velocity_cantilever_rad_s_); + + return str_tmp; +} + +void AttitudeWithCantileverVibration::SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator) { + Attitude::SetParameters(mc_simulator); + GetInitializedMonteCarloParameterVector(mc_simulator, "angular_velocity_b_rad_s", angular_velocity_b_rad_s_); + + // TODO: Consider the following calculation is needed here? + current_propagation_time_s_ = 0.0; + angular_momentum_reaction_wheel_b_Nms_ = math::Vector<3>(0.0); //!< TODO: Consider how to handle this variable + CalcAngularMomentum(); +} + +void AttitudeWithCantileverVibration::Propagate(const double end_time_s) { + if (!is_calc_enabled_) return; + + math::Matrix<3, 3> previous_inertia_tensor_kgm2 = attitude_ode_.GetPreviousInertiaTensor_kgm2(); + assert(end_time_s - current_propagation_time_s_ > 1e-6); + math::Matrix<3, 3> dot_inertia_tensor = (1.0 / (end_time_s - current_propagation_time_s_)) * (inertia_tensor_kgm2_ - previous_inertia_tensor_kgm2); + math::Vector<3> torque_inertia_tensor_b_Nm = dot_inertia_tensor * angular_velocity_b_rad_s_; + attitude_ode_.SetTorqueInertiaTensor_b_Nm(torque_inertia_tensor_b_Nm); + attitude_ode_.SetInverseInertiaTensor(CalcInverseMatrix(inertia_tensor_kgm2_)); + attitude_ode_.SetTorque_b_Nm(torque_b_Nm_); + attitude_ode_.SetAngularMomentumReactionWheel_b_Nms(angular_momentum_reaction_wheel_b_Nms_); + + math::Vector<13> state = attitude_ode_.SetStateFromPhysicalQuantities(angular_velocity_b_rad_s_, angular_velocity_cantilever_rad_s_, + quaternion_i2b_, euler_angular_cantilever_rad_); + numerical_integrator_.GetIntegrator()->SetState(propagation_step_s_, state); + while (end_time_s - current_propagation_time_s_ - propagation_step_s_ > 1.0e-6) { + numerical_integrator_.GetIntegrator()->Integrate(); + current_propagation_time_s_ += propagation_step_s_; + } + numerical_integrator_.GetIntegrator()->SetState(end_time_s - current_propagation_time_s_, numerical_integrator_.GetIntegrator()->GetState()); + numerical_integrator_.GetIntegrator()->Integrate(); + attitude_ode_.SetPhysicalQuantitiesFromState(numerical_integrator_.GetIntegrator()->GetState(), angular_velocity_b_rad_s_, + angular_velocity_cantilever_rad_s_, quaternion_i2b_, euler_angular_cantilever_rad_); + quaternion_i2b_.Normalize(); + + // Update information + current_propagation_time_s_ = end_time_s; + attitude_ode_.SetPreviousInertiaTensor_kgm2(inertia_tensor_kgm2_); + CalcAngularMomentum(); +} + +} // namespace s2e::dynamics::attitude diff --git a/src/dynamics/attitude/attitude_with_cantilever_vibration.hpp b/src/dynamics/attitude/attitude_with_cantilever_vibration.hpp new file mode 100644 index 000000000..f5f7747fa --- /dev/null +++ b/src/dynamics/attitude/attitude_with_cantilever_vibration.hpp @@ -0,0 +1,84 @@ +/** + * @file attitude_with_cantilever_vibration.hpp + * @brief Class to calculate spacecraft attitude with cantilever vibration + */ + +#ifndef S2E_DYNAMICS_ATTITUDE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ +#define S2E_DYNAMICS_ATTITUDE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ + +#include +#include + +#include "attitude.hpp" +#include "ode_attitude_with_cantilever_vibration.hpp" + +namespace s2e::dynamics::attitude { + +/** + * @class AttitudeWithCantileverVibration + * @brief Class to calculate spacecraft attitude with cantilever vibration + */ +class AttitudeWithCantileverVibration : public Attitude { + public: + /** + * @fn AttitudeWithCantileverVibration + * @brief Constructor + * @param [in] angular_velocity_b_rad_s: Initial value of spacecraft angular velocity of the body fixed frame [rad/s] + * @param [in] quaternion_i2b: Initial value of attitude quaternion from the inertial frame to the body fixed frame + * @param [in] inertia_tensor_kgm2: Initial value of inertia tensor of the spacecraft [kg m^2] + * @param [in] inertia_tensor_cantilever_kgm2: Initial value of inertia tensor of the cantilever [kg m^2] + * @param [in] damping_ratio_cantilever: Initial value of damping ratio of the cantilever [] + * @param [in] intrinsic_angular_velocity_cantilever_rad_s: Initial value of intrinsic angular velocity [rad/s] + * @param [in] torque_b_Nm: Initial torque acting on the spacecraft in the body fixed frame [Nm] + * @param [in] propagation_step_s: Initial value of propagation step width [sec] + * @param [in] simulation_object_name: Simulation object name for Monte-Carlo simulation + */ + AttitudeWithCantileverVibration(const math::Vector<3>& angular_velocity_b_rad_s, const math::Quaternion& quaternion_i2b, + const math::Matrix<3, 3>& inertia_tensor_kgm2, const math::Matrix<3, 3>& inertia_tensor_cantilever_kgm2, + const double damping_ratio_cantilever, const double intrinsic_angular_velocity_cantilever_rad_s, + const math::Vector<3>& torque_b_Nm, const double propagation_step_s, + const std::string& simulation_object_name = "attitude"); + /** + * @fn ~AttitudeWithCantileverVibration + * @brief Destructor + */ + ~AttitudeWithCantileverVibration(); + + /** + * @fn Propagate + * @brief Attitude propagation + * @param [in] end_time_s: Propagation endtime [sec] + */ + virtual void Propagate(const double end_time_s); + + // Override logger::ILoggable + /** + * @fn GetLogHeader + * @brief Override GetLogHeader function of logger::ILoggable + */ + virtual std::string GetLogHeader() const; + /** + * @fn GetLogValue + * @brief Override GetLogValue function of logger::ILoggable + */ + virtual std::string GetLogValue() const; + + /** + * @fn SetParameters + * @brief Set parameters for Monte-Carlo simulation + * @param [in] mc_simulator: Monte-Carlo simulation executor + */ + virtual void SetParameters(const simulation::MonteCarloSimulationExecutor& mc_simulator); + + private: + double current_propagation_time_s_; //!< current time [sec] + math::Vector<3> angular_velocity_cantilever_rad_s_{0.0}; //!< Angular velocity of the cantilever with respect to the body frame [rad/s] + math::Vector<3> euler_angular_cantilever_rad_{0.0}; //!< Euler angle of the cantilever with respect to the body frame [rad/s] + + AttitudeWithCantileverVibrationOde attitude_ode_; + numerical_integration::NumericalIntegratorManager<13> numerical_integrator_; +}; + +} // namespace s2e::dynamics::attitude + +#endif // S2E_DYNAMICS_ATTITUDE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ diff --git a/src/dynamics/attitude/controlled_attitude.cpp b/src/dynamics/attitude/controlled_attitude.cpp index 4790c1fb6..d852dc9e3 100644 --- a/src/dynamics/attitude/controlled_attitude.cpp +++ b/src/dynamics/attitude/controlled_attitude.cpp @@ -4,13 +4,15 @@ */ #include "controlled_attitude.hpp" -#include -#include +#include +#include -ControlledAttitude::ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, - const libra::Quaternion quaternion_i2b, const libra::Vector<3> main_target_direction_b, - const libra::Vector<3> sub_target_direction_b, const libra::Matrix<3, 3>& inertia_tensor_kgm2, - const LocalCelestialInformation* local_celestial_information, const Orbit* orbit, +namespace s2e::dynamics::attitude { + +ControlledAttitude::ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, const math::Quaternion quaternion_i2b, + const math::Vector<3> main_target_direction_b, const math::Vector<3> sub_target_direction_b, + const math::Matrix<3, 3>& inertia_tensor_kgm2, + const environment::LocalCelestialInformation* local_celestial_information, const orbit::Orbit* orbit, const std::string& simulation_object_name) : Attitude(inertia_tensor_kgm2, simulation_object_name), main_mode_(main_mode), @@ -54,7 +56,7 @@ void ControlledAttitude::Initialize(void) { } void ControlledAttitude::Propagate(const double end_time_s) { - libra::Vector<3> main_direction_i, sub_direction_i; + math::Vector<3> main_direction_i, sub_direction_i; if (!is_calc_enabled_) return; if (main_mode_ == AttitudeControlMode::kInertialStabilize) { @@ -73,26 +75,29 @@ void ControlledAttitude::Propagate(const double end_time_s) { return; } -libra::Vector<3> ControlledAttitude::CalcTargetDirection_i(AttitudeControlMode mode) { - libra::Vector<3> direction; +math::Vector<3> ControlledAttitude::CalcTargetDirection_i(AttitudeControlMode mode) { + math::Vector<3> direction; if (mode == AttitudeControlMode::kSunPointing) { direction = local_celestial_information_->GetPositionFromSpacecraft_i_m("SUN"); // When the local_celestial_information is not initialized. FIXME: This is temporary codes for attitude initialize. if (direction.CalcNorm() == 0.0) { - libra::Vector<3> sun_position_i_m = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("SUN"); - libra::Vector<3> spacecraft_position_i_m = orbit_->GetPosition_i_m(); + math::Vector<3> sun_position_i_m = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("SUN"); + math::Vector<3> spacecraft_position_i_m = orbit_->GetPosition_i_m(); direction = sun_position_i_m - spacecraft_position_i_m; } } else if (mode == AttitudeControlMode::kEarthCenterPointing) { direction = local_celestial_information_->GetPositionFromSpacecraft_i_m("EARTH"); // When the local_celestial_information is not initialized. FIXME: This is temporary codes for attitude initialize. if (direction.CalcNorm() == 0.0) { - libra::Vector<3> earth_position_i_m = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("EARTH"); - libra::Vector<3> spacecraft_position_i_m = orbit_->GetPosition_i_m(); + math::Vector<3> earth_position_i_m = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("EARTH"); + math::Vector<3> spacecraft_position_i_m = orbit_->GetPosition_i_m(); direction = earth_position_i_m - spacecraft_position_i_m; } } else if (mode == AttitudeControlMode::kVelocityDirectionPointing) { direction = orbit_->GetVelocity_i_m_s(); + } else if (mode == AttitudeControlMode::kGroundSpeedDirectionPointing) { + math::Matrix<3, 3> dcm_ecef2eci = local_celestial_information_->GetGlobalInformation().GetEarthRotation().GetDcmJ2000ToEcef().Transpose(); + direction = dcm_ecef2eci * orbit_->GetVelocity_ecef_m_s(); } else if (mode == AttitudeControlMode::kOrbitNormalPointing) { direction = OuterProduct(orbit_->GetPosition_i_m(), orbit_->GetVelocity_i_m_s()); } @@ -100,29 +105,29 @@ libra::Vector<3> ControlledAttitude::CalcTargetDirection_i(AttitudeControlMode m return direction; } -void ControlledAttitude::PointingControl(const libra::Vector<3> main_direction_i, const libra::Vector<3> sub_direction_i) { +void ControlledAttitude::PointingControl(const math::Vector<3> main_direction_i, const math::Vector<3> sub_direction_i) { // Calc DCM ECI->Target - libra::Matrix<3, 3> dcm_t2i = CalcDcm(main_direction_i, sub_direction_i); + math::Matrix<3, 3> dcm_t2i = CalcDcm(main_direction_i, sub_direction_i); // Calc DCM Target->body - libra::Matrix<3, 3> dcm_t2b = CalcDcm(main_target_direction_b_, sub_target_direction_b_); + math::Matrix<3, 3> dcm_t2b = CalcDcm(main_target_direction_b_, sub_target_direction_b_); // Calc DCM ECI->body - libra::Matrix<3, 3> dcm_i2b = dcm_t2b * dcm_t2i.Transpose(); + math::Matrix<3, 3> dcm_i2b = dcm_t2b * dcm_t2i.Transpose(); // Convert to Quaternion - quaternion_i2b_ = libra::Quaternion::ConvertFromDcm(dcm_i2b); + quaternion_i2b_ = math::Quaternion::ConvertFromDcm(dcm_i2b); } -libra::Matrix<3, 3> ControlledAttitude::CalcDcm(const libra::Vector<3> main_direction, const libra::Vector<3> sub_direction) { +math::Matrix<3, 3> ControlledAttitude::CalcDcm(const math::Vector<3> main_direction, const math::Vector<3> sub_direction) { // Calc basis vectors - libra::Vector<3> ex, ey, ez; + math::Vector<3> ex, ey, ez; ex = main_direction; - libra::Vector<3> tmp1 = OuterProduct(ex, sub_direction); - libra::Vector<3> tmp2 = OuterProduct(tmp1, ex); + math::Vector<3> tmp1 = OuterProduct(ex, sub_direction); + math::Vector<3> tmp2 = OuterProduct(tmp1, ex); ey = tmp2.CalcNormalizedVector(); - libra::Vector<3> tmp3 = OuterProduct(ex, ey); + math::Vector<3> tmp3 = OuterProduct(ex, ey); ez = tmp3.CalcNormalizedVector(); // Generate DCM - libra::Matrix<3, 3> dcm; + math::Matrix<3, 3> dcm; for (int i = 0; i < 3; i++) { dcm[i][0] = ex[i]; dcm[i][1] = ey[i]; @@ -140,6 +145,8 @@ AttitudeControlMode ConvertStringToCtrlMode(const std::string mode) { return AttitudeControlMode::kEarthCenterPointing; } else if (mode == "VELOCITY_DIRECTION_POINTING") { return AttitudeControlMode::kVelocityDirectionPointing; + } else if (mode == "GROUND_SPEED_DIRECTION_POINTING") { + return AttitudeControlMode::kGroundSpeedDirectionPointing; } else if (mode == "ORBIT_NORMAL_POINTING") { return AttitudeControlMode::kOrbitNormalPointing; } else { @@ -148,24 +155,24 @@ AttitudeControlMode ConvertStringToCtrlMode(const std::string mode) { } void ControlledAttitude::CalcAngularVelocity(const double current_time_s) { - libra::Vector<3> controlled_torque_b_Nm(0.0); + math::Vector<3> controlled_torque_b_Nm(0.0); if (previous_calc_time_s_ > 0.0) { double time_diff_sec = current_time_s - previous_calc_time_s_; - libra::Quaternion prev_q_b2i = previous_quaternion_i2b_.Conjugate(); - libra::Quaternion q_diff = prev_q_b2i * quaternion_i2b_; + math::Quaternion prev_q_b2i = previous_quaternion_i2b_.Conjugate(); + math::Quaternion q_diff = prev_q_b2i * quaternion_i2b_; q_diff = (2.0 / time_diff_sec) * q_diff; - libra::Vector<3> angular_acc_b_rad_s2_; + math::Vector<3> angular_acc_b_rad_s2_; for (int i = 0; i < 3; i++) { angular_velocity_b_rad_s_[i] = q_diff[i]; angular_acc_b_rad_s2_[i] = (previous_omega_b_rad_s_[i] - angular_velocity_b_rad_s_[i]) / time_diff_sec; } - libra::Matrix<3, 3> inv_inertia_tensor = CalcInverseMatrix(inertia_tensor_kgm2_); + math::Matrix<3, 3> inv_inertia_tensor = CalcInverseMatrix(inertia_tensor_kgm2_); controlled_torque_b_Nm = inv_inertia_tensor * angular_acc_b_rad_s2_; } else { - angular_velocity_b_rad_s_ = libra::Vector<3>(0.0); - controlled_torque_b_Nm = libra::Vector<3>(0.0); + angular_velocity_b_rad_s_ = math::Vector<3>(0.0); + controlled_torque_b_Nm = math::Vector<3>(0.0); } // Add torque with disturbances AddTorque_b_Nm(controlled_torque_b_Nm); @@ -174,3 +181,5 @@ void ControlledAttitude::CalcAngularVelocity(const double current_time_s) { previous_quaternion_i2b_ = quaternion_i2b_; previous_omega_b_rad_s_ = angular_velocity_b_rad_s_; } + +} // namespace s2e::dynamics::attitude diff --git a/src/dynamics/attitude/controlled_attitude.hpp b/src/dynamics/attitude/controlled_attitude.hpp index f0de70d14..c2853871e 100644 --- a/src/dynamics/attitude/controlled_attitude.hpp +++ b/src/dynamics/attitude/controlled_attitude.hpp @@ -7,23 +7,26 @@ #define S2E_DYNAMICS_ATTITUDE_CONTROLLED_ATTITUDE_HPP_ #include -#include +#include #include #include "../orbit/orbit.hpp" #include "attitude.hpp" +namespace s2e::dynamics::attitude { + /** * @enum AttitudeControlMode * @brief Attitude control mode */ enum class AttitudeControlMode { - kInertialStabilize, //!< Inertial stabilize - kSunPointing, //!< Sun pointing - kEarthCenterPointing, //!< Earth center pointing - kVelocityDirectionPointing, //!< Spacecraft velocity direction pointing - kOrbitNormalPointing, //!< Orbit normal direction pointing - kNoControl, // No Control + kInertialStabilize, //!< Inertial stabilize + kSunPointing, //!< Sun pointing + kEarthCenterPointing, //!< Earth center pointing + kVelocityDirectionPointing, //!< Spacecraft velocity direction pointing + kGroundSpeedDirectionPointing, //!< Ground speed direction pointing + kOrbitNormalPointing, //!< Orbit normal direction pointing + kNoControl, // No Control }; /** @@ -53,10 +56,10 @@ class ControlledAttitude : public Attitude { * @param [in] orbit: Orbit * @param [in] simulation_object_name: Simulation object name for Monte-Carlo simulation */ - ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, const libra::Quaternion quaternion_i2b, - const libra::Vector<3> main_target_direction_b, const libra::Vector<3> sub_target_direction_b, - const libra::Matrix<3, 3>& inertia_tensor_kgm2, const LocalCelestialInformation* local_celestial_information, const Orbit* orbit, - const std::string& simulation_object_name = "attitude"); + ControlledAttitude(const AttitudeControlMode main_mode, const AttitudeControlMode sub_mode, const math::Quaternion quaternion_i2b, + const math::Vector<3> main_target_direction_b, const math::Vector<3> sub_target_direction_b, + const math::Matrix<3, 3>& inertia_tensor_kgm2, const environment::LocalCelestialInformation* local_celestial_information, + const orbit::Orbit* orbit, const std::string& simulation_object_name = "attitude"); /** * @fn ~ControlledAttitude * @brief Destructor @@ -78,17 +81,17 @@ class ControlledAttitude : public Attitude { * @fn SetQuaternion_i2t * @brief Set quaternion for INERTIAL_STABILIZE mode */ - inline void SetQuaternion_i2t(const libra::Quaternion quaternion_i2t) { quaternion_i2b_ = quaternion_i2t; } + inline void SetQuaternion_i2t(const math::Quaternion quaternion_i2t) { quaternion_i2b_ = quaternion_i2t; } /** * @fn SetMainTargetDirection_b * @brief Set main target direction on the body fixed frame */ - inline void SetMainTargetDirection_b(libra::Vector<3> main_target_direction_b) { main_target_direction_b_ = main_target_direction_b; } + inline void SetMainTargetDirection_b(math::Vector<3> main_target_direction_b) { main_target_direction_b_ = main_target_direction_b; } /** * @fn SetSubTargetDirection_b * @brief Set sub target direction on the body fixed frame */ - inline void SetSubTargetDirection_b(libra::Vector<3> sub_target_direction_b) { sub_target_direction_b_ = sub_target_direction_b; } + inline void SetSubTargetDirection_b(math::Vector<3> sub_target_direction_b) { sub_target_direction_b_ = sub_target_direction_b; } /** * @fn Propagate @@ -98,20 +101,20 @@ class ControlledAttitude : public Attitude { virtual void Propagate(const double end_time_s); private: - AttitudeControlMode main_mode_; //!< Main control mode - AttitudeControlMode sub_mode_; //!< Sub control mode - libra::Vector<3> main_target_direction_b_; //!< Main target direction on the body fixed frame - libra::Vector<3> sub_target_direction_b_; //!< Sub target direction on tge body fixed frame - double previous_calc_time_s_ = -1.0; //!< Previous time of velocity calculation [sec] - libra::Quaternion previous_quaternion_i2b_; //!< Previous quaternion - libra::Vector<3> previous_omega_b_rad_s_; //!< Previous angular velocity [rad/s] + AttitudeControlMode main_mode_; //!< Main control mode + AttitudeControlMode sub_mode_; //!< Sub control mode + math::Vector<3> main_target_direction_b_; //!< Main target direction on the body fixed frame + math::Vector<3> sub_target_direction_b_; //!< Sub target direction on tge body fixed frame + double previous_calc_time_s_ = -1.0; //!< Previous time of velocity calculation [sec] + math::Quaternion previous_quaternion_i2b_; //!< Previous quaternion + math::Vector<3> previous_omega_b_rad_s_; //!< Previous angular velocity [rad/s] - const double kMinDirectionAngle_rad = 30.0 * libra::deg_to_rad; //!< Minimum angle b/w main and sub direction - // TODO Change with ini file + const double kMinDirectionAngle_rad = 30.0 * math::deg_to_rad; //!< Minimum angle b/w main and sub direction + // TODO Change with ini file // Inputs - const LocalCelestialInformation* local_celestial_information_; //!< Local celestial information - const Orbit* orbit_; //!< Orbit information + const environment::LocalCelestialInformation* local_celestial_information_; //!< Local celestial information + const orbit::Orbit* orbit_; //!< Orbit information // Local functions /** @@ -125,14 +128,14 @@ class ControlledAttitude : public Attitude { * @param [in] mode: Attitude control mode * @return Target direction at the inertia frame */ - libra::Vector<3> CalcTargetDirection_i(AttitudeControlMode mode); + math::Vector<3> CalcTargetDirection_i(AttitudeControlMode mode); /** * @fn PointingControl * @brief Calculate attitude quaternion * @param [in] main_direction_i: Main target direction in the inertial frame * @param [in] sub_direction_i: Sub target direction in the inertial frame */ - void PointingControl(const libra::Vector<3> main_direction_i, const libra::Vector<3> sub_direction_i); + void PointingControl(const math::Vector<3> main_direction_i, const math::Vector<3> sub_direction_i); /** * @fn CalcAngularVelocity * @brief Calculate angular velocity @@ -145,7 +148,9 @@ class ControlledAttitude : public Attitude { * @param [in] main_direction: Main target direction * @param [in] sub_direction: Sub target direction */ - libra::Matrix<3, 3> CalcDcm(const libra::Vector<3> main_direction, const libra::Vector<3> sub_direction); + math::Matrix<3, 3> CalcDcm(const math::Vector<3> main_direction, const math::Vector<3> sub_direction); }; +} // namespace s2e::dynamics::attitude + #endif // S2E_DYNAMICS_ATTITUDE_CONTROLLED_ATTITUDE_HPP_ diff --git a/src/dynamics/attitude/initialize_attitude.cpp b/src/dynamics/attitude/initialize_attitude.cpp index ed0e00511..f5dbb7b82 100644 --- a/src/dynamics/attitude/initialize_attitude.cpp +++ b/src/dynamics/attitude/initialize_attitude.cpp @@ -4,11 +4,13 @@ */ #include "initialize_attitude.hpp" -#include +#include -Attitude* InitAttitude(std::string file_name, const Orbit* orbit, const LocalCelestialInformation* local_celestial_information, - const double step_width_s, const libra::Matrix<3, 3>& inertia_tensor_kgm2, const int spacecraft_id) { - IniAccess ini_file(file_name); +namespace s2e::dynamics::attitude { + +Attitude* InitAttitude(std::string file_name, const orbit::Orbit* orbit, const environment::LocalCelestialInformation* local_celestial_information, + const double step_width_s, const math::Matrix<3, 3>& inertia_tensor_kgm2, const int spacecraft_id) { + setting_file_reader::IniAccess ini_file(file_name); const char* section_ = "ATTITUDE"; std::string mc_name = "attitude" + std::to_string(spacecraft_id); Attitude* attitude; @@ -16,28 +18,21 @@ Attitude* InitAttitude(std::string file_name, const Orbit* orbit, const LocalCel const std::string propagate_mode = ini_file.ReadString(section_, "propagate_mode"); const std::string initialize_mode = ini_file.ReadString(section_, "initialize_mode"); - if (propagate_mode == "RK4" && initialize_mode == "MANUAL") { - // RK4 propagator - libra::Vector<3> omega_b; - ini_file.ReadVector(section_, "initial_angular_velocity_b_rad_s", omega_b); - libra::Quaternion quaternion_i2b; - ini_file.ReadQuaternion(section_, "initial_quaternion_i2b", quaternion_i2b); - libra::Vector<3> torque_b; - ini_file.ReadVector(section_, "initial_torque_b_Nm", torque_b); - - attitude = new AttitudeRk4(omega_b, quaternion_i2b, inertia_tensor_kgm2, torque_b, step_width_s, mc_name); - } else if (propagate_mode == "RK4" && initialize_mode == "CONTROLLED") { + math::Vector<3> omega_b; + math::Quaternion quaternion_i2b; + math::Vector<3> torque_b; + if (initialize_mode == "CONTROLLED") { // Initialize with Controlled attitude (attitude_tmp temporary used) - IniAccess ini_file_ca(file_name); + setting_file_reader::IniAccess ini_file_ca(file_name); const char* section_ca_ = "CONTROLLED_ATTITUDE"; const std::string main_mode_in = ini_file.ReadString(section_ca_, "main_mode"); const std::string sub_mode_in = ini_file.ReadString(section_ca_, "sub_mode"); AttitudeControlMode main_mode = ConvertStringToCtrlMode(main_mode_in); AttitudeControlMode sub_mode = ConvertStringToCtrlMode(sub_mode_in); - libra::Quaternion quaternion_i2b; + ini_file_ca.ReadQuaternion(section_, "initial_quaternion_i2b", quaternion_i2b); - libra::Vector<3> main_target_direction_b, sub_target_direction_b; + math::Vector<3> main_target_direction_b, sub_target_direction_b; ini_file_ca.ReadVector(section_ca_, "main_pointing_direction_b", main_target_direction_b); ini_file_ca.ReadVector(section_ca_, "sub_pointing_direction_b", sub_target_direction_b); std::string mc_name_temp = section_ + std::to_string(spacecraft_id) + "_TEMP"; @@ -45,22 +40,47 @@ Attitude* InitAttitude(std::string file_name, const Orbit* orbit, const LocalCel inertia_tensor_kgm2, local_celestial_information, orbit, mc_name_temp); attitude_temp->Propagate(step_width_s); quaternion_i2b = attitude_temp->GetQuaternion_i2b(); - libra::Vector<3> omega_b = libra::Vector<3>(0.0); - libra::Vector<3> torque_b = libra::Vector<3>(0.0); + omega_b = math::Vector<3>(0.0); + torque_b = math::Vector<3>(0.0); + } else { + // Including the case: initialize_mode == "MANUAL" + ini_file.ReadVector(section_, "initial_angular_velocity_b_rad_s", omega_b); + ini_file.ReadQuaternion(section_, "initial_quaternion_i2b", quaternion_i2b); + ini_file.ReadVector(section_, "initial_torque_b_Nm", torque_b); + } + if (propagate_mode == "RK4") { attitude = new AttitudeRk4(omega_b, quaternion_i2b, inertia_tensor_kgm2, torque_b, step_width_s, mc_name); + } else if (propagate_mode == "CANTILEVER_VIBRATION") { + std::string ini_structure_name = ini_file.ReadString("SETTING_FILES", "structure_file"); + setting_file_reader::IniAccess ini_structure(ini_structure_name); + + const char* section_cantilever = "CANTILEVER_PARAMETERS"; + math::Matrix<3, 3> inertia_tensor_cantilever_kgm2; + math::Vector<9> inertia_vec; + ini_structure.ReadVector(section_cantilever, "inertia_tensor_cantilever_kgm2", inertia_vec); + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + inertia_tensor_cantilever_kgm2[i][j] = inertia_vec[i * 3 + j]; + } + } + double damping_ratio_cantilever = ini_structure.ReadDouble(section_cantilever, "damping_ratio_cantilever"); + double intrinsic_angular_velocity_cantilever_rad_s = ini_structure.ReadDouble(section_cantilever, "intrinsic_angular_velocity_cantilever_rad_s"); + + attitude = + new AttitudeWithCantileverVibration(omega_b, quaternion_i2b, inertia_tensor_kgm2, inertia_tensor_cantilever_kgm2, damping_ratio_cantilever, + intrinsic_angular_velocity_cantilever_rad_s, torque_b, step_width_s, mc_name); } else if (propagate_mode == "CONTROLLED") { // Controlled attitude - IniAccess ini_file_ca(file_name); + setting_file_reader::IniAccess ini_file_ca(file_name); const char* section_ca_ = "CONTROLLED_ATTITUDE"; const std::string main_mode_in = ini_file.ReadString(section_ca_, "main_mode"); const std::string sub_mode_in = ini_file.ReadString(section_ca_, "sub_mode"); AttitudeControlMode main_mode = ConvertStringToCtrlMode(main_mode_in); AttitudeControlMode sub_mode = ConvertStringToCtrlMode(sub_mode_in); - libra::Quaternion quaternion_i2b; ini_file_ca.ReadQuaternion(section_, "initial_quaternion_i2b", quaternion_i2b); - libra::Vector<3> main_target_direction_b, sub_target_direction_b; + math::Vector<3> main_target_direction_b, sub_target_direction_b; ini_file_ca.ReadVector(section_ca_, "main_pointing_direction_b", main_target_direction_b); ini_file_ca.ReadVector(section_ca_, "sub_pointing_direction_b", sub_target_direction_b); @@ -70,15 +90,10 @@ Attitude* InitAttitude(std::string file_name, const Orbit* orbit, const LocalCel std::cerr << "ERROR: attitude propagation mode: " << propagate_mode << " is not defined!" << std::endl; std::cerr << "The attitude mode is automatically set as RK4" << std::endl; - libra::Vector<3> omega_b; - ini_file.ReadVector(section_, "initial_angular_velocity_b_rad_s", omega_b); - libra::Quaternion quaternion_i2b; - ini_file.ReadQuaternion(section_, "initial_quaternion_i2b", quaternion_i2b); - libra::Vector<3> torque_b; - ini_file.ReadVector(section_, "initial_torque_b_Nm", torque_b); - attitude = new AttitudeRk4(omega_b, quaternion_i2b, inertia_tensor_kgm2, torque_b, step_width_s, mc_name); } return attitude; } + +} // namespace s2e::dynamics::attitude diff --git a/src/dynamics/attitude/initialize_attitude.hpp b/src/dynamics/attitude/initialize_attitude.hpp index 964d6cbb0..335ee0c44 100644 --- a/src/dynamics/attitude/initialize_attitude.hpp +++ b/src/dynamics/attitude/initialize_attitude.hpp @@ -8,8 +8,11 @@ #include "attitude.hpp" #include "attitude_rk4.hpp" +#include "attitude_with_cantilever_vibration.hpp" #include "controlled_attitude.hpp" +namespace s2e::dynamics::attitude { + /** * @fn InitAttitude * @brief Initialize function for Attitude @@ -20,7 +23,9 @@ * @param [in] inertia_tensor_kgm2: Inertia tensor [kg m^2] * @param [in] spacecraft_id: Satellite ID */ -Attitude* InitAttitude(std::string file_name, const Orbit* orbit, const LocalCelestialInformation* local_celestial_information, - const double step_width_s, const libra::Matrix<3, 3>& inertia_tensor_kgm2, const int spacecraft_id); +Attitude* InitAttitude(std::string file_name, const orbit::Orbit* orbit, const environment::LocalCelestialInformation* local_celestial_information, + const double step_width_s, const math::Matrix<3, 3>& inertia_tensor_kgm2, const int spacecraft_id); + +} // namespace s2e::dynamics::attitude #endif // S2E_DYNAMICS_ATTITUDE_INITIALIZE_ATTITUDE_HPP_ diff --git a/src/dynamics/attitude/ode_attitude_with_cantilever_vibration.hpp b/src/dynamics/attitude/ode_attitude_with_cantilever_vibration.hpp new file mode 100644 index 000000000..c267b84f7 --- /dev/null +++ b/src/dynamics/attitude/ode_attitude_with_cantilever_vibration.hpp @@ -0,0 +1,227 @@ +/** + * @file ode_attitude_with_cantilever_vibration.hpp + * @brief Class to implement Ordinary Differential Equations for Attitude propagator with cantilever vibration + */ + +#ifndef S2E_DYNAMICS_ATTITUDE_ODE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ +#define S2E_DYNAMICS_ATTITUDE_ODE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ + +#include +#include + +#include "attitude.hpp" + +namespace s2e::dynamics::attitude { + +/** + * @class AttitudeWithCantileverVibrationOde + * @brief Class to implement Ordinary Differential Equations for Attitude with Cantilever Vibration + * @note State variables in this ODE compose the following elenents (in order): angular_velocity_b_rad_s_ (3-dimension), + * angular_velocity_cantilever_rad_s_ (3-dimension), quaternion_i2b_ (4-dmension), and euler_angular_cantilever_rad_ (3-dimension) + */ +class AttitudeWithCantileverVibrationOde : public numerical_integration::InterfaceOde<13> { + public: + /** + * @fn SetStateFromPhysicalQuantities + * @brief Set state for calculating the ordinary differential equation from physical quantities + * @param [in] angular_velocity_b_rad_s: Angular velocity of the spacecraft @ body-fixed frame [rad/s] + * @param [in] angular_velocity_cantilever_rad_s: Angular velocity of the cantilever @ body frame [rad/s] + * @param [in] quaternion_i2b: True attitude of the spacecraft expressed by quaternion from the inertial frame to the body-fixed frame + * @param [in] euler_angule_cantilever_rad: Euler angle of the cantilever@ body-fixed frame [rad] + */ + math::Vector<13> SetStateFromPhysicalQuantities(const math::Vector<3> angular_velocity_b_rad_s, + const math::Vector<3> angular_velocity_cantilever_rad_s, const math::Quaternion quaternion_i2b, + const math::Vector<3> euler_angule_cantilever_rad) const { + math::Vector<13> state; + for (size_t i = 0; i < 3; i++) { + state[i] = angular_velocity_b_rad_s[i]; + } + for (size_t i = 0; i < 3; i++) { + state[i + 3] = angular_velocity_cantilever_rad_s[i]; + } + for (size_t i = 0; i < 4; i++) { + state[i + 6] = quaternion_i2b[i]; + } + for (size_t i = 0; i < 3; i++) { + state[i + 10] = euler_angule_cantilever_rad[i]; + } + return state; + } + + /** + * @fn SetPhysicalQuantitiesFromState + * @brief Set physical quantities from state acquired by calculation of the ordinary differential equation + * @param [in] state: state variables used to calculate the ordinary differential equation + */ + void SetPhysicalQuantitiesFromState(const math::Vector<13> state, math::Vector<3>& angular_velocity_b_rad_s, + math::Vector<3>& angular_velocity_cantilever_rad_s, math::Quaternion& quaternion_i2b, + math::Vector<3>& euler_angular_cantilever_rad) const { + for (size_t i = 0; i < 3; i++) { + angular_velocity_b_rad_s[i] = state[i]; + } + for (size_t i = 0; i < 3; i++) { + angular_velocity_cantilever_rad_s[i] = state[i + 3]; + } + for (size_t i = 0; i < 4; i++) { + quaternion_i2b[i] = state[i + 6]; + } + for (size_t i = 0; i < 3; i++) { + euler_angular_cantilever_rad[i] = state[i + 10]; + } + } + + math::Vector<13> DerivativeFunction(const double time_s, const math::Vector<13>& state) const override { + UNUSED(time_s); + + math::Vector<13> output; + + math::Vector<3> omega_b_rad_s; + math::Vector<3> omega_cantilever_rad_s; + math::Quaternion quaternion_i2b; + math::Vector<3> euler_angle_cantilever_rad; + + SetPhysicalQuantitiesFromState(state, omega_b_rad_s, omega_cantilever_rad_s, quaternion_i2b, euler_angle_cantilever_rad); + + math::Vector<3> angular_momentum_total_b_Nms = (previous_inertia_tensor_kgm2_ * omega_b_rad_s) + angular_momentum_reaction_wheel_b_Nms_; + math::Vector<3> net_torque_b_Nm = torque_b_Nm_ - math::OuterProduct(omega_b_rad_s, angular_momentum_total_b_Nms) - torque_inertia_tensor_b_Nm_; + + math::Vector<3> angular_accelaration_cantilever_rad_s2 = + -(inverse_equivalent_inertia_tensor_cantilever_ * + (attenuation_coefficient_ * omega_cantilever_rad_s + spring_coefficient_ * euler_angle_cantilever_rad)) - + inverse_inertia_tensor_ * net_torque_b_Nm; + + math::Vector<3> rhs = inverse_inertia_tensor_ * (net_torque_b_Nm - inertia_tensor_cantilever_kgm2_ * angular_accelaration_cantilever_rad_s2); + + for (size_t i = 0; i < 3; ++i) { + output[i] = rhs[i]; + } + + for (size_t i = 0; i < 3; i++) { + output[i + 3] = angular_accelaration_cantilever_rad_s2[i]; + } + + math::Vector<4> d_quaternion = 0.5 * CalcAngularVelocityMatrix(omega_b_rad_s) * (math::Vector<4>(quaternion_i2b)); + + for (size_t i = 0; i < 4; i++) { + output[i + 6] = d_quaternion[i]; + } + + for (size_t i = 0; i < 3; i++) { + output[i + 10] = omega_cantilever_rad_s[i]; + } + + // The function is used to output the derivative of each corresponding physical quantity. + output = SetStateFromPhysicalQuantities(rhs, angular_accelaration_cantilever_rad_s2, math::Quaternion(d_quaternion), omega_cantilever_rad_s); + + return output; + } + + // Getter + /** + * @fn GetAttenuationCoefficient + * @brief Get attenuation coefficient + */ + inline double GetAttenuationCoefficient() { return attenuation_coefficient_; } + /** + * @fn GetSpringCoefficient + * @brief Get spring coefficient + */ + inline double GetSpringCoefficient() { return spring_coefficient_; } + /** + * @fn GetTorqueInertiaTensor_b_Nm + * @brief Get torque generated by inertia tensor [Nm] + */ + inline math::Vector<3> GetTorqueInertiaTensor_b_Nm() { return torque_inertia_tensor_b_Nm_; } + /** + * @fn GetInverseInertiaTensor + * @brief Get inverse of inertia tensor + */ + inline math::Matrix<3, 3> GetInverseInertiaTensor() { return inverse_inertia_tensor_; } + /** + * @fn GetPreviousInertiaTensor_kgm2 + * @brief Get previous inertia tensor [kgm2] + */ + inline math::Matrix<3, 3> GetPreviousInertiaTensor_kgm2() { return previous_inertia_tensor_kgm2_; } + /** + * @fn GetInertiaTensorCantilever_kgm2 + * @brief Get inertia tensor of the cantilever [kgm2] + */ + inline math::Matrix<3, 3> GetInertiaTensorCantilever_kgm2() { return inertia_tensor_cantilever_kgm2_; } + /** + * @fn GetInverseEquivalentInertiaTensorCantilever + * @brief Get inverse of inertia tensor of the cantilever + */ + inline math::Matrix<3, 3> GetInverseEquivalentInertiaTensorCantilever() { return inverse_equivalent_inertia_tensor_cantilever_; } + + // Setter + /** + * @fn SetAttenuationCoefficient + * @brief Set attenuation coefficient + */ + inline void SetAttenuationCoefficient(const double attenuation_coefficient) { attenuation_coefficient_ = attenuation_coefficient; } + /** + * @fn SetSpringCoefficient + * @brief Set spring coefficient + */ + inline void SetSpringCoefficient(const double spring_coefficient) { spring_coefficient_ = spring_coefficient; } + /** + * @fn SetTorque_b_Nm + * @brief Set torque acting on the spacecraft on the body fixed frame [Nm] + */ + inline void SetTorque_b_Nm(const math::Vector<3> torque_b_Nm) { torque_b_Nm_ = torque_b_Nm; } + /** + * @fn SetTorqueInertiaTensor_b_Nm + * @brief Set torque generated by inertia tensor [Nm] + */ + inline void SetTorqueInertiaTensor_b_Nm(const math::Vector<3> torque_inertia_tensor_b_Nm) { + torque_inertia_tensor_b_Nm_ = torque_inertia_tensor_b_Nm; + } + /** + * @fn SetAngularMomentumReactionWheel_b_Nms + * @brief Set angular momentum of reaction wheel in the body fixed frame [Nms] + */ + inline void SetAngularMomentumReactionWheel_b_Nms(const math::Vector<3> angular_momentum_reaction_wheel_b_Nms) { + angular_momentum_reaction_wheel_b_Nms_ = angular_momentum_reaction_wheel_b_Nms; + } + /** + * @fn SetInverseInertiaTensor + * @brief Set inverse of inertia tensor + */ + inline void SetInverseInertiaTensor(const math::Matrix<3, 3> inverse_inertia_tensor) { inverse_inertia_tensor_ = inverse_inertia_tensor; } + /** + * @fn SetPreviousInertiaTensor_kgm2 + * @brief Set previous inertia tensor [kgm2] + */ + inline void SetPreviousInertiaTensor_kgm2(const math::Matrix<3, 3> previous_inertia_tensor_kgm2) { + previous_inertia_tensor_kgm2_ = previous_inertia_tensor_kgm2; + } + /** + * @fn SetInertiaTensorCantilever_kgm2 + * @brief Set inertia tensor of the cantilever [kgm2] + */ + inline void SetInertiaTensorCantilever_kgm2(const math::Matrix<3, 3> inertia_tensor_cantilever_kgm2) { + inertia_tensor_cantilever_kgm2_ = inertia_tensor_cantilever_kgm2; + } + /** + * @fn SetInverseEquivalentInertiaTensorCantilever + * @brief Set inverse of inertia tensor of the cantilever + */ + inline void SetInverseEquivalentInertiaTensorCantilever(const math::Matrix<3, 3> inverse_equivalent_inertia_tensor_cantilever) { + inverse_equivalent_inertia_tensor_cantilever_ = inverse_equivalent_inertia_tensor_cantilever; + } + + protected: + double attenuation_coefficient_ = 0.0; //!< Attenuation coefficient + double spring_coefficient_ = 0.0; //!< Spring coefficient + math::Vector<3> torque_b_Nm_{0.0}; //!< Torque in the body fixed frame [Nm] + math::Vector<3> torque_inertia_tensor_b_Nm_{0.0}; //!< Torque generated by inertia tensor [Nm] + math::Vector<3> angular_momentum_reaction_wheel_b_Nms_{0.0}; //!< Angular momentum of reaction wheel in the body fixed frame [Nms] + math::Matrix<3, 3> inverse_inertia_tensor_{0.0}; //!< Inverse of inertia tensor + math::Matrix<3, 3> previous_inertia_tensor_kgm2_{0.0}; //!< Previous inertia tensor [kgm2] + math::Matrix<3, 3> inertia_tensor_cantilever_kgm2_{0.0}; //!< Inertia tensor of the cantilever [kgm2] + math::Matrix<3, 3> inverse_equivalent_inertia_tensor_cantilever_{0.0}; //!< Inverse of inertia tensor of the cantilever +}; + +} // namespace s2e::dynamics::attitude + +#endif // S2E_DYNAMICS_ATTITUDE_ODE_ATTITUDE_WITH_CANTILEVER_VIBRATION_HPP_ diff --git a/src/dynamics/dynamics.cpp b/src/dynamics/dynamics.cpp index 04d0886a7..a096eedad 100644 --- a/src/dynamics/dynamics.cpp +++ b/src/dynamics/dynamics.cpp @@ -5,11 +5,11 @@ #include "dynamics.hpp" -#include "../simulation/multiple_spacecraft/relative_information.hpp" +namespace s2e::dynamics { -Dynamics::Dynamics(const SimulationConfiguration* simulation_configuration, const SimulationTime* simulation_time, - const LocalEnvironment* local_environment, const int spacecraft_id, Structure* structure, - RelativeInformation* relative_information) +Dynamics::Dynamics(const simulation::SimulationConfiguration* simulation_configuration, const environment::SimulationTime* simulation_time, + const environment::LocalEnvironment* local_environment, const int spacecraft_id, spacecraft::Structure* structure, + simulation::RelativeInformation* relative_information) : structure_(structure), local_environment_(local_environment) { Initialize(simulation_configuration, simulation_time, spacecraft_id, structure, relative_information); } @@ -20,23 +20,24 @@ Dynamics::~Dynamics() { delete temperature_; } -void Dynamics::Initialize(const SimulationConfiguration* simulation_configuration, const SimulationTime* simulation_time, const int spacecraft_id, - Structure* structure, RelativeInformation* relative_information) { - const LocalCelestialInformation& local_celestial_information = local_environment_->GetCelestialInformation(); +void Dynamics::Initialize(const simulation::SimulationConfiguration* simulation_configuration, const environment::SimulationTime* simulation_time, + const int spacecraft_id, spacecraft::Structure* structure, simulation::RelativeInformation* relative_information) { + const environment::LocalCelestialInformation& local_celestial_information = local_environment_->GetCelestialInformation(); // Initialize - orbit_ = InitOrbit(&(local_celestial_information.GetGlobalInformation()), simulation_configuration->spacecraft_file_list_[spacecraft_id], - simulation_time->GetOrbitRkStepTime_s(), simulation_time->GetCurrentTime_jd(), - local_celestial_information.GetGlobalInformation().GetCenterBodyGravityConstant_m3_s2(), "ORBIT", relative_information); - attitude_ = InitAttitude(simulation_configuration->spacecraft_file_list_[spacecraft_id], orbit_, &local_celestial_information, - simulation_time->GetAttitudeRkStepTime_s(), structure->GetKinematicsParameters().GetInertiaTensor_b_kgm2(), spacecraft_id); - temperature_ = InitTemperature(simulation_configuration->spacecraft_file_list_[spacecraft_id], simulation_time->GetThermalRkStepTime_s(), - &(local_environment_->GetSolarRadiationPressure())); + orbit_ = orbit::InitOrbit(&(local_celestial_information.GetGlobalInformation()), simulation_configuration->spacecraft_file_list_[spacecraft_id], + simulation_time->GetOrbitRkStepTime_s(), simulation_time->GetCurrentTime_jd(), + local_celestial_information.GetGlobalInformation().GetCenterBodyGravityConstant_m3_s2(), "ORBIT", relative_information); + attitude_ = attitude::InitAttitude(simulation_configuration->spacecraft_file_list_[spacecraft_id], orbit_, &local_celestial_information, + simulation_time->GetAttitudeRkStepTime_s(), structure->GetKinematicsParameters().GetInertiaTensor_b_kgm2(), + spacecraft_id); + temperature_ = thermal::InitTemperature(simulation_configuration->spacecraft_file_list_[spacecraft_id], simulation_time->GetThermalRkStepTime_s(), + &(local_environment_->GetSolarRadiationPressure()), &(local_environment_->GetEarthAlbedo())); // To get initial value orbit_->UpdateByAttitude(attitude_->GetQuaternion_i2b()); } -void Dynamics::Update(const SimulationTime* simulation_time, const LocalCelestialInformation* local_celestial_information) { +void Dynamics::Update(const environment::SimulationTime* simulation_time, const environment::LocalCelestialInformation* local_celestial_information) { // Attitude propagation if (simulation_time->GetAttitudePropagateFlag()) { attitude_->Propagate(simulation_time->GetElapsedTime_s()); @@ -50,22 +51,20 @@ void Dynamics::Update(const SimulationTime* simulation_time, const LocalCelestia // Thermal if (simulation_time->GetThermalPropagateFlag()) { - std::string sun_str = "SUN"; - char* c_sun = new char[sun_str.size() + 1]; - std::char_traits::copy(c_sun, sun_str.c_str(), sun_str.size() + 1); // string -> char* - temperature_->Propagate(local_celestial_information->GetPositionFromSpacecraft_b_m(c_sun), simulation_time->GetElapsedTime_s()); - delete[] c_sun; + temperature_->Propagate(local_celestial_information, simulation_time->GetElapsedTime_s()); } } void Dynamics::ClearForceTorque(void) { - libra::Vector<3> zero(0.0); + math::Vector<3> zero(0.0); attitude_->SetTorque_b_Nm(zero); orbit_->SetAcceleration_i_m_s2(zero); } -void Dynamics::LogSetup(Logger& logger) { +void Dynamics::LogSetup(logger::Logger& logger) { logger.AddLogList(attitude_); logger.AddLogList(orbit_); logger.AddLogList(temperature_); } + +} // namespace s2e::dynamics diff --git a/src/dynamics/dynamics.hpp b/src/dynamics/dynamics.hpp index a6b5044f1..4bfd91673 100644 --- a/src/dynamics/dynamics.hpp +++ b/src/dynamics/dynamics.hpp @@ -9,7 +9,8 @@ #include "../environment/global/simulation_time.hpp" #include "../environment/local/local_environment.hpp" -#include "../library/math/vector.hpp" +#include "../math_physics/math/vector.hpp" +#include "../simulation/multiple_spacecraft/relative_information.hpp" #include "../simulation/simulation_configuration.hpp" #include "../simulation/spacecraft/structure/structure.hpp" #include "dynamics/attitude/initialize_attitude.hpp" @@ -17,8 +18,14 @@ #include "dynamics/thermal/node.hpp" #include "dynamics/thermal/temperature.hpp" +namespace s2e::simulation { class RelativeInformation; +} +namespace s2e::environment { class LocalEnvironment; +} + +namespace s2e::dynamics { /** * @class Dynamics @@ -33,11 +40,12 @@ class Dynamics { * @param [in] simulation_time: Simulation time * @param [in] local_celestial_information: Local celestial information * @param [in] spacecraft_id: Spacecraft ID of the spacecraft - * @param [in] structure: Structure of the spacecraft + * @param [in] structure: spacecraft::Structure of the spacecraft * @param [in] relative_information: Relative information */ - Dynamics(const SimulationConfiguration* simulation_configuration, const SimulationTime* simulation_time, const LocalEnvironment* local_environment, - const int spacecraft_id, Structure* structure, RelativeInformation* relative_information = (RelativeInformation*)nullptr); + Dynamics(const simulation::SimulationConfiguration* simulation_configuration, const environment::SimulationTime* simulation_time, + const environment::LocalEnvironment* local_environment, const int spacecraft_id, spacecraft::Structure* structure, + simulation::RelativeInformation* relative_information = (simulation::RelativeInformation*)nullptr); /** * @fn ~Dynamics * @brief Destructor @@ -50,26 +58,26 @@ class Dynamics { * @param [in] simulation_time: Simulation time * @param [in] local_celestial_information: Local celestial information */ - void Update(const SimulationTime* simulation_time, const LocalCelestialInformation* local_celestial_information); + void Update(const environment::SimulationTime* simulation_time, const environment::LocalCelestialInformation* local_celestial_information); /** * @fn LogSetup * @brief Log setup for dynamics calculation */ - void LogSetup(Logger& logger); + void LogSetup(logger::Logger& logger); /** * @fn AddTorque_b_Nm * @brief Add input torque for the attitude dynamics propagation * @param [in] torque_b_Nm: Torque in the body fixed frame [Nm] */ - inline void AddTorque_b_Nm(libra::Vector<3> torque_b_Nm) { attitude_->AddTorque_b_Nm(torque_b_Nm); } + inline void AddTorque_b_Nm(math::Vector<3> torque_b_Nm) { attitude_->AddTorque_b_Nm(torque_b_Nm); } /** * @fn AddForce_b_N * @brief Add input force for the orbit dynamics propagation * @param [in] force_b_N: Force in the body fixed frame [N] */ - inline void AddForce_b_N(libra::Vector<3> force_b_N) { + inline void AddForce_b_N(math::Vector<3> force_b_N) { orbit_->AddForce_b_N(force_b_N, attitude_->GetQuaternion_i2b(), structure_->GetKinematicsParameters().GetMass_kg()); } /** @@ -77,7 +85,7 @@ class Dynamics { * @brief Add input acceleration for the orbit dynamics propagation * @param [in] acceleration_i_m_s2: Acceleration in the inertial fixed frame [N] */ - inline void AddAcceleration_i_m_s2(libra::Vector<3> acceleration_i_m_s2) { orbit_->AddAcceleration_i_m_s2(acceleration_i_m_s2); } + inline void AddAcceleration_i_m_s2(math::Vector<3> acceleration_i_m_s2) { orbit_->AddAcceleration_i_m_s2(acceleration_i_m_s2); } /** * @fn ClearForceTorque @@ -89,29 +97,29 @@ class Dynamics { * @fn GetAttitude * @brief Return Attitude class */ - inline const Attitude& GetAttitude() const { return *attitude_; } + inline const attitude::Attitude& GetAttitude() const { return *attitude_; } /** * @fn GetOrbit * @brief Return Orbit class */ - inline const Orbit& GetOrbit() const { return *orbit_; } + inline const orbit::Orbit& GetOrbit() const { return *orbit_; } /** * @fn GetTemperature * @brief Return Temperature class */ - inline const Temperature& GetTemperature() const { return *temperature_; } + inline const thermal::Temperature& GetTemperature() const { return *temperature_; } /** * @fn SetAttitude * @brief Return Attitude class to change the Attitude */ - inline Attitude& SetAttitude() const { return *attitude_; } + inline attitude::Attitude& SetAttitude() const { return *attitude_; } private: - Attitude* attitude_; //!< Attitude dynamics - Orbit* orbit_; //!< Orbit dynamics - Temperature* temperature_; //!< Thermal dynamics - const Structure* structure_; //!< Structure information - const LocalEnvironment* local_environment_; //!< Local environment + attitude::Attitude* attitude_; //!< Attitude dynamics + orbit::Orbit* orbit_; //!< Orbit dynamics + thermal::Temperature* temperature_; //!< Thermal dynamics + const spacecraft::Structure* structure_; //!< Structure information + const environment::LocalEnvironment* local_environment_; //!< Local environment /** * @fn Initialize @@ -123,8 +131,11 @@ class Dynamics { * @param [in] structure: Structure of the spacecraft * @param [in] relative_information: Relative information */ - void Initialize(const SimulationConfiguration* simulation_configuration, const SimulationTime* simulation_time, const int spacecraft_id, - Structure* structure, RelativeInformation* relative_information = (RelativeInformation*)nullptr); + void Initialize(const simulation::SimulationConfiguration* simulation_configuration, const environment::SimulationTime* simulation_time, + const int spacecraft_id, spacecraft::Structure* structure, + simulation::RelativeInformation* relative_information = (simulation::RelativeInformation*)nullptr); }; +} // namespace s2e::dynamics + #endif // S2E_DYNAMICS_DYNAMICS_HPP_ diff --git a/src/dynamics/orbit/encke_orbit_propagation.cpp b/src/dynamics/orbit/encke_orbit_propagation.cpp index 941665edf..5a1ae0d0b 100644 --- a/src/dynamics/orbit/encke_orbit_propagation.cpp +++ b/src/dynamics/orbit/encke_orbit_propagation.cpp @@ -5,15 +5,17 @@ #include "encke_orbit_propagation.hpp" -#include +#include -#include "../../library/orbit/orbital_elements.hpp" +#include "../../math_physics/orbit/orbital_elements.hpp" -EnckeOrbitPropagation::EnckeOrbitPropagation(const CelestialInformation* celestial_information, const double gravity_constant_m3_s2, - const double propagation_step_s, const double current_time_jd, const libra::Vector<3> position_i_m, - const libra::Vector<3> velocity_i_m_s, const double error_tolerance) +namespace s2e::dynamics::orbit { + +EnckeOrbitPropagation::EnckeOrbitPropagation(const environment::CelestialInformation* celestial_information, const double gravity_constant_m3_s2, + const double propagation_step_s, const double current_time_jd, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s, const double error_tolerance) : Orbit(celestial_information), - libra::OrdinaryDifferentialEquation<6>(propagation_step_s), + math::OrdinaryDifferentialEquation<6>(propagation_step_s), gravity_constant_m3_s2_(gravity_constant_m3_s2), error_tolerance_(error_tolerance), propagation_step_s_(propagation_step_s) { @@ -60,9 +62,9 @@ void EnckeOrbitPropagation::Propagate(const double end_time_s, const double curr } // Functions for OrdinaryDifferentialEquation -void EnckeOrbitPropagation::DerivativeFunction(double t, const libra::Vector<6>& state, libra::Vector<6>& rhs) { +void EnckeOrbitPropagation::DerivativeFunction(double t, const math::Vector<6>& state, math::Vector<6>& rhs) { UNUSED(t); - libra::Vector<3> difference_position_i_m_m, difference_acc_i_m_s2; + math::Vector<3> difference_position_i_m_m, difference_acc_i_m_s2; for (int i = 0; i < 3; i++) { difference_position_i_m_m[i] = state[i]; } @@ -83,21 +85,21 @@ void EnckeOrbitPropagation::DerivativeFunction(double t, const libra::Vector<6>& } // Private Functions -void EnckeOrbitPropagation::Initialize(double current_time_jd, libra::Vector<3> reference_position_i_m, libra::Vector<3> reference_velocity_i_m_s) { +void EnckeOrbitPropagation::Initialize(double current_time_jd, math::Vector<3> reference_position_i_m, math::Vector<3> reference_velocity_i_m_s) { // General spacecraft_acceleration_i_m_s2_.FillUp(0.0); // reference orbit reference_position_i_m_ = reference_position_i_m; reference_velocity_i_m_s_ = reference_velocity_i_m_s; - OrbitalElements oe_ref(gravity_constant_m3_s2_, current_time_jd, reference_position_i_m, reference_velocity_i_m_s); - reference_kepler_orbit = KeplerOrbit(gravity_constant_m3_s2_, oe_ref); + s2e::orbit::OrbitalElements oe_ref(gravity_constant_m3_s2_, current_time_jd, reference_position_i_m, reference_velocity_i_m_s); + reference_kepler_orbit = s2e::orbit::KeplerOrbit(gravity_constant_m3_s2_, oe_ref); // difference orbit difference_position_i_m_.FillUp(0.0); difference_velocity_i_m_s_.FillUp(0.0); - libra::Vector<6> zero(0.0f); + math::Vector<6> zero(0.0f); Setup(0.0, zero); UpdateSatOrbit(); @@ -111,11 +113,11 @@ void EnckeOrbitPropagation::UpdateSatOrbit() { TransformEcefToGeodetic(); } -double EnckeOrbitPropagation::CalcQFunction(libra::Vector<3> difference_position_i_m) { +double EnckeOrbitPropagation::CalcQFunction(math::Vector<3> difference_position_i_m) { double r2; r2 = InnerProduct(spacecraft_position_i_m_, spacecraft_position_i_m_); - libra::Vector<3> dr_2r; + math::Vector<3> dr_2r; dr_2r = difference_position_i_m - 2.0 * spacecraft_position_i_m_; double q = InnerProduct(difference_position_i_m, dr_2r) / r2; @@ -124,3 +126,5 @@ double EnckeOrbitPropagation::CalcQFunction(libra::Vector<3> difference_position return q_func; } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/encke_orbit_propagation.hpp b/src/dynamics/orbit/encke_orbit_propagation.hpp index 03d42f696..68542f198 100644 --- a/src/dynamics/orbit/encke_orbit_propagation.hpp +++ b/src/dynamics/orbit/encke_orbit_propagation.hpp @@ -6,15 +6,17 @@ #ifndef S2E_DYNAMICS_ORBIT_ENCKE_ORBIT_PROPAGATION_HPP_ #define S2E_DYNAMICS_ORBIT_ENCKE_ORBIT_PROPAGATION_HPP_ -#include "../../library/math/ordinary_differential_equation.hpp" -#include "../../library/orbit/kepler_orbit.hpp" +#include "../../math_physics/math/ordinary_differential_equation.hpp" +#include "../../math_physics/orbit/kepler_orbit.hpp" #include "orbit.hpp" +namespace s2e::dynamics::orbit { + /** * @class EnckeOrbitPropagation * @brief Class to propagate spacecraft orbit with Encke's method */ -class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEquation<6> { +class EnckeOrbitPropagation : public Orbit, public math::OrdinaryDifferentialEquation<6> { public: /** * @fn EnckeOrbitPropagation @@ -27,9 +29,9 @@ class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEq * @param [in] velocity_i_m_s: Initial value of velocity in the inertial frame [m/s] * @param [in] error_tolerance: Error tolerance threshold */ - EnckeOrbitPropagation(const CelestialInformation* celestial_information, const double gravity_constant_m3_s2, const double propagation_step_s, - const double current_time_jd, const libra::Vector<3> position_i_m, const libra::Vector<3> velocity_i_m_s, - const double error_tolerance); + EnckeOrbitPropagation(const environment::CelestialInformation* celestial_information, const double gravity_constant_m3_s2, + const double propagation_step_s, const double current_time_jd, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s, const double error_tolerance); /** * @fn ~EnckeOrbitPropagation * @brief Destructor @@ -53,7 +55,7 @@ class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEq * @param [in] state: Position and velocity as state vector * @param [out] rhs: Output of the function */ - virtual void DerivativeFunction(double t, const libra::Vector<6>& state, libra::Vector<6>& rhs); + virtual void DerivativeFunction(double t, const math::Vector<6>& state, math::Vector<6>& rhs); private: // General @@ -63,13 +65,13 @@ class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEq double propagation_time_s_; //!< Simulation current time for numerical integration by RK4 // reference orbit - libra::Vector<3> reference_position_i_m_; //!< Reference orbit position in the inertial frame [m] - libra::Vector<3> reference_velocity_i_m_s_; //!< Reference orbit velocity in the inertial frame [m/s] - KeplerOrbit reference_kepler_orbit; //!< Reference Kepler orbital element + math::Vector<3> reference_position_i_m_; //!< Reference orbit position in the inertial frame [m] + math::Vector<3> reference_velocity_i_m_s_; //!< Reference orbit velocity in the inertial frame [m/s] + s2e::orbit::KeplerOrbit reference_kepler_orbit; //!< Reference Kepler orbital element // difference orbit - libra::Vector<3> difference_position_i_m_; //!< Difference orbit position in the inertial frame [m] - libra::Vector<3> difference_velocity_i_m_s_; //!< Difference orbit velocity in the inertial frame [m/s] + math::Vector<3> difference_position_i_m_; //!< Difference orbit position in the inertial frame [m] + math::Vector<3> difference_velocity_i_m_s_; //!< Difference orbit velocity in the inertial frame [m/s] // functions /** @@ -79,7 +81,7 @@ class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEq * @param [in] reference_position_i_m: Initial value of reference orbit position in the inertial frame [m] * @param [in] reference_velocity_i_m_s: Initial value of reference orbit position in the inertial frame [m] */ - void Initialize(const double current_time_jd, const libra::Vector<3> reference_position_i_m, const libra::Vector<3> reference_velocity_i_m_s); + void Initialize(const double current_time_jd, const math::Vector<3> reference_position_i_m, const math::Vector<3> reference_velocity_i_m_s); /** * @fn UpdateSatOrbit * @brief Update satellite orbit @@ -90,7 +92,9 @@ class EnckeOrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEq * @brief Calculate Q function * @param [in] difference_position_i_m: Difference of position in the inertial frame [m] */ - double CalcQFunction(const libra::Vector<3> difference_position_i_m); + double CalcQFunction(const math::Vector<3> difference_position_i_m); }; +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_ENCKE_ORBIT_PROPAGATION_HPP_ diff --git a/src/dynamics/orbit/initialize_orbit.cpp b/src/dynamics/orbit/initialize_orbit.cpp index c05b3f6bf..e039adb98 100644 --- a/src/dynamics/orbit/initialize_orbit.cpp +++ b/src/dynamics/orbit/initialize_orbit.cpp @@ -4,17 +4,20 @@ */ #include "initialize_orbit.hpp" -#include +#include #include "encke_orbit_propagation.hpp" #include "kepler_orbit_propagation.hpp" #include "relative_orbit.hpp" #include "rk4_orbit_propagation.hpp" #include "sgp4_orbit_propagation.hpp" +#include "time_series_file_orbit_propagation.hpp" -Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string initialize_file, double step_width_s, double current_time_jd, - double gravity_constant_m3_s2, std::string section, RelativeInformation* relative_information) { - auto conf = IniAccess(initialize_file); +namespace s2e::dynamics::orbit { + +Orbit* InitOrbit(const environment::CelestialInformation* celestial_information, std::string initialize_file, double step_width_s, + double current_time_jd, double gravity_constant_m3_s2, std::string section, simulation::RelativeInformation* relative_information) { + auto conf = setting_file_reader::IniAccess(initialize_file); const char* section_ = section.c_str(); Orbit* orbit; @@ -26,9 +29,9 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string if (propagate_mode == "RK4") { // initialize RK4 orbit propagator - libra::Vector<3> position_i_m; - libra::Vector<3> velocity_i_m_s; - libra::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); + math::Vector<3> position_i_m; + math::Vector<3> velocity_i_m_s; + math::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); for (size_t i = 0; i < 3; i++) { position_i_m[i] = pos_vel[i]; velocity_i_m_s[i] = pos_vel[i + 3]; @@ -46,12 +49,13 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string // initialize orbit for relative dynamics of formation flying RelativeOrbit::RelativeOrbitUpdateMethod update_method = (RelativeOrbit::RelativeOrbitUpdateMethod)(conf.ReadInt(section_, "relative_orbit_update_method")); - RelativeOrbitModel relative_dynamics_model_type = (RelativeOrbitModel)(conf.ReadInt(section_, "relative_dynamics_model_type")); - StmModel stm_model_type = (StmModel)(conf.ReadInt(section_, "stm_model_type")); + s2e::orbit::RelativeOrbitModel relative_dynamics_model_type = + (s2e::orbit::RelativeOrbitModel)(conf.ReadInt(section_, "relative_dynamics_model_type")); + s2e::orbit::StmModel stm_model_type = (s2e::orbit::StmModel)(conf.ReadInt(section_, "stm_model_type")); - libra::Vector<3> init_relative_position_lvlh; + math::Vector<3> init_relative_position_lvlh; conf.ReadVector<3>(section_, "initial_relative_position_lvlh_m", init_relative_position_lvlh); - libra::Vector<3> init_relative_velocity_lvlh; + math::Vector<3> init_relative_velocity_lvlh; conf.ReadVector<3>(section_, "initial_relative_velocity_lvlh_m_s", init_relative_velocity_lvlh); // There is a possibility that the orbit of the reference sat is not initialized when RelativeOrbit initialization is called To ensure that @@ -62,15 +66,15 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string init_relative_velocity_lvlh, update_method, relative_dynamics_model_type, stm_model_type, relative_information); } else if (propagate_mode == "KEPLER") { // initialize orbit for Kepler propagation - OrbitalElements oe; + s2e::orbit::OrbitalElements oe; // TODO: init_mode_kepler should be removed in the next major update if (initialize_mode == OrbitInitializeMode::kInertialPositionAndVelocity) { // initialize with position and velocity - libra::Vector<3> init_pos_m; + math::Vector<3> init_pos_m; conf.ReadVector<3>(section_, "initial_position_i_m", init_pos_m); - libra::Vector<3> init_vel_m_s; + math::Vector<3> init_vel_m_s; conf.ReadVector<3>(section_, "initial_velocity_i_m_s", init_vel_m_s); - oe = OrbitalElements(gravity_constant_m3_s2, current_time_jd, init_pos_m, init_vel_m_s); + oe = s2e::orbit::OrbitalElements(gravity_constant_m3_s2, current_time_jd, init_pos_m, init_vel_m_s); } else { // initialize with orbital elements double semi_major_axis_m = conf.ReadDouble(section_, "semi_major_axis_m"); @@ -79,15 +83,15 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string double raan_rad = conf.ReadDouble(section_, "raan_rad"); double arg_perigee_rad = conf.ReadDouble(section_, "argument_of_perigee_rad"); double epoch_jday = conf.ReadDouble(section_, "epoch_jday"); - oe = OrbitalElements(epoch_jday, semi_major_axis_m, eccentricity, inclination_rad, raan_rad, arg_perigee_rad); + oe = s2e::orbit::OrbitalElements(epoch_jday, semi_major_axis_m, eccentricity, inclination_rad, raan_rad, arg_perigee_rad); } - KeplerOrbit kepler_orbit(gravity_constant_m3_s2, oe); + s2e::orbit::KeplerOrbit kepler_orbit(gravity_constant_m3_s2, oe); orbit = new KeplerOrbitPropagation(celestial_information, current_time_jd, kepler_orbit); } else if (propagate_mode == "ENCKE") { // initialize orbit for Encke's method - libra::Vector<3> position_i_m; - libra::Vector<3> velocity_i_m_s; - libra::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); + math::Vector<3> position_i_m; + math::Vector<3> velocity_i_m_s; + math::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); for (size_t i = 0; i < 3; i++) { position_i_m[i] = pos_vel[i]; velocity_i_m_s[i] = pos_vel[i + 3]; @@ -96,13 +100,23 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string double error_tolerance = conf.ReadDouble(section_, "error_tolerance"); orbit = new EnckeOrbitPropagation(celestial_information, gravity_constant_m3_s2, step_width_s, current_time_jd, position_i_m, velocity_i_m_s, error_tolerance); + } else if (propagate_mode == "TIME_SERIES_FILE") { + // initialize orbit for propagation with time series file + const std::string time_series_file_path = conf.ReadString(section_, "time_series_file_path"); + const int number_of_interpolation = conf.ReadInt(section_, "number_of_interpolation"); + const int interpolation_method = conf.ReadInt(section_, "interpolation_method"); + const double orbital_period_correction_s = conf.ReadDouble(section_, "orbital_period_correction_s"); + + orbit = new TimeSeriesFileOrbitPropagation(celestial_information, time_series_file_path, number_of_interpolation, interpolation_method, + orbital_period_correction_s, current_time_jd); + } else { std::cerr << "ERROR: orbit propagation mode: " << propagate_mode << " is not defined!" << std::endl; std::cerr << "The orbit mode is automatically set as RK4" << std::endl; - libra::Vector<3> position_i_m; - libra::Vector<3> velocity_i_m_s; - libra::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); + math::Vector<3> position_i_m; + math::Vector<3> velocity_i_m_s; + math::Vector<6> pos_vel = InitializePosVel(initialize_file, current_time_jd, gravity_constant_m3_s2); for (size_t i = 0; i < 3; i++) { position_i_m[i] = pos_vel[i]; velocity_i_m_s[i] = pos_vel[i + 3]; @@ -115,12 +129,12 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string return orbit; } -libra::Vector<6> InitializePosVel(std::string initialize_file, double current_time_jd, double gravity_constant_m3_s2, std::string section) { - auto conf = IniAccess(initialize_file); +math::Vector<6> InitializePosVel(std::string initialize_file, double current_time_jd, double gravity_constant_m3_s2, std::string section) { + auto conf = setting_file_reader::IniAccess(initialize_file); const char* section_ = section.c_str(); - libra::Vector<3> position_i_m; - libra::Vector<3> velocity_i_m_s; - libra::Vector<6> pos_vel; + math::Vector<3> position_i_m; + math::Vector<3> velocity_i_m_s; + math::Vector<6> pos_vel; OrbitInitializeMode initialize_mode = SetOrbitInitializeMode(conf.ReadString(section_, "initialize_mode")); if (initialize_mode == OrbitInitializeMode::kOrbitalElements) { @@ -130,8 +144,8 @@ libra::Vector<6> InitializePosVel(std::string initialize_file, double current_ti double raan_rad = conf.ReadDouble(section_, "raan_rad"); double arg_perigee_rad = conf.ReadDouble(section_, "argument_of_perigee_rad"); double epoch_jday = conf.ReadDouble(section_, "epoch_jday"); - OrbitalElements oe(epoch_jday, semi_major_axis_m, eccentricity, inclination_rad, raan_rad, arg_perigee_rad); - KeplerOrbit kepler_orbit(gravity_constant_m3_s2, oe); + s2e::orbit::OrbitalElements oe(epoch_jday, semi_major_axis_m, eccentricity, inclination_rad, raan_rad, arg_perigee_rad); + s2e::orbit::KeplerOrbit kepler_orbit(gravity_constant_m3_s2, oe); kepler_orbit.CalcOrbit(current_time_jd); position_i_m = kepler_orbit.GetPosition_i_m(); @@ -148,3 +162,5 @@ libra::Vector<6> InitializePosVel(std::string initialize_file, double current_ti return pos_vel; } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/initialize_orbit.hpp b/src/dynamics/orbit/initialize_orbit.hpp index 442b5ff72..dd38c127c 100644 --- a/src/dynamics/orbit/initialize_orbit.hpp +++ b/src/dynamics/orbit/initialize_orbit.hpp @@ -6,11 +6,15 @@ #ifndef S2E_DYNAMICS_ORBIT_INITIALIZE_ORBIT_HPP_ #define S2E_DYNAMICS_ORBIT_INITIALIZE_ORBIT_HPP_ -#include +#include #include "orbit.hpp" +namespace s2e::simulation { class RelativeInformation; +} + +namespace s2e::dynamics::orbit { /** * @fn InitOrbit @@ -23,9 +27,9 @@ class RelativeInformation; * @param [in] section: Section name * @param [in] relative_information: Relative information */ -Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string initialize_file, double step_width_s, double current_time_jd, - double gravity_constant_m3_s2, std::string section = "ORBIT", - RelativeInformation* relative_information = (RelativeInformation*)nullptr); +Orbit* InitOrbit(const environment::CelestialInformation* celestial_information, std::string initialize_file, double step_width_s, + double current_time_jd, double gravity_constant_m3_s2, std::string section = "ORBIT", + simulation::RelativeInformation* relative_information = (simulation::RelativeInformation*)nullptr); /** * @fn InitializePosVel @@ -35,6 +39,8 @@ Orbit* InitOrbit(const CelestialInformation* celestial_information, std::string * @param [in] gravity_constant_m3_s2: Gravity constant [m3/s2] * @param [in] section: Section name */ -libra::Vector<6> InitializePosVel(std::string initialize_file, double current_time_jd, double gravity_constant_m3_s2, std::string section = "ORBIT"); +math::Vector<6> InitializePosVel(std::string initialize_file, double current_time_jd, double gravity_constant_m3_s2, std::string section = "ORBIT"); + +} // namespace s2e::dynamics::orbit #endif // S2E_DYNAMICS_ORBIT_INITIALIZE_ORBIT_HPP_ diff --git a/src/dynamics/orbit/kepler_orbit_propagation.cpp b/src/dynamics/orbit/kepler_orbit_propagation.cpp index 776c468d2..4e9050844 100644 --- a/src/dynamics/orbit/kepler_orbit_propagation.cpp +++ b/src/dynamics/orbit/kepler_orbit_propagation.cpp @@ -4,11 +4,13 @@ */ #include "kepler_orbit_propagation.hpp" -#include +#include -#include "../../library/math/s2e_math.hpp" +#include "../../math_physics/math/s2e_math.hpp" -KeplerOrbitPropagation::KeplerOrbitPropagation(const CelestialInformation* celestial_information, const double current_time_jd, +namespace s2e::dynamics::orbit { + +KeplerOrbitPropagation::KeplerOrbitPropagation(const environment::CelestialInformation* celestial_information, const double current_time_jd, KeplerOrbit kepler_orbit) : Orbit(celestial_information), KeplerOrbit(kepler_orbit) { UpdateState(current_time_jd); @@ -32,3 +34,5 @@ void KeplerOrbitPropagation::UpdateState(const double current_time_jd) { TransformEciToEcef(); TransformEcefToGeodetic(); } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/kepler_orbit_propagation.hpp b/src/dynamics/orbit/kepler_orbit_propagation.hpp index bed2bf624..a43aff5c4 100644 --- a/src/dynamics/orbit/kepler_orbit_propagation.hpp +++ b/src/dynamics/orbit/kepler_orbit_propagation.hpp @@ -6,14 +6,16 @@ #ifndef S2E_DYNAMICS_ORBIT_KEPLER_ORBIT_PROPAGATION_HPP_ #define S2E_DYNAMICS_ORBIT_KEPLER_ORBIT_PROPAGATION_HPP_ -#include "../../library/orbit/kepler_orbit.hpp" +#include "../../math_physics/orbit/kepler_orbit.hpp" #include "orbit.hpp" +namespace s2e::dynamics::orbit { + /** * @class KeplerOrbitPropagation * @brief Class to propagate spacecraft orbit with Kepler equation */ -class KeplerOrbitPropagation : public Orbit, public KeplerOrbit { +class KeplerOrbitPropagation : public Orbit, public s2e::orbit::KeplerOrbit { public: // Initialize with orbital elements /** @@ -23,7 +25,8 @@ class KeplerOrbitPropagation : public Orbit, public KeplerOrbit { * @param [in] current_time_jd: Current Julian day [day] * @param [in] kepler_orbit: Kepler orbit */ - KeplerOrbitPropagation(const CelestialInformation* celestial_information, const double current_time_jd, KeplerOrbit kepler_orbit); + KeplerOrbitPropagation(const environment::CelestialInformation* celestial_information, const double current_time_jd, + s2e::orbit::KeplerOrbit kepler_orbit); /** * @fn ~KeplerOrbitPropagation * @brief Destructor @@ -48,4 +51,6 @@ class KeplerOrbitPropagation : public Orbit, public KeplerOrbit { void UpdateState(const double current_time_jd); }; +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_KEPLER_ORBIT_PROPAGATION_HPP_ diff --git a/src/dynamics/orbit/orbit.cpp b/src/dynamics/orbit/orbit.cpp index c73223fd8..dbdcb7791 100644 --- a/src/dynamics/orbit/orbit.cpp +++ b/src/dynamics/orbit/orbit.cpp @@ -4,16 +4,18 @@ */ #include "orbit.hpp" -libra::Quaternion Orbit::CalcQuaternion_i2lvlh() const { - libra::Vector<3> lvlh_x = spacecraft_position_i_m_; // x-axis in LVLH frame is position vector direction from geocenter to satellite - libra::Vector<3> lvlh_ex = lvlh_x.CalcNormalizedVector(); - libra::Vector<3> lvlh_z = +namespace s2e::dynamics::orbit { + +math::Quaternion Orbit::CalcQuaternion_i2lvlh() const { + math::Vector<3> lvlh_x = spacecraft_position_i_m_; // x-axis in LVLH frame is position vector direction from geocenter to satellite + math::Vector<3> lvlh_ex = lvlh_x.CalcNormalizedVector(); + math::Vector<3> lvlh_z = OuterProduct(spacecraft_position_i_m_, spacecraft_velocity_i_m_s_); // z-axis in LVLH frame is angular momentum vector direction of orbit - libra::Vector<3> lvlh_ez = lvlh_z.CalcNormalizedVector(); - libra::Vector<3> lvlh_y = OuterProduct(lvlh_z, lvlh_x); - libra::Vector<3> lvlh_ey = lvlh_y.CalcNormalizedVector(); + math::Vector<3> lvlh_ez = lvlh_z.CalcNormalizedVector(); + math::Vector<3> lvlh_y = OuterProduct(lvlh_z, lvlh_x); + math::Vector<3> lvlh_ey = lvlh_y.CalcNormalizedVector(); - libra::Matrix<3, 3> dcm_i2lvlh; + math::Matrix<3, 3> dcm_i2lvlh; dcm_i2lvlh[0][0] = lvlh_ex[0]; dcm_i2lvlh[0][1] = lvlh_ex[1]; dcm_i2lvlh[0][2] = lvlh_ex[2]; @@ -24,19 +26,19 @@ libra::Quaternion Orbit::CalcQuaternion_i2lvlh() const { dcm_i2lvlh[2][1] = lvlh_ez[1]; dcm_i2lvlh[2][2] = lvlh_ez[2]; - libra::Quaternion q_i2lvlh = libra::Quaternion::ConvertFromDcm(dcm_i2lvlh); + math::Quaternion q_i2lvlh = math::Quaternion::ConvertFromDcm(dcm_i2lvlh); return q_i2lvlh.Normalize(); } void Orbit::TransformEciToEcef(void) { - libra::Matrix<3, 3> dcm_i_to_xcxf = celestial_information_->GetEarthRotation().GetDcmJ2000ToEcef(); + math::Matrix<3, 3> dcm_i_to_xcxf = celestial_information_->GetEarthRotation().GetDcmJ2000ToEcef(); spacecraft_position_ecef_m_ = dcm_i_to_xcxf * spacecraft_position_i_m_; // convert velocity vector in ECI to the vector in ECEF - libra::Vector<3> earth_angular_velocity_i_rad_s{0.0}; + math::Vector<3> earth_angular_velocity_i_rad_s{0.0}; earth_angular_velocity_i_rad_s[2] = environment::earth_mean_angular_velocity_rad_s; - libra::Vector<3> we_cross_r = OuterProduct(earth_angular_velocity_i_rad_s, spacecraft_position_i_m_); - libra::Vector<3> velocity_we_cross_r = spacecraft_velocity_i_m_s_ - we_cross_r; + math::Vector<3> we_cross_r = OuterProduct(earth_angular_velocity_i_rad_s, spacecraft_position_i_m_); + math::Vector<3> velocity_we_cross_r = spacecraft_velocity_i_m_s_ - we_cross_r; spacecraft_velocity_ecef_m_s_ = dcm_i_to_xcxf * velocity_we_cross_r; } @@ -67,13 +69,14 @@ OrbitInitializeMode SetOrbitInitializeMode(const std::string initialize_mode) { std::string Orbit::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("spacecraft_position", "i", "m", 3); - str_tmp += WriteVector("spacecraft_velocity", "i", "m/s", 3); - str_tmp += WriteVector("spacecraft_velocity", "b", "m/s", 3); - str_tmp += WriteVector("spacecraft_acceleration", "i", "m/s2", 3); - str_tmp += WriteScalar("spacecraft_latitude", "rad"); - str_tmp += WriteScalar("spacecraft_longitude", "rad"); - str_tmp += WriteScalar("spacecraft_altitude", "m"); + str_tmp += logger::WriteVector("spacecraft_position", "i", "m", 3); + str_tmp += logger::WriteVector("spacecraft_position", "ecef", "m", 3); + str_tmp += logger::WriteVector("spacecraft_velocity", "i", "m/s", 3); + str_tmp += logger::WriteVector("spacecraft_velocity", "b", "m/s", 3); + str_tmp += logger::WriteVector("spacecraft_acceleration", "i", "m/s2", 3); + str_tmp += logger::WriteScalar("spacecraft_latitude", "rad"); + str_tmp += logger::WriteScalar("spacecraft_longitude", "rad"); + str_tmp += logger::WriteScalar("spacecraft_altitude", "m"); return str_tmp; } @@ -81,13 +84,16 @@ std::string Orbit::GetLogHeader() const { std::string Orbit::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(spacecraft_position_i_m_, 16); - str_tmp += WriteVector(spacecraft_velocity_i_m_s_, 10); - str_tmp += WriteVector(spacecraft_velocity_b_m_s_, 10); - str_tmp += WriteVector(spacecraft_acceleration_i_m_s2_, 10); - str_tmp += WriteScalar(spacecraft_geodetic_position_.GetLatitude_rad()); - str_tmp += WriteScalar(spacecraft_geodetic_position_.GetLongitude_rad()); - str_tmp += WriteScalar(spacecraft_geodetic_position_.GetAltitude_m()); + str_tmp += logger::WriteVector(spacecraft_position_i_m_, 16); + str_tmp += logger::WriteVector(spacecraft_position_ecef_m_, 16); + str_tmp += logger::WriteVector(spacecraft_velocity_i_m_s_, 10); + str_tmp += logger::WriteVector(spacecraft_velocity_b_m_s_, 10); + str_tmp += logger::WriteVector(spacecraft_acceleration_i_m_s2_, 10); + str_tmp += logger::WriteScalar(spacecraft_geodetic_position_.GetLatitude_rad()); + str_tmp += logger::WriteScalar(spacecraft_geodetic_position_.GetLongitude_rad()); + str_tmp += logger::WriteScalar(spacecraft_geodetic_position_.GetAltitude_m()); return str_tmp; } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/orbit.hpp b/src/dynamics/orbit/orbit.hpp index 591f79ee8..c51f0dc61 100644 --- a/src/dynamics/orbit/orbit.hpp +++ b/src/dynamics/orbit/orbit.hpp @@ -8,13 +8,15 @@ #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include + +namespace s2e::dynamics::orbit { /** * @enum OrbitPropagateMode @@ -25,7 +27,8 @@ enum class OrbitPropagateMode { kSgp4, //!< SGP4 propagation using TLE without thruster maneuver kRelativeOrbit, //!< Relative dynamics (for formation flying simulation) kKepler, //!< Kepler orbit propagation without disturbances and thruster maneuver - kEncke //!< Encke orbit propagation with disturbances and thruster maneuver + kEncke, //!< Encke orbit propagation with disturbances and thruster maneuver + kTimeSeriesFile //!< Orbit propagation using time series file }; /** @@ -42,14 +45,14 @@ enum class OrbitInitializeMode { * @class Orbit * @brief Base class of orbit propagation */ -class Orbit : public ILoggable { +class Orbit : public logger::ILoggable { public: /** * @fn Orbit * @brief Constructor * @param [in] celestial_information: Celestial information */ - Orbit(const CelestialInformation* celestial_information) : celestial_information_(celestial_information) {} + Orbit(const environment::CelestialInformation* celestial_information) : celestial_information_(celestial_information) {} /** * @fn ~Orbit * @brief Destructor @@ -69,7 +72,7 @@ class Orbit : public ILoggable { * @brief Update attitude information * @param [in] quaternion_i2b: End time of simulation [sec] */ - inline void UpdateByAttitude(const libra::Quaternion quaternion_i2b) { + inline void UpdateByAttitude(const math::Quaternion quaternion_i2b) { spacecraft_velocity_b_m_s_ = quaternion_i2b.FrameConversion(spacecraft_velocity_i_m_s_); } @@ -88,39 +91,39 @@ class Orbit : public ILoggable { * @fn GetPosition_i_m * @brief Return spacecraft position in the inertial frame [m] */ - inline libra::Vector<3> GetPosition_i_m() const { return spacecraft_position_i_m_; } + inline math::Vector<3> GetPosition_i_m() const { return spacecraft_position_i_m_; } /** * @fn GetPosition_ecef_m * @brief Return spacecraft position in the ECEF frame [m] */ - inline libra::Vector<3> GetPosition_ecef_m() const { return spacecraft_position_ecef_m_; } + inline math::Vector<3> GetPosition_ecef_m() const { return spacecraft_position_ecef_m_; } /** * @fn GetVelocity_i_m_s * @brief Return spacecraft velocity in the inertial frame [m/s] */ - inline libra::Vector<3> GetVelocity_i_m_s() const { return spacecraft_velocity_i_m_s_; } + inline math::Vector<3> GetVelocity_i_m_s() const { return spacecraft_velocity_i_m_s_; } /** * @fn GetVelocity_b_m_s * @brief Return spacecraft velocity in the body fixed frame [m/s] */ - inline libra::Vector<3> GetVelocity_b_m_s() const { return spacecraft_velocity_b_m_s_; } + inline math::Vector<3> GetVelocity_b_m_s() const { return spacecraft_velocity_b_m_s_; } /** * @fn GetVelocity_ecef_m_s * @brief Return spacecraft velocity in the ECEF frame [m/s] */ - inline libra::Vector<3> GetVelocity_ecef_m_s() const { return spacecraft_velocity_ecef_m_s_; } + inline math::Vector<3> GetVelocity_ecef_m_s() const { return spacecraft_velocity_ecef_m_s_; } /** * @fn GetGeodeticPosition * @brief Return spacecraft position in the geodetic frame [m] */ - inline GeodeticPosition GetGeodeticPosition() const { return spacecraft_geodetic_position_; } + inline s2e::geodesy::GeodeticPosition GetGeodeticPosition() const { return spacecraft_geodetic_position_; } // TODO delete the following functions inline double GetLatitude_rad() const { return spacecraft_geodetic_position_.GetLatitude_rad(); } inline double GetLongitude_rad() const { return spacecraft_geodetic_position_.GetLongitude_rad(); } inline double GetAltitude_m() const { return spacecraft_geodetic_position_.GetAltitude_m(); } - inline libra::Vector<3> GetLatLonAlt() const { - libra::Vector<3> vec; + inline math::Vector<3> GetLatLonAlt() const { + math::Vector<3> vec; vec(0) = spacecraft_geodetic_position_.GetLatitude_rad(); vec(1) = spacecraft_geodetic_position_.GetLongitude_rad(); vec(2) = spacecraft_geodetic_position_.GetAltitude_m(); @@ -137,15 +140,15 @@ class Orbit : public ILoggable { * @fn SetAcceleration_i_m_s2 * @brief Set acceleration in the inertial frame [m/s2] */ - inline void SetAcceleration_i_m_s2(const libra::Vector<3> acceleration_i_m_s2) { spacecraft_acceleration_i_m_s2_ = acceleration_i_m_s2; } + inline void SetAcceleration_i_m_s2(const math::Vector<3> acceleration_i_m_s2) { spacecraft_acceleration_i_m_s2_ = acceleration_i_m_s2; } /** * @fn AddForce_i_N * @brief Add force * @param [in] force_i: Force in the inertial frame [N] * @param [in] spacecraft_mass_kg: Mass of spacecraft [kg] */ - inline void AddForce_i_N(const libra::Vector<3> force_i_N, double spacecraft_mass_kg) { - libra::Vector<3> acceleration_i_m_s2 = force_i_N; + inline void AddForce_i_N(const math::Vector<3> force_i_N, double spacecraft_mass_kg) { + math::Vector<3> acceleration_i_m_s2 = force_i_N; acceleration_i_m_s2 /= spacecraft_mass_kg; // FIXME spacecraft_acceleration_i_m_s2_ += acceleration_i_m_s2; } @@ -153,7 +156,7 @@ class Orbit : public ILoggable { * @fn AddAcceleration_i_m_s2 * @brief Add acceleration in the inertial frame [m/s2] */ - inline void AddAcceleration_i_m_s2(const libra::Vector<3> acceleration_i_m_s2) { spacecraft_acceleration_i_m_s2_ += acceleration_i_m_s2; } + inline void AddAcceleration_i_m_s2(const math::Vector<3> acceleration_i_m_s2) { spacecraft_acceleration_i_m_s2_ += acceleration_i_m_s2; } /** * @fn AddForce_i_N * @brief Add force @@ -161,7 +164,7 @@ class Orbit : public ILoggable { * @param [in] quaternion_i2b: Quaternion from the inertial frame to the body fixed frame * @param [in] spacecraft_mass_kg: Mass of spacecraft [kg] */ - inline void AddForce_b_N(const libra::Vector<3> force_b_N, const libra::Quaternion quaternion_i2b, const double spacecraft_mass_kg) { + inline void AddForce_b_N(const math::Vector<3> force_b_N, const math::Quaternion quaternion_i2b, const double spacecraft_mass_kg) { auto force_i = quaternion_i2b.InverseFrameConversion(force_b_N); AddForce_i_N(force_i, spacecraft_mass_kg); } @@ -170,37 +173,37 @@ class Orbit : public ILoggable { * @fn CalcQuaternion_i2lvlh * @brief Calculate and return quaternion from the inertial frame to the LVLH frame */ - libra::Quaternion CalcQuaternion_i2lvlh() const; + math::Quaternion CalcQuaternion_i2lvlh() const; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; protected: - const CelestialInformation* celestial_information_; //!< Celestial information + const environment::CelestialInformation* celestial_information_; //!< Celestial information // Settings bool is_calc_enabled_ = false; //!< Calculate flag OrbitPropagateMode propagate_mode_; //!< Propagation mode - libra::Vector<3> spacecraft_position_i_m_; //!< Spacecraft position in the inertial frame [m] - libra::Vector<3> spacecraft_position_ecef_m_; //!< Spacecraft position in the ECEF frame [m] - GeodeticPosition spacecraft_geodetic_position_; //!< Spacecraft position in the Geodetic frame + math::Vector<3> spacecraft_position_i_m_; //!< Spacecraft position in the inertial frame [m] + math::Vector<3> spacecraft_position_ecef_m_; //!< Spacecraft position in the ECEF frame [m] + s2e::geodesy::GeodeticPosition spacecraft_geodetic_position_; //!< Spacecraft position in the Geodetic frame - libra::Vector<3> spacecraft_velocity_i_m_s_; //!< Spacecraft velocity in the inertial frame [m/s] - libra::Vector<3> spacecraft_velocity_b_m_s_; //!< Spacecraft velocity in the body frame [m/s] - libra::Vector<3> spacecraft_velocity_ecef_m_s_; //!< Spacecraft velocity in the ECEF frame [m/s] + math::Vector<3> spacecraft_velocity_i_m_s_; //!< Spacecraft velocity in the inertial frame [m/s] + math::Vector<3> spacecraft_velocity_b_m_s_; //!< Spacecraft velocity in the body frame [m/s] + math::Vector<3> spacecraft_velocity_ecef_m_s_; //!< Spacecraft velocity in the ECEF frame [m/s] - libra::Vector<3> spacecraft_acceleration_i_m_s2_; //!< Spacecraft acceleration in the inertial frame [m/s2] - //!< NOTE: Clear to zero at the end of the Propagate function + math::Vector<3> spacecraft_acceleration_i_m_s2_; //!< Spacecraft acceleration in the inertial frame [m/s2] + //!< NOTE: Clear to zero at the end of the Propagate function // Frame Conversion TODO: consider other planet /** @@ -217,4 +220,6 @@ class Orbit : public ILoggable { OrbitInitializeMode SetOrbitInitializeMode(const std::string initialize_mode); +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_ORBIT_HPP_ diff --git a/src/dynamics/orbit/relative_orbit.cpp b/src/dynamics/orbit/relative_orbit.cpp index 347e07e87..6f4b2608d 100644 --- a/src/dynamics/orbit/relative_orbit.cpp +++ b/src/dynamics/orbit/relative_orbit.cpp @@ -4,16 +4,18 @@ */ #include "relative_orbit.hpp" -#include +#include #include "rk4_orbit_propagation.hpp" -RelativeOrbit::RelativeOrbit(const CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, - int reference_spacecraft_id, libra::Vector<3> relative_position_lvlh_m, libra::Vector<3> relative_velocity_lvlh_m_s, - RelativeOrbitUpdateMethod update_method, RelativeOrbitModel relative_dynamics_model_type, StmModel stm_model_type, - RelativeInformation* relative_information) +namespace s2e::dynamics::orbit { + +RelativeOrbit::RelativeOrbit(const environment::CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, + int reference_spacecraft_id, math::Vector<3> relative_position_lvlh_m, math::Vector<3> relative_velocity_lvlh_m_s, + RelativeOrbitUpdateMethod update_method, s2e::orbit::RelativeOrbitModel relative_dynamics_model_type, + s2e::orbit::StmModel stm_model_type, simulation::RelativeInformation* relative_information) : Orbit(celestial_information), - libra::OrdinaryDifferentialEquation<6>(time_step_s), + math::OrdinaryDifferentialEquation<6>(time_step_s), gravity_constant_m3_s2_(gravity_constant_m3_s2), reference_spacecraft_id_(reference_spacecraft_id), update_method_(update_method), @@ -30,7 +32,7 @@ RelativeOrbit::RelativeOrbit(const CelestialInformation* celestial_information, RelativeOrbit::~RelativeOrbit() {} -void RelativeOrbit::InitializeState(libra::Vector<3> relative_position_lvlh_m, libra::Vector<3> relative_velocity_lvlh_m_s, +void RelativeOrbit::InitializeState(math::Vector<3> relative_position_lvlh_m, math::Vector<3> relative_velocity_lvlh_m_s, double gravity_constant_m3_s2, double initial_time_s) { relative_position_lvlh_m_ = relative_position_lvlh_m; relative_velocity_lvlh_m_s_ = relative_velocity_lvlh_m_s; @@ -38,11 +40,10 @@ void RelativeOrbit::InitializeState(libra::Vector<3> relative_position_lvlh_m, l // Disturbance acceleration are not considered in relative orbit propagation spacecraft_acceleration_i_m_s2_ *= 0.0; - libra::Vector<3> reference_sat_position_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> reference_sat_velocity_i = - relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetVelocity_i_m_s(); - libra::Quaternion q_i2lvlh = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().CalcQuaternion_i2lvlh(); - libra::Quaternion q_lvlh2i = q_i2lvlh.Conjugate(); + math::Vector<3> reference_sat_position_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetPosition_i_m(); + math::Vector<3> reference_sat_velocity_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetVelocity_i_m_s(); + math::Quaternion q_i2lvlh = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().CalcQuaternion_i2lvlh(); + math::Quaternion q_lvlh2i = q_i2lvlh.Conjugate(); spacecraft_position_i_m_ = q_lvlh2i.FrameConversion(relative_position_lvlh_m_) + reference_sat_position_i; spacecraft_velocity_i_m_s_ = q_lvlh2i.FrameConversion(relative_velocity_lvlh_m_s_) + reference_sat_velocity_i; @@ -67,12 +68,12 @@ void RelativeOrbit::InitializeState(libra::Vector<3> relative_position_lvlh_m, l TransformEcefToGeodetic(); } -void RelativeOrbit::CalculateSystemMatrix(RelativeOrbitModel relative_dynamics_model_type, const Orbit* reference_sat_orbit, +void RelativeOrbit::CalculateSystemMatrix(s2e::orbit::RelativeOrbitModel relative_dynamics_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2) { switch (relative_dynamics_model_type) { - case RelativeOrbitModel::kHill: { + case s2e::orbit::RelativeOrbitModel::kHill: { double reference_sat_orbit_radius = reference_sat_orbit->GetPosition_i_m().CalcNorm(); - system_matrix_ = CalcHillSystemMatrix(reference_sat_orbit_radius, gravity_constant_m3_s2); + system_matrix_ = s2e::orbit::CalcHillSystemMatrix(reference_sat_orbit_radius, gravity_constant_m3_s2); } default: { // NOT REACHED @@ -81,11 +82,12 @@ void RelativeOrbit::CalculateSystemMatrix(RelativeOrbitModel relative_dynamics_m } } -void RelativeOrbit::CalculateStm(StmModel stm_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2, double elapsed_sec) { +void RelativeOrbit::CalculateStm(s2e::orbit::StmModel stm_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2, + double elapsed_sec) { switch (stm_model_type) { - case StmModel::kHcw: { + case s2e::orbit::StmModel::kHcw: { double reference_sat_orbit_radius = reference_sat_orbit->GetPosition_i_m().CalcNorm(); - stm_ = CalcHcwStm(reference_sat_orbit_radius, gravity_constant_m3_s2, elapsed_sec); + stm_ = s2e::orbit::CalcHcwStm(reference_sat_orbit_radius, gravity_constant_m3_s2, elapsed_sec); } default: { // NOT REACHED @@ -108,11 +110,10 @@ void RelativeOrbit::Propagate(const double end_time_s, const double current_time PropagateStm(end_time_s); } - libra::Vector<3> reference_sat_position_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> reference_sat_velocity_i = - relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetVelocity_i_m_s(); - libra::Quaternion q_i2lvlh = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().CalcQuaternion_i2lvlh(); - libra::Quaternion q_lvlh2i = q_i2lvlh.Conjugate(); + math::Vector<3> reference_sat_position_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetPosition_i_m(); + math::Vector<3> reference_sat_velocity_i = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().GetVelocity_i_m_s(); + math::Quaternion q_i2lvlh = relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit().CalcQuaternion_i2lvlh(); + math::Quaternion q_lvlh2i = q_i2lvlh.Conjugate(); spacecraft_position_i_m_ = q_lvlh2i.FrameConversion(relative_position_lvlh_m_) + reference_sat_position_i; spacecraft_velocity_i_m_s_ = q_lvlh2i.FrameConversion(relative_velocity_lvlh_m_s_) + reference_sat_velocity_i; @@ -139,7 +140,7 @@ void RelativeOrbit::PropagateRk4(double elapsed_sec) { } void RelativeOrbit::PropagateStm(double elapsed_sec) { - libra::Vector<6> current_state; + math::Vector<6> current_state; CalculateStm(stm_model_type_, &(relative_information_->GetReferenceSatDynamics(reference_spacecraft_id_)->GetOrbit()), gravity_constant_m3_s2_, elapsed_sec); current_state = stm_ * initial_state_; @@ -152,9 +153,11 @@ void RelativeOrbit::PropagateStm(double elapsed_sec) { relative_velocity_lvlh_m_s_[2] = current_state[5]; } -void RelativeOrbit::DerivativeFunction(double t, const libra::Vector<6>& state, - libra::Vector<6>& rhs) // only for RK4 relative dynamics propagation +void RelativeOrbit::DerivativeFunction(double t, const math::Vector<6>& state, + math::Vector<6>& rhs) // only for RK4 relative dynamics propagation { rhs = system_matrix_ * state; (void)t; } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/relative_orbit.hpp b/src/dynamics/orbit/relative_orbit.hpp index 09b8d1403..313ac9429 100644 --- a/src/dynamics/orbit/relative_orbit.hpp +++ b/src/dynamics/orbit/relative_orbit.hpp @@ -6,18 +6,20 @@ #ifndef S2E_DYNAMICS_ORBIT_RELATIVE_ORBIT_HPP_ #define S2E_DYNAMICS_ORBIT_RELATIVE_ORBIT_HPP_ -#include -#include +#include +#include #include #include #include "orbit.hpp" +namespace s2e::dynamics::orbit { + /** * @class RelativeOrbit * @brief Class to propagate relative orbit */ -class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6> { +class RelativeOrbit : public Orbit, public math::OrdinaryDifferentialEquation<6> { public: /** * @enum RelativeOrbitUpdateMethod @@ -39,9 +41,10 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 * @param [in] stm_model_type: State transition matrix type * @param [in] relative_information: Relative information */ - RelativeOrbit(const CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, int reference_spacecraft_id, - libra::Vector<3> relative_position_lvlh_m, libra::Vector<3> relative_velocity_lvlh_m_s, RelativeOrbitUpdateMethod update_method, - RelativeOrbitModel relative_dynamics_model_type, StmModel stm_model_type, RelativeInformation* relative_information); + RelativeOrbit(const environment::CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, + int reference_spacecraft_id, math::Vector<3> relative_position_lvlh_m, math::Vector<3> relative_velocity_lvlh_m_s, + RelativeOrbitUpdateMethod update_method, s2e::orbit::RelativeOrbitModel relative_dynamics_model_type, + s2e::orbit::StmModel stm_model_type, simulation::RelativeInformation* relative_information); /** * @fn ~RelativeOrbit * @brief Destructor @@ -65,7 +68,7 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 * @param [in] state: Position and velocity as state vector * @param [out] rhs: Output of the function */ - virtual void DerivativeFunction(double t, const Vector<6>& state, Vector<6>& rhs); + virtual void DerivativeFunction(double t, const math::Vector<6>& state, math::Vector<6>& rhs); private: double gravity_constant_m3_s2_; //!< Gravity constant of the center body [m3/s2] @@ -73,17 +76,17 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 double propagation_time_s_; //!< Simulation current time for numerical integration by RK4 [sec] double propagation_step_s_; //!< Step width for RK4 [sec] - libra::Matrix<6, 6> system_matrix_; //!< System matrix - libra::Matrix<6, 6> stm_; //!< State transition matrix + math::Matrix<6, 6> system_matrix_; //!< System matrix + math::Matrix<6, 6> stm_; //!< State transition matrix - libra::Vector<6> initial_state_; //!< Initial state (Position and Velocity) - libra::Vector<3> relative_position_lvlh_m_; //!< Relative position in the LVLH frame - libra::Vector<3> relative_velocity_lvlh_m_s_; //!< Relative velocity in the LVLH frame + math::Vector<6> initial_state_; //!< Initial state (Position and Velocity) + math::Vector<3> relative_position_lvlh_m_; //!< Relative position in the LVLH frame + math::Vector<3> relative_velocity_lvlh_m_s_; //!< Relative velocity in the LVLH frame - RelativeOrbitUpdateMethod update_method_; //!< Update method - RelativeOrbitModel relative_dynamics_model_type_; //!< Relative dynamics model type - StmModel stm_model_type_; //!< State Transition Matrix model type - RelativeInformation* relative_information_; //!< Relative information + RelativeOrbitUpdateMethod update_method_; //!< Update method + s2e::orbit::RelativeOrbitModel relative_dynamics_model_type_; //!< Relative dynamics model type + s2e::orbit::StmModel stm_model_type_; //!< State Transition Matrix model type + simulation::RelativeInformation* relative_information_; //!< Relative information /** * @fn InitializeState @@ -93,7 +96,7 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 * @param [in] gravity_constant_m3_s2: Gravity constant of the center body [m3/s2] * @param [in] initial_time_s: Initialize time [sec] */ - void InitializeState(libra::Vector<3> relative_position_lvlh_m, libra::Vector<3> relative_velocity_lvlh_m_s, double gravity_constant_m3_s2, + void InitializeState(math::Vector<3> relative_position_lvlh_m, math::Vector<3> relative_velocity_lvlh_m_s, double gravity_constant_m3_s2, double initial_time_s = 0); /** * @fn CalculateSystemMatrix @@ -102,7 +105,8 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 * @param [in] reference_sat_orbit: Orbit information of reference satellite * @param [in] gravity_constant_m3_s2: Gravity constant of the center body [m3/s2] */ - void CalculateSystemMatrix(RelativeOrbitModel relative_dynamics_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2); + void CalculateSystemMatrix(s2e::orbit::RelativeOrbitModel relative_dynamics_model_type, const Orbit* reference_sat_orbit, + double gravity_constant_m3_s2); /** * @fn CalculateStm * @brief Calculate State Transition Matrix @@ -111,7 +115,7 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 * @param [in] gravity_constant_m3_s2: Gravity constant of the center body [m3/s2] * @param [in] elapsed_sec: Elapsed time [sec] */ - void CalculateStm(StmModel stm_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2, double elapsed_sec); + void CalculateStm(s2e::orbit::StmModel stm_model_type, const Orbit* reference_sat_orbit, double gravity_constant_m3_s2, double elapsed_sec); /** * @fn PropagateRk4 * @brief Propagate relative orbit with RK4 @@ -126,4 +130,6 @@ class RelativeOrbit : public Orbit, public libra::OrdinaryDifferentialEquation<6 void PropagateStm(double elapsed_sec); }; +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_RELATIVE_ORBIT_HPP_ diff --git a/src/dynamics/orbit/rk4_orbit_propagation.cpp b/src/dynamics/orbit/rk4_orbit_propagation.cpp index 683db283b..930677292 100644 --- a/src/dynamics/orbit/rk4_orbit_propagation.cpp +++ b/src/dynamics/orbit/rk4_orbit_propagation.cpp @@ -5,11 +5,13 @@ #include "rk4_orbit_propagation.hpp" #include -#include #include +#include -Rk4OrbitPropagation::Rk4OrbitPropagation(const CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, - libra::Vector<3> position_i_m, libra::Vector<3> velocity_i_m_s, double initial_time_s) +namespace s2e::dynamics::orbit { + +Rk4OrbitPropagation::Rk4OrbitPropagation(const environment::CelestialInformation* celestial_information, double gravity_constant_m3_s2, + double time_step_s, math::Vector<3> position_i_m, math::Vector<3> velocity_i_m_s, double initial_time_s) : Orbit(celestial_information), OrdinaryDifferentialEquation<6>(time_step_s), gravity_constant_m3_s2_(gravity_constant_m3_s2) { propagate_mode_ = OrbitPropagateMode::kRk4; @@ -22,7 +24,7 @@ Rk4OrbitPropagation::Rk4OrbitPropagation(const CelestialInformation* celestial_i Rk4OrbitPropagation::~Rk4OrbitPropagation() {} -void Rk4OrbitPropagation::DerivativeFunction(double t, const libra::Vector<6>& state, libra::Vector<6>& rhs) { +void Rk4OrbitPropagation::DerivativeFunction(double t, const math::Vector<6>& state, math::Vector<6>& rhs) { double x = state[0], y = state[1], z = state[2]; double vx = state[3], vy = state[4], vz = state[5]; @@ -38,9 +40,9 @@ void Rk4OrbitPropagation::DerivativeFunction(double t, const libra::Vector<6>& s (void)t; } -void Rk4OrbitPropagation::Initialize(libra::Vector<3> position_i_m, libra::Vector<3> velocity_i_m_s, double initial_time_s) { +void Rk4OrbitPropagation::Initialize(math::Vector<3> position_i_m, math::Vector<3> velocity_i_m_s, double initial_time_s) { // state vector [x,y,z,vx,vy,vz] - libra::Vector<6> init_state; + math::Vector<6> init_state; init_state[0] = position_i_m[0]; init_state[1] = position_i_m[1]; init_state[2] = position_i_m[2]; @@ -86,3 +88,5 @@ void Rk4OrbitPropagation::Propagate(const double end_time_s, const double curren TransformEciToEcef(); TransformEcefToGeodetic(); } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/rk4_orbit_propagation.hpp b/src/dynamics/orbit/rk4_orbit_propagation.hpp index bdb98b808..30be7b161 100644 --- a/src/dynamics/orbit/rk4_orbit_propagation.hpp +++ b/src/dynamics/orbit/rk4_orbit_propagation.hpp @@ -7,15 +7,17 @@ #define S2E_DYNAMICS_ORBIT_RK4_ORBIT_PROPAGATION_HPP_ #include -#include +#include #include "orbit.hpp" +namespace s2e::dynamics::orbit { + /** * @class Rk4OrbitPropagation * @brief Class to propagate spacecraft orbit with Runge-Kutta-4 method */ -class Rk4OrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEquation<6> { +class Rk4OrbitPropagation : public Orbit, public math::OrdinaryDifferentialEquation<6> { public: /** * @fn Rk4OrbitPropagation @@ -27,8 +29,8 @@ class Rk4OrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEqua * @param [in] velocity_i_m_s: Initial value of velocity in the inertial frame [m/s] * @param [in] initial_time_s: Initial time [sec] */ - Rk4OrbitPropagation(const CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, - libra::Vector<3> position_i_m, libra::Vector<3> velocity_i_m_s, double initial_time_s = 0); + Rk4OrbitPropagation(const environment::CelestialInformation* celestial_information, double gravity_constant_m3_s2, double time_step_s, + math::Vector<3> position_i_m, math::Vector<3> velocity_i_m_s, double initial_time_s = 0); /** * @fn ~Rk4OrbitPropagation * @brief Destructor @@ -43,7 +45,7 @@ class Rk4OrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEqua * @param [in] state: Position and velocity as state vector * @param [out] rhs: Output of the function */ - virtual void DerivativeFunction(double t, const libra::Vector<6>& state, libra::Vector<6>& rhs); + virtual void DerivativeFunction(double t, const math::Vector<6>& state, math::Vector<6>& rhs); // Override Orbit /** @@ -66,7 +68,9 @@ class Rk4OrbitPropagation : public Orbit, public libra::OrdinaryDifferentialEqua * @param [in] velocity_i_m_s: Initial value of velocity in the inertial frame [m/s] * @param [in] initial_time_s: Initial time [sec] */ - void Initialize(libra::Vector<3> position_i_m, libra::Vector<3> velocity_i_m_s, double initial_time_s = 0); + void Initialize(math::Vector<3> position_i_m, math::Vector<3> velocity_i_m_s, double initial_time_s = 0); }; +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_RK4_ORBIT_PROPAGATION_HPP_ diff --git a/src/dynamics/orbit/sgp4_orbit_propagation.cpp b/src/dynamics/orbit/sgp4_orbit_propagation.cpp index 1c4da13ee..691644184 100644 --- a/src/dynamics/orbit/sgp4_orbit_propagation.cpp +++ b/src/dynamics/orbit/sgp4_orbit_propagation.cpp @@ -6,11 +6,13 @@ #include "sgp4_orbit_propagation.hpp" #include -#include #include +#include -Sgp4OrbitPropagation::Sgp4OrbitPropagation(const CelestialInformation* celestial_information, char* tle1, char* tle2, const int wgs_setting, - const double current_time_jd) +namespace s2e::dynamics::orbit { + +Sgp4OrbitPropagation::Sgp4OrbitPropagation(const environment::CelestialInformation* celestial_information, char* tle1, char* tle2, + const int wgs_setting, const double current_time_jd) : Orbit(celestial_information) { propagate_mode_ = OrbitPropagateMode::kSgp4; @@ -66,3 +68,5 @@ void Sgp4OrbitPropagation::Propagate(const double end_time_s, const double curre TransformEciToEcef(); TransformEcefToGeodetic(); } + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/sgp4_orbit_propagation.hpp b/src/dynamics/orbit/sgp4_orbit_propagation.hpp index 3ed68fbf9..5ccfea6ed 100644 --- a/src/dynamics/orbit/sgp4_orbit_propagation.hpp +++ b/src/dynamics/orbit/sgp4_orbit_propagation.hpp @@ -6,13 +6,15 @@ #ifndef S2E_DYNAMICS_ORBIT_SGP4_ORBIT_PROPAGATION_HPP_ #define S2E_DYNAMICS_ORBIT_SGP4_ORBIT_PROPAGATION_HPP_ -#include -#include +#include +#include #include #include "orbit.hpp" +namespace s2e::dynamics::orbit { + /** * @class Sgp4OrbitPropagation * @brief Class to propagate spacecraft orbit with SGP4 method with TLE @@ -28,7 +30,7 @@ class Sgp4OrbitPropagation : public Orbit { * @param [in] wgs_setting: Wold Geodetic System * @param [in] current_time_jd: Current Julian day [day] */ - Sgp4OrbitPropagation(const CelestialInformation* celestial_information, char* tle1, char* tle2, const int wgs_setting, + Sgp4OrbitPropagation(const environment::CelestialInformation* celestial_information, char* tle1, char* tle2, const int wgs_setting, const double current_time_jd); // Override Orbit @@ -41,8 +43,10 @@ class Sgp4OrbitPropagation : public Orbit { virtual void Propagate(const double end_time_s, const double current_time_jd); private: - gravconsttype gravity_constant_setting_; //!< Gravity constant value type - elsetrec sgp4_data_; //!< Structure data for SGP4 library + gravconsttype gravity_constant_setting_; //!< Gravity constant value type + elsetrec sgp4_data_; //!< Structure data for SGP4 library }; +} // namespace s2e::dynamics::orbit + #endif // S2E_DYNAMICS_ORBIT_SGP4_ORBIT_PROPAGATION_HPP_ diff --git a/src/dynamics/orbit/time_series_file_orbit_propagation.cpp b/src/dynamics/orbit/time_series_file_orbit_propagation.cpp new file mode 100644 index 000000000..5230a18c2 --- /dev/null +++ b/src/dynamics/orbit/time_series_file_orbit_propagation.cpp @@ -0,0 +1,159 @@ +/** + * @file time_series_file_orbit_propagation.cpp + * @brief Class to calculate satellite orbit using interpolation with orbit time series input + */ + +#include "time_series_file_orbit_propagation.hpp" + +#include +#include +#include +#include + +#include "logger/log_utility.hpp" +#include "math_physics/math/constants.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::dynamics::orbit { + +TimeSeriesFileOrbitPropagation::TimeSeriesFileOrbitPropagation(const environment::CelestialInformation* celestial_information, + std::string time_series_file_path, int number_of_interpolation, + int interpolation_method, double orbital_period_correction_s, + const double current_time_jd) + : Orbit(celestial_information), + is_time_range_warning_displayed_(false), + is_interpolation_method_error_displayed_(false), + number_of_interpolation_(number_of_interpolation), + interpolation_method_(interpolation_method), + orbital_period_correction_s_(orbital_period_correction_s), + reference_interpolation_id_(0) { + propagate_mode_ = OrbitPropagateMode::kTimeSeriesFile; + + // Read time series file + setting_file_reader::IniAccess time_series_file(time_series_file_path); + time_series_file.ReadCsvDoubleWithHeader(time_series_data_, 7, 1, 0); + + // Get general info + size_t nearest_ephemeris_time_id = SearchNearestEphemerisTimeId(current_time_jd); + + const size_t half_interpolation_number = number_of_interpolation / 2; + if (nearest_ephemeris_time_id >= half_interpolation_number) { + reference_interpolation_id_ = nearest_ephemeris_time_id - half_interpolation_number; + } + + reference_time_ = CalcEphemerisTimeData(reference_interpolation_id_); + + // Initialize orbit + orbit_position_i_m_.assign(1, s2e::orbit::InterpolationOrbit(number_of_interpolation)); + orbit_velocity_i_m_s_.assign(1, s2e::orbit::InterpolationOrbit(number_of_interpolation)); + + // Initialize interpolation + for (int i = 0; i < number_of_interpolation; i++) { + UpdateInterpolationInformation(); + } + spacecraft_acceleration_i_m_s2_ *= 0.0; + + // To calculate initial position and velocity + is_calc_enabled_ = true; + Propagate(0.0, current_time_jd); + is_calc_enabled_ = false; +} + +size_t TimeSeriesFileOrbitPropagation::SearchNearestEphemerisTimeId(const double current_time_jd) { + size_t nearest_ephemeris_time_id = 0; + + // Get start ephemeris time + double start_ephemris_time = (current_time_jd - 2451545.0) * 86400.0; + + // Get the nearest ephemeris time ID + for (size_t i = 0; i < time_series_data_.size(); i++) { + if (start_ephemris_time < time_series_data_[i][0]) { + nearest_ephemeris_time_id = i; + break; + } + } + return nearest_ephemeris_time_id; +} + +double TimeSeriesFileOrbitPropagation::CalcEphemerisTimeData(const size_t ephemeris_time_id) const { + if (ephemeris_time_id > time_series_data_.size()) { + return 0; + } + return time_series_data_[ephemeris_time_id][0]; +} + +void TimeSeriesFileOrbitPropagation::Propagate(const double end_time_s, const double current_time_jd) { + UNUSED(end_time_s); + + if (!is_calc_enabled_) return; + + // Check interpolation update + double current_ephemris_time = (current_time_jd - 2451545.0) * 86400.0; + double diff_s = current_ephemris_time - reference_time_; + double medium_time_s = orbit_position_i_m_[0].GetTimeList()[static_cast(std::round(number_of_interpolation_ / 2.0))]; + if (diff_s > medium_time_s) { + UpdateInterpolationInformation(); + } + if (diff_s < 0.0) { + if (!is_time_range_warning_displayed_) { + std::cout << "[WARNING] Time series file orbit propagation: Time is out of range of time series file." << std::endl; + is_time_range_warning_displayed_ = true; + } + for (size_t i = 0; i < 3; i++) { + spacecraft_position_i_m_[i] = time_series_data_[0][i + 1]; + spacecraft_velocity_i_m_s_[i] = time_series_data_[0][i + 4]; + } + } else if (diff_s > 1e6 || reference_interpolation_id_ >= time_series_data_.size()) { + if (!is_time_range_warning_displayed_) { + std::cout << "[WARNING] Time series file orbit propagation: Time is out of range of time series file." << std::endl; + is_time_range_warning_displayed_ = true; + } + for (size_t i = 0; i < 3; i++) { + spacecraft_position_i_m_[i] = time_series_data_[time_series_data_.size() - 1][i + 1]; + spacecraft_velocity_i_m_s_[i] = time_series_data_[time_series_data_.size() - 1][i + 4]; + } + } else { + if (interpolation_method_ == 0) { + spacecraft_position_i_m_ = orbit_position_i_m_[0].CalcPositionWithPolynomial(diff_s); + spacecraft_velocity_i_m_s_ = orbit_velocity_i_m_s_[0].CalcPositionWithPolynomial(diff_s); + } else if (interpolation_method_ == 1) { + spacecraft_position_i_m_ = orbit_position_i_m_[0].CalcPositionWithTrigonometric(diff_s, math::tau / orbital_period_correction_s_); + spacecraft_velocity_i_m_s_ = orbit_velocity_i_m_s_[0].CalcPositionWithTrigonometric(diff_s, math::tau / orbital_period_correction_s_); + } else { + if (!is_interpolation_method_error_displayed_) { + std::cerr << "[ERROR] Time series file orbit propagation: Interpolation method " << interpolation_method_ << " is not defined!" << std::endl; + std::cerr << "The orbit mode is automatically set as Polynomial" << std::endl; + is_interpolation_method_error_displayed_ = true; + } + spacecraft_position_i_m_ = orbit_position_i_m_[0].CalcPositionWithPolynomial(diff_s); + spacecraft_velocity_i_m_s_ = orbit_velocity_i_m_s_[0].CalcPositionWithPolynomial(diff_s); + } + } + TransformEciToEcef(); + TransformEcefToGeodetic(); +} + +bool TimeSeriesFileOrbitPropagation::UpdateInterpolationInformation() { + double time_series_data_time_s = CalcEphemerisTimeData(reference_interpolation_id_); + double time_diff_s = time_series_data_time_s - reference_time_; + if (reference_interpolation_id_ >= time_series_data_.size()) { + for (size_t i = 0; i < 3; i++) { + spacecraft_position_i_m_[i] = time_series_data_[time_series_data_.size() - 1][i + 1]; + spacecraft_velocity_i_m_s_[i] = time_series_data_[time_series_data_.size() - 1][i + 4]; + } + } else { + for (size_t i = 0; i < 3; i++) { + spacecraft_position_i_m_[i] = time_series_data_[reference_interpolation_id_][i + 1]; + spacecraft_velocity_i_m_s_[i] = time_series_data_[reference_interpolation_id_][i + 4]; + } + } + + orbit_position_i_m_[0].PushAndPopData(time_diff_s, spacecraft_position_i_m_); + orbit_velocity_i_m_s_[0].PushAndPopData(time_diff_s, spacecraft_velocity_i_m_s_); + + reference_interpolation_id_++; + + return true; +} + +} // namespace s2e::dynamics::orbit diff --git a/src/dynamics/orbit/time_series_file_orbit_propagation.hpp b/src/dynamics/orbit/time_series_file_orbit_propagation.hpp new file mode 100644 index 000000000..722796b00 --- /dev/null +++ b/src/dynamics/orbit/time_series_file_orbit_propagation.hpp @@ -0,0 +1,90 @@ +/** + * @file time_series_file_orbit_propagation.hpp + * @brief Class to calculate satellite orbit using interpolation with orbit time series input + */ + +#ifndef S2E_DYNAMICS_ORBIT_TIME_SERIES_FILE_ORBIT_PROPAGATION_HPP_ +#define S2E_DYNAMICS_ORBIT_TIME_SERIES_FILE_ORBIT_PROPAGATION_HPP_ + +#include +#include +#include + +#include "orbit.hpp" + +namespace s2e::dynamics::orbit { +/** + * @class TimeSeriesFileOrbitPropagation + * @brief Class to calculate satellite orbit using interpolation with orbit time series input + */ +class TimeSeriesFileOrbitPropagation : public Orbit { + public: + /** + *@fn TimeSeriesFileOrbitPropagation + *@brief Constructor + * @param [in] celestial_information: Celestial information + * @param [in] time_series_file_path: Path to the time series file + * @param [in] number_of_interpolation: Number of interpolation + * @param [in] interpolation_method: Interpolation method + * @param [in] orbital_period_correction_s: Orbital period correction [s] + * @param [in] current_time_jd: Current Julian day [day] + */ + TimeSeriesFileOrbitPropagation(const environment::CelestialInformation* celestial_information, const std::string time_series_file_path, + const int number_of_interpolation, const int interpolation_method, const double orbital_period_correction_s, + const double current_time_jd); + + /** + *@fn ~TimeSeriesFileOrbitPropagation + *@brief Destructor + */ + virtual ~TimeSeriesFileOrbitPropagation() {} + + /** + * @fn CalcEphemerisTimeData + * @brief Return ephemeris time data for a specific ephemeris time ID. + * @param ephemeris_time_id The ephemeris time ID of the time series data. + */ + double CalcEphemerisTimeData(const size_t ephemeris_time_id) const; + + /** + * @fn SearchNearestEphemerisTimeId + * @brief Search the nearest ephemeris time ID from the time series data. + * @param current_time_jd: Current Julian day [day] + */ + size_t SearchNearestEphemerisTimeId(const double current_time_jd); + + // Override Orbit + /** + * @fn Propagate + * @brief Propagate orbit + * @param [in] end_time_s: End time of simulation [sec] + * @param [in] current_time_jd: Current Julian day [day] + */ + virtual void Propagate(const double end_time_s, const double current_time_jd); + + private: + bool is_time_range_warning_displayed_; //!< Flag for time range warning + bool is_interpolation_method_error_displayed_; //!< Flag for interpolation method error + + int number_of_interpolation_; //!< Number of interpolation + int interpolation_method_; //!< Interpolation method + double orbital_period_correction_s_; //!< Orbital period correction [s] + + std::vector> time_series_data_; //!< List of time series data + double reference_time_; //!< Reference start time of the time series data handling + size_t reference_interpolation_id_; //!< Reference EphemerisTime ID of the interpolation + + std::vector orbit_position_i_m_; //!< Position with interpolation + std::vector orbit_velocity_i_m_s_; //!< Velocity with interpolation + + /** + * @fn UpdateInterpolationInformation + * @brief Update interpolation information by inserting new data + * @return true: No error, false: Time series file out of range error + */ + bool UpdateInterpolationInformation(); +}; + +} // namespace s2e::dynamics::orbit + +#endif // S2E_DYNAMICS_ORBIT_TIME_SERIES_FILE_ORBIT_PROPAGATION_HPP_ diff --git a/src/dynamics/thermal/heater.cpp b/src/dynamics/thermal/heater.cpp index d47ce224a..e43e32951 100644 --- a/src/dynamics/thermal/heater.cpp +++ b/src/dynamics/thermal/heater.cpp @@ -5,6 +5,8 @@ using namespace std; +namespace s2e::dynamics::thermal { + Heater::Heater(const size_t heater_id, const double power_rating_W) : heater_id_(heater_id), power_rating_W_(power_rating_W) { AssertHeaterParams(); heater_status_ = HeaterStatus::kOff; @@ -75,3 +77,5 @@ Heater InitHeater(const std::vector& heater_str) { Heater heater(heater_id, power_rating_W); return heater; } + +} // namespace s2e::dynamics::thermal diff --git a/src/dynamics/thermal/heater.hpp b/src/dynamics/thermal/heater.hpp index 9ea964f73..5643efcdc 100644 --- a/src/dynamics/thermal/heater.hpp +++ b/src/dynamics/thermal/heater.hpp @@ -7,10 +7,12 @@ #define S2E_DYNAMICS_THERMAL_HEATER_HPP_ #include -#include +#include #include #include +namespace s2e::dynamics::thermal { + /** * @enum HeaterStatus * @brief Status of heater (On/Off) @@ -78,11 +80,11 @@ class Heater { void PrintParam(void); protected: - size_t heater_id_; // heater id (Use values over 1) - double power_rating_W_; // Power Rating (100% Duty) [W] + size_t heater_id_; //!< heater id (Use values over 1) + double power_rating_W_; //!& heater_str); +} // namespace s2e::dynamics::thermal + #endif // S2E_DYNAMICS_THERMAL_HEATER_HPP_ diff --git a/src/dynamics/thermal/heater_controller.cpp b/src/dynamics/thermal/heater_controller.cpp index 93c0fc811..e0c02658f 100644 --- a/src/dynamics/thermal/heater_controller.cpp +++ b/src/dynamics/thermal/heater_controller.cpp @@ -4,6 +4,8 @@ #include using namespace std; +namespace s2e::dynamics::thermal { + HeaterController::HeaterController(const double lower_threshold_degC, const double upper_threshold_degC) : lower_threshold_degC_(lower_threshold_degC), upper_threshold_degC_(upper_threshold_degC) { AssertHeaterControllerParams(); @@ -52,3 +54,5 @@ HeaterController InitHeaterController(const std::vector& heater_str HeaterController heater_controller(lower_threshold_degC, upper_threshold_degC); return heater_controller; } + +} // namespace s2e::dynamics::thermal diff --git a/src/dynamics/thermal/heater_controller.hpp b/src/dynamics/thermal/heater_controller.hpp index 347d8809e..0d8f76bc5 100644 --- a/src/dynamics/thermal/heater_controller.hpp +++ b/src/dynamics/thermal/heater_controller.hpp @@ -7,12 +7,14 @@ #define S2E_DYNAMICS_THERMAL_HEATER_CONTROLLER_HPP_ #include -#include +#include #include #include #include "heater.hpp" +namespace s2e::dynamics::thermal { + class HeaterController { public: /** @@ -43,12 +45,12 @@ class HeaterController { * @fn GetLowerThreshold_K * @brief Return Lower Threshold [K] */ - inline double GetLowerThreshold_K(void) const { return degC2K(lower_threshold_degC_); } + inline double GetLowerThreshold_K(void) const { return environment::degC2K(lower_threshold_degC_); } /** * @fn GetUpperThreshold_K * @brief Return Upper Threshold [K] */ - inline double GetUpperThreshold_K(void) const { return degC2K(upper_threshold_degC_); } + inline double GetUpperThreshold_K(void) const { return environment::degC2K(upper_threshold_degC_); } // Setter /** @@ -71,8 +73,8 @@ class HeaterController { void ControlHeater(Heater* p_heater, double temperature_degC); protected: - double lower_threshold_degC_; // Lower Threshold of Heater Control [degC] - double upper_threshold_degC_; // Upper Threshold of Heater Control [degC] + double lower_threshold_degC_; //!< Lower Threshold of Heater Control [degC] + double upper_threshold_degC_; //!< Upper Threshold of Heater Control [degC] /** * @fn AssertHeaterControllerParams @@ -89,4 +91,6 @@ class HeaterController { */ HeaterController InitHeaterController(const std::vector& heater_str); +} // namespace s2e::dynamics::thermal + #endif // S2E_DYNAMICS_THERMAL_HEATER_CONTROLLER_HPP_ diff --git a/src/dynamics/thermal/heatload.cpp b/src/dynamics/thermal/heatload.cpp index c182e4ecb..29b8cdb44 100644 --- a/src/dynamics/thermal/heatload.cpp +++ b/src/dynamics/thermal/heatload.cpp @@ -5,13 +5,16 @@ #include using namespace std; -using namespace libra; +using namespace s2e::math; + +namespace s2e::dynamics::thermal { Heatload::Heatload(int node_id, std::vector time_table_s, std::vector internal_heatload_table_W) : node_id_(node_id), time_table_s_(time_table_s), internal_heatload_table_W_(internal_heatload_table_W) { elapsed_time_s_ = 0; elapsed_time_idx_ = 0; solar_heatload_W_ = 0.0; + albedo_heatload_W_ = 0.0; internal_heatload_W_ = 0.0; heater_heatload_W_ = 0.0; total_heatload_W_ = 0.0; @@ -99,3 +102,5 @@ Heatload InitHeatload(const std::vector& time_str, const std::vecto return Heatload(node_id, time_table_s, internal_heatload_table_W); } + +} // namespace s2e::dynamics::thermal diff --git a/src/dynamics/thermal/heatload.hpp b/src/dynamics/thermal/heatload.hpp index 1851f24c2..a4e4afb25 100644 --- a/src/dynamics/thermal/heatload.hpp +++ b/src/dynamics/thermal/heatload.hpp @@ -6,10 +6,12 @@ #ifndef S2E_DYNAMICS_THERMAL_HEATLOAD_HPP_ #define S2E_DYNAMICS_THERMAL_HEATLOAD_HPP_ -#include +#include #include #include +namespace s2e::dynamics::thermal { + /** * @class Heatload * @brief Class for calculating heatload value for Node class object at elapsed time @@ -39,7 +41,7 @@ class Heatload { * @fn UpdateTotalHeatload * @brief Update total heatload value by summing up all factors */ - void UpdateTotalHeatload(void) { total_heatload_W_ = solar_heatload_W_ + internal_heatload_W_ + heater_heatload_W_; } + void UpdateTotalHeatload(void) { total_heatload_W_ = solar_heatload_W_ + albedo_heatload_W_ + internal_heatload_W_ + heater_heatload_W_; } // Getter /** @@ -47,6 +49,11 @@ class Heatload { * @brief Return Solar Heatload */ inline double GetSolarHeatload_W(void) const { return solar_heatload_W_; } + /** + * @fn GetAlbedoHeatload_W + * @brief Return Albedo Heatload + */ + inline double GetAlbedoHeatload_W(void) const { return albedo_heatload_W_; } /** * @fn GetInternalHeatload_W * @brief Return Internal Heatload @@ -68,37 +75,43 @@ class Heatload { * @brief Set the Time object * @param[in] elapsed_time_s */ - void SetElapsedTime_s(double elapsed_time_s); + void SetElapsedTime_s(const double elapsed_time_s); /** * @brief Set Internal Heatload [W] * @param[in] internal_heatload_W */ - inline void SetInternalHeatload_W(double internal_heatload_W) { internal_heatload_W_ = internal_heatload_W; } + inline void SetInternalHeatload_W(const double internal_heatload_W) { internal_heatload_W_ = internal_heatload_W; } /** * @brief Set Solar Heatload [W] * @param[in] solar_heatload_W */ - inline void SetSolarHeatload_W(double solar_heatload_W) { solar_heatload_W_ = solar_heatload_W; } + inline void SetSolarHeatload_W(const double solar_heatload_W) { solar_heatload_W_ = solar_heatload_W; } + /** + * @brief Set Albedo Heatload [W] + * @param[in] albedo_heatload_W + */ + inline void SetAlbedoHeatload_W(const double albedo_heatload_W) { albedo_heatload_W_ = albedo_heatload_W; } /** * @brief Set Heater Heatload [W] * @param[in] heater_heatload_W */ - inline void SetHeaterHeatload_W(double heater_heatload_W) { heater_heatload_W_ = heater_heatload_W; } + inline void SetHeaterHeatload_W(const double heater_heatload_W) { heater_heatload_W_ = heater_heatload_W; } protected: - double elapsed_time_s_; // Elapsed time [s] - unsigned int node_id_; // Node ID to apply heatload - std::vector time_table_s_; // Times that internal heatload values are defined [s] - std::vector internal_heatload_table_W_; // Defined internal heatload values [W] + double elapsed_time_s_; //!< Elapsed time [s] + unsigned int node_id_; //!< Node ID to apply heatload + std::vector time_table_s_; //!< Times that internal heatload values are defined [s] + std::vector internal_heatload_table_W_; //!< Defined internal heatload values [W] - unsigned int elapsed_time_idx_; // index of time_table_s_ that is closest to elapsed_time_s_ - double solar_heatload_W_; // Heatload from solar flux [W] - double internal_heatload_W_; // Heatload from internal dissipation [W] - double heater_heatload_W_; // Heatload from heater [W] - double total_heatload_W_; // Total heatload [W] + unsigned int elapsed_time_idx_; //!< index of time_table_s_ that is closest to elapsed_time_s_ + double solar_heatload_W_; //!< Heatload from solar flux [W] + double albedo_heatload_W_; //!< Heatload from albedo flux [W] + double internal_heatload_W_; //!< Heatload from internal dissipation [W] + double heater_heatload_W_; //!< Heatload from heater [W] + double total_heatload_W_; //!< Total heatload [W] - double time_table_period_s_; // Value of last element of time_table_s_, which represents the period of the heatload table [s] - double residual_elapsed_time_s_; // Residual of dividing elapsed_time_s_ by time_table_period_s_ [s] + double time_table_period_s_; //!< Value of last element of time_table_s_, which represents the period of the heatload table [s] + double residual_elapsed_time_s_; //!< Residual of dividing elapsed_time_s_ by time_table_period_s_ [s] /** * @fn AssertHeatloadParams @@ -116,4 +129,6 @@ class Heatload { */ Heatload InitHeatload(const std::vector& time_str, const std::vector& internal_heatload_str); +} // namespace s2e::dynamics::thermal + #endif // S2E_DYNAMICS_THERMAL_HEATLOAD_HPP_ diff --git a/src/dynamics/thermal/node.cpp b/src/dynamics/thermal/node.cpp index e641ca2df..24440ce5a 100644 --- a/src/dynamics/thermal/node.cpp +++ b/src/dynamics/thermal/node.cpp @@ -10,10 +10,12 @@ #include using namespace std; -using namespace libra; +using namespace s2e::math; + +namespace s2e::dynamics::thermal { Node::Node(const size_t node_id, const string node_name, const NodeType node_type, const size_t heater_id, const double temperature_ini_K, - const double capacity_J_K, const double alpha, const double area_m2, libra::Vector<3> normal_vector_b) + const double capacity_J_K, const double alpha, const double area_m2, math::Vector<3> normal_vector_b) : node_id_(node_id), node_name_(node_name), heater_id_(heater_id), @@ -24,22 +26,37 @@ Node::Node(const size_t node_id, const string node_name, const NodeType node_typ node_type_(node_type), normal_vector_b_(normal_vector_b) { AssertNodeParams(); - solar_radiation_W_ = 0; + solar_radiation_W_ = 0.0; + albedo_radiation_W_ = 0.0; } Node::~Node() {} -double Node::CalcSolarRadiation_W(libra::Vector<3> sun_direction_b, double solar_flux_W_m2) { +double Node::CalcSolarRadiation_W(math::Vector<3> sun_direction_b, double solar_flux_W_m2) { double cos_theta = InnerProduct(sun_direction_b, normal_vector_b_); // calculate sun_power - if (cos_theta > 0) + if (cos_theta > 0.0) solar_radiation_W_ = solar_flux_W_m2 * area_m2_ * alpha_ * cos_theta; else - solar_radiation_W_ = 0; + solar_radiation_W_ = 0.0; return solar_radiation_W_; } +double Node::CalcAlbedoRadiation_W(math::Vector<3> earth_position_b_m, double earth_albedo_W_m2) { + math::Vector<3> earth_direction_b = earth_position_b_m.CalcNormalizedVector(); + + double cos_theta_albedo = InnerProduct(earth_direction_b, normal_vector_b_); + + // albedo radiation calculation; earth_albedo_W_m2 reflects the shadow coefficient. + if (cos_theta_albedo > 0.0) { + albedo_radiation_W_ = earth_albedo_W_m2 * area_m2_ * alpha_ * cos_theta_albedo; + } else { + albedo_radiation_W_ = 0.0; + } + return albedo_radiation_W_; +} + void Node::PrintParam(void) { string node_type_str = ""; if (node_type_ == NodeType::kDiffusive) { @@ -124,10 +141,10 @@ Node InitNode(const std::vector& node_str) { std::string node_label = "temp"; // node name size_t node_type_int = 0; // node type size_t heater_id = 0; // heater node index - double temperature_K = 0; // [K] - double capacity_J_K = 0; // [J/K] - double alpha = 0; // [] - double area_m2 = 0; // [m^2] + double temperature_K = 0.0; // [K] + double capacity_J_K = 0.0; // [J/K] + double alpha = 0.0; // [] + double area_m2 = 0.0; // [m^2] // Index to read from node_str for each parameter size_t index_node_id = 0; @@ -147,7 +164,7 @@ Node InitNode(const std::vector& node_str) { capacity_J_K = stod(node_str[index_capacity]); alpha = stod(node_str[index_alpha]); area_m2 = stod(node_str[index_area]); - libra::Vector<3> normal_v_b; + math::Vector<3> normal_v_b; for (size_t i = 0; i < 3; i++) { normal_v_b[i] = stod(node_str[index_normal_v_b_head + i]); } @@ -171,3 +188,5 @@ Node InitNode(const std::vector& node_str) { Node node(node_id, node_label, node_type, heater_id, temperature_K, capacity_J_K, alpha, area_m2, normal_v_b); return node; } + +} // namespace s2e::dynamics::thermal diff --git a/src/dynamics/thermal/node.hpp b/src/dynamics/thermal/node.hpp index 0de19fb8a..6c9da2660 100644 --- a/src/dynamics/thermal/node.hpp +++ b/src/dynamics/thermal/node.hpp @@ -7,20 +7,22 @@ #define S2E_DYNAMICS_THERMAL_NODE_HPP_ #include -#include +#include #include #include +namespace s2e::dynamics::thermal { + /** * @enum NodeType * @brief Type of node */ enum class NodeType { - //! Diffusive Node: Calculate temperature based on heat flow + //!< Diffusive Node: Calculate temperature based on heat flow kDiffusive, - //! Boundary Node: Fixed temperature + //!< Boundary Node: Fixed temperature kBoundary, - //! Arithmetic Node: Node without heat capacity, calculate temperature after diffusive nodes + //!< Arithmetic Node: Node without heat capacity, calculate temperature after diffusive nodes kArithmetic }; @@ -45,7 +47,7 @@ class Node { * @param[in] normal_vector_b: Normal vector of face with possibility of solar incidence (Body frame) */ Node(const size_t node_id, const std::string node_name, const NodeType node_type, const size_t heater_id, const double temperature_ini_K, - const double capacity_J_K, const double alpha, const double area_m2, libra::Vector<3> normal_vector_b); + const double capacity_J_K, const double alpha, const double area_m2, math::Vector<3> normal_vector_b); /** * @fn ~Node * @brief Destroy the Node object @@ -56,9 +58,19 @@ class Node { * @brief Calculate solar radiation [W] from sun direction, alpha, area, and normal vector * * @param sun_direction_b: Sun direction in body frame + * @param solar_flux_W_m2: Solar flux [W/m^2] * @return double: Solar Radiation [W] */ - double CalcSolarRadiation_W(libra::Vector<3> sun_direction_b, double solar_flux_W_m2); + double CalcSolarRadiation_W(math::Vector<3> sun_direction_b, double solar_flux_W_m2); + /** + * @fn CalcAlbedoRadiation_W + * @brief Calculate albedo radiation [W] from earth direction, albedo factor, area, and normal vector + * + * @param earth_position_b_m: Earth position in body frame + * @param earth_albedo_W_m2: Earth albedo [W/m^2] + * @return double: Albedo Radiation [W] + */ + double CalcAlbedoRadiation_W(math::Vector<3> earth_position_b_m, double earth_albedo_W_m2); // Getter /** @@ -90,7 +102,7 @@ class Node { * @brief Get temperature of node in degC * @return double: temperature [degC] */ - inline double GetTemperature_degC(void) const { return K2degC(temperature_K_); } + inline double GetTemperature_degC(void) const { return environment::K2degC(temperature_K_); } /** * @fn GetCapacity_J_K * @brief Return heat capacity of node [J/K] @@ -103,6 +115,12 @@ class Node { * @return double: Solar Radiation [W] */ inline double GetSolarRadiation_W(void) const { return solar_radiation_W_; } + /** + * @fn GetAlbedoRadiation_W + * @brief Return Albedo Radiation [W] + * @return double: Albedo Radiation [W] + */ + inline double GetAlbedoRadiation_W(void) const { return albedo_radiation_W_; } /** * @fn GetNodeType * @brief Return Node Type @@ -135,8 +153,9 @@ class Node { double alpha_; double area_m2_; double solar_radiation_W_; + double albedo_radiation_W_; NodeType node_type_; - libra::Vector<3> normal_vector_b_; + math::Vector<3> normal_vector_b_; /** * @fn AssertNodeParams @@ -153,4 +172,6 @@ class Node { */ Node InitNode(const std::vector& node_str); +} // namespace s2e::dynamics::thermal + #endif // S2E_DYNAMICS_THERMAL_NODE_HPP_ diff --git a/src/dynamics/thermal/temperature.cpp b/src/dynamics/thermal/temperature.cpp index 9b1b37d89..4fd6cc251 100644 --- a/src/dynamics/thermal/temperature.cpp +++ b/src/dynamics/thermal/temperature.cpp @@ -9,15 +9,18 @@ #include #include #include -#include -#include +#include +#include using namespace std; +namespace s2e::dynamics::thermal { + Temperature::Temperature(const vector> conductance_matrix_W_K, const vector> radiation_matrix_m2, vector nodes, vector heatloads, vector heaters, vector heater_controllers, const size_t node_num, - const double propagation_step_s, const SolarRadiationPressureEnvironment* srp_environment, const bool is_calc_enabled, - const SolarCalcSetting solar_calc_setting, const bool debug) + const double propagation_step_s, const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::EarthAlbedo* earth_albedo, const bool is_calc_enabled, const SolarCalcSetting solar_calc_setting, + const bool debug) : conductance_matrix_W_K_(conductance_matrix_W_K), radiation_matrix_m2_(radiation_matrix_m2), nodes_(nodes), @@ -27,6 +30,7 @@ Temperature::Temperature(const vector> conductance_matrix_W_K, co node_num_(node_num), propagation_step_s_(propagation_step_s), srp_environment_(srp_environment), + earth_albedo_(earth_albedo), is_calc_enabled_(is_calc_enabled), solar_calc_setting_(solar_calc_setting), debug_(debug) { @@ -47,18 +51,13 @@ Temperature::Temperature() { Temperature::~Temperature() {} -void Temperature::Propagate(libra::Vector<3> sun_position_b_m, const double time_end_s) { +void Temperature::Propagate(const environment::LocalCelestialInformation* local_celestial_information, const double time_end_s) { if (!is_calc_enabled_) return; - double sun_distance_m = sun_position_b_m.CalcNorm(); - libra::Vector<3> sun_direction_b; - for (size_t i = 0; i < 3; i++) { - sun_direction_b[i] = sun_position_b_m[i] / sun_distance_m; - } while (time_end_s - propagation_time_s_ - propagation_step_s_ > 1.0e-6) { - CalcRungeOneStep(propagation_time_s_, propagation_step_s_, sun_direction_b, node_num_); + CalcRungeOneStep(propagation_time_s_, propagation_step_s_, local_celestial_information, node_num_); propagation_time_s_ += propagation_step_s_; } - CalcRungeOneStep(propagation_time_s_, time_end_s - propagation_time_s_, sun_direction_b, node_num_); + CalcRungeOneStep(propagation_time_s_, time_end_s - propagation_time_s_, local_celestial_information, node_num_); propagation_time_s_ = time_end_s; UpdateHeaterStatus(); @@ -66,16 +65,27 @@ void Temperature::Propagate(libra::Vector<3> sun_position_b_m, const double time cout << fixed; cout << "Time: " << time_end_s << " Temp: "; for (auto itr = nodes_.begin(); itr != nodes_.end(); ++itr) { - cout << setprecision(4) << itr->GetTemperature_K() << " "; + cout << setprecision(4) << itr->GetTemperature_degC() << " "; } cout << "SolarR: "; for (auto itr = nodes_.begin(); itr != nodes_.end(); ++itr) { cout << setprecision(4) << itr->GetSolarRadiation_W() << " "; } + math::Vector<3> sun_direction_b = local_celestial_information->GetPositionFromSpacecraft_b_m("SUN").CalcNormalizedVector(); cout << "SunDir: "; for (size_t i = 0; i < 3; i++) { cout << setprecision(3) << sun_direction_b[i] << " "; } + cout << "ShadowCoefficient: " << setprecision(4) << srp_environment_->GetShadowCoefficient() << " "; + cout << "EarthAlbedoR: "; + for (auto itr = nodes_.begin(); itr != nodes_.end(); ++itr) { + cout << setprecision(4) << itr->GetAlbedoRadiation_W() << " "; + } + math::Vector<3> earth_direction_b = local_celestial_information->GetPositionFromSpacecraft_b_m("EARTH").CalcNormalizedVector(); + cout << "EarthDir: "; + for (size_t i = 0; i < 3; i++) { + cout << setprecision(3) << earth_direction_b[i] << " "; + } cout << "Heatload: "; for (auto itr = heatloads_.begin(); itr != heatloads_.end(); ++itr) { cout << setprecision(3) << itr->GetTotalHeatload_W() << " "; @@ -84,7 +94,8 @@ void Temperature::Propagate(libra::Vector<3> sun_position_b_m, const double time } } -void Temperature::CalcRungeOneStep(double time_now_s, double time_step_s, libra::Vector<3> sun_direction_b, size_t node_num) { +void Temperature::CalcRungeOneStep(double time_now_s, double time_step_s, const environment::LocalCelestialInformation* local_celestial_information, + size_t node_num) { vector temperatures_now_K(node_num); for (size_t i = 0; i < node_num; i++) { temperatures_now_K[i] = nodes_[i].GetTemperature_K(); @@ -93,22 +104,22 @@ void Temperature::CalcRungeOneStep(double time_now_s, double time_step_s, libra: vector k1(node_num), k2(node_num), k3(node_num), k4(node_num); vector xk2(node_num), xk3(node_num), xk4(node_num); - k1 = CalcTemperatureDifferentials(temperatures_now_K, time_now_s, sun_direction_b, node_num); + k1 = CalcTemperatureDifferentials(temperatures_now_K, time_now_s, local_celestial_information, node_num); for (size_t i = 0; i < node_num; i++) { xk2[i] = temperatures_now_K[i] + (time_step_s / 2.0) * k1[i]; } - k2 = CalcTemperatureDifferentials(xk2, (time_now_s + time_step_s / 2.0), sun_direction_b, node_num); + k2 = CalcTemperatureDifferentials(xk2, (time_now_s + time_step_s / 2.0), local_celestial_information, node_num); for (size_t i = 0; i < node_num; i++) { xk3[i] = temperatures_now_K[i] + (time_step_s / 2.0) * k2[i]; } - k3 = CalcTemperatureDifferentials(xk3, (time_now_s + time_step_s / 2.0), sun_direction_b, node_num); + k3 = CalcTemperatureDifferentials(xk3, (time_now_s + time_step_s / 2.0), local_celestial_information, node_num); for (size_t i = 0; i < node_num; i++) { xk4[i] = temperatures_now_K[i] + time_step_s * k3[i]; } - k4 = CalcTemperatureDifferentials(xk4, (time_now_s + time_step_s), sun_direction_b, node_num); + k4 = CalcTemperatureDifferentials(xk4, (time_now_s + time_step_s), local_celestial_information, node_num); vector temperatures_next_K(node_num); for (size_t i = 0; i < node_num; i++) { @@ -120,10 +131,12 @@ void Temperature::CalcRungeOneStep(double time_now_s, double time_step_s, libra: } } -vector Temperature::CalcTemperatureDifferentials(vector temperatures_K, double t, libra::Vector<3> sun_direction_b, size_t node_num) { +vector Temperature::CalcTemperatureDifferentials(vector temperatures_K, double t, + const environment::LocalCelestialInformation* local_celestial_information, size_t node_num) { // TODO: consider the following unused arguments are really needed UNUSED(temperatures_K); + math::Vector<3> sun_direction_b = local_celestial_information->GetPositionFromSpacecraft_b_m("SUN").CalcNormalizedVector(); vector differentials_K_s(node_num); for (size_t i = 0; i < node_num; i++) { heatloads_[i].SetElapsedTime_s(t); @@ -131,6 +144,9 @@ vector Temperature::CalcTemperatureDifferentials(vector temperat double solar_flux_W_m2 = srp_environment_->GetPowerDensity_W_m2(); if (solar_calc_setting_ == SolarCalcSetting::kEnable) { double solar_radiation_W = nodes_[i].CalcSolarRadiation_W(sun_direction_b, solar_flux_W_m2); + math::Vector<3> earth_position_b_m = local_celestial_information->GetPositionFromSpacecraft_b_m("EARTH"); + double albedo_radiation_W = nodes_[i].CalcAlbedoRadiation_W(earth_position_b_m, earth_albedo_->GetEarthAlbedoRadiationPower_W_m2()); + heatloads_[i].SetAlbedoHeatload_W(albedo_radiation_W); heatloads_[i].SetSolarHeatload_W(solar_radiation_W); } double heater_power_W = GetHeaterPower_W(i); @@ -181,14 +197,14 @@ string Temperature::GetLogHeader() const { // Do not retrieve boundary node values if (nodes_[i].GetNodeType() != NodeType::kBoundary) { string str_node = "temp_" + to_string(nodes_[i].GetNodeId()) + " (" + nodes_[i].GetNodeName() + ")"; - str_tmp += WriteScalar(str_node, "deg"); + str_tmp += logger::WriteScalar(str_node, "deg"); } } for (size_t i = 0; i < node_num_; i++) { // Do not retrieve boundary node values if (nodes_[i].GetNodeType() != NodeType::kBoundary) { string str_node = "heat_" + to_string(nodes_[i].GetNodeId()) + " (" + nodes_[i].GetNodeName() + ")"; - str_tmp += WriteScalar(str_node, "W"); + str_tmp += logger::WriteScalar(str_node, "W"); } } return str_tmp; @@ -199,13 +215,13 @@ string Temperature::GetLogValue() const { for (size_t i = 0; i < node_num_; i++) { // Do not retrieve boundary node values if (nodes_[i].GetNodeType() != NodeType::kBoundary) { - str_tmp += WriteScalar(nodes_[i].GetTemperature_degC()); + str_tmp += logger::WriteScalar(nodes_[i].GetTemperature_degC()); } } for (size_t i = 0; i < node_num_; i++) { // Do not retrieve boundary node values if (nodes_[i].GetNodeType() != NodeType::kBoundary) { - str_tmp += WriteScalar(heatloads_[i].GetTotalHeatload_W()); + str_tmp += logger::WriteScalar(heatloads_[i].GetTotalHeatload_W()); } } return str_tmp; @@ -276,8 +292,9 @@ First row is time data using std::string; using std::vector; -Temperature* InitTemperature(const std::string file_name, const double rk_prop_step_s, const SolarRadiationPressureEnvironment* srp_environment) { - auto mainIni = IniAccess(file_name); +Temperature* InitTemperature(const std::string file_name, const double rk_prop_step_s, + const environment::SolarRadiationPressureEnvironment* srp_environment, const environment::EarthAlbedo* earth_albedo) { + auto mainIni = setting_file_reader::IniAccess(file_name); vector node_list; vector heater_list; @@ -315,7 +332,7 @@ Temperature* InitTemperature(const std::string file_name, const double rk_prop_s // Read Heatloads from CSV File string filepath_heatload = file_path + "heatload.csv"; - IniAccess conf_heatload(filepath_heatload); + setting_file_reader::IniAccess conf_heatload(filepath_heatload); conf_heatload.ReadCsvString(heatload_str_list, 100); /*since we don't know the number of node_list yet, set node_num=100 temporary. Recall that Nodes_num are given to this function only to reserve memory*/ @@ -328,7 +345,7 @@ Temperature* InitTemperature(const std::string file_name, const double rk_prop_s // Read Node Properties from CSV File string filepath_node = file_path + "node.csv"; - IniAccess conf_node(filepath_node); + setting_file_reader::IniAccess conf_node(filepath_node); conf_node.ReadCsvString(node_str_list, 100); /*since we don't know the number of node_list yet, set node_num=100 temporary. Recall that Nodes_num are given to this function only to reserve memory*/ @@ -343,7 +360,7 @@ Temperature* InitTemperature(const std::string file_name, const double rk_prop_s // Read Heater Properties from CSV File string filepath_heater = file_path + "heaters.csv"; - IniAccess conf_heater(filepath_heater); + setting_file_reader::IniAccess conf_heater(filepath_heater); conf_heater.ReadCsvString(heater_str_list, 100); /*since we don't know the number of heater_list yet, set heater_num=100 temporary. Recall that heater_num are given to this function only to reserve memory*/ @@ -359,8 +376,8 @@ Temperature* InitTemperature(const std::string file_name, const double rk_prop_s // Read Cij,Rij data from CSV File string filepath_cij = file_path + "cij.csv"; string filepath_rij = file_path + "rij.csv"; - IniAccess conf_cij(filepath_cij); - IniAccess conf_rij(filepath_rij); + setting_file_reader::IniAccess conf_cij(filepath_cij); + setting_file_reader::IniAccess conf_rij(filepath_rij); conf_cij.ReadCsvDoubleWithHeader(conductance_matrix, node_num, 1, 1); conf_rij.ReadCsvDoubleWithHeader(radiation_matrix, node_num, 1, 1); @@ -371,6 +388,8 @@ Temperature* InitTemperature(const std::string file_name, const double rk_prop_s Temperature* temperature; temperature = new Temperature(conductance_matrix, radiation_matrix, node_list, heatload_list, heater_list, heater_controller_list, node_num, - rk_prop_step_s, srp_environment, is_calc_enabled, solar_calc_setting, debug); + rk_prop_step_s, srp_environment, earth_albedo, is_calc_enabled, solar_calc_setting, debug); return temperature; } + +} // namespace s2e::dynamics::thermal diff --git a/src/dynamics/thermal/temperature.hpp b/src/dynamics/thermal/temperature.hpp index b45a8edd2..292e432d5 100644 --- a/src/dynamics/thermal/temperature.hpp +++ b/src/dynamics/thermal/temperature.hpp @@ -6,8 +6,9 @@ #ifndef S2E_DYNAMICS_THERMAL_TEMPERATURE_HPP_ #define S2E_DYNAMICS_THERMAL_TEMPERATURE_HPP_ +#include #include -#include +#include #include #include @@ -16,6 +17,8 @@ #include "heatload.hpp" #include "node.hpp" +namespace s2e::dynamics::thermal { + /** * @enum SolarCalcSetting * @brief Whether to calculate solar radiation inside simulation @@ -29,21 +32,22 @@ enum class SolarCalcSetting { * @class Temperature * @brief class to calculate temperature of all nodes */ -class Temperature : public ILoggable { +class Temperature : public logger::ILoggable { protected: - std::vector> conductance_matrix_W_K_; // Coupling of node i and node j by heat conduction [W/K] - std::vector> radiation_matrix_m2_; // Coupling of node i and node j by thermal radiation [m2] - std::vector nodes_; // vector of nodes - std::vector heatloads_; // vector of heatloads - std::vector heaters_; // vector of heaters - std::vector heater_controllers_; // vector of heater controllers - size_t node_num_; // number of nodes - double propagation_step_s_; // propagation step [s] - double propagation_time_s_; // Incremented time inside class Temperature [s], finish propagation when reaching end_time - const SolarRadiationPressureEnvironment* srp_environment_; // SolarRadiationPressureEnvironment for calculating solar flux - bool is_calc_enabled_; // Whether temperature calculation is enabled - SolarCalcSetting solar_calc_setting_; // setting for solar calculation - bool debug_; // Activate debug output or not + std::vector> conductance_matrix_W_K_; //!< Coupling of node i and node j by heat conduction [W/K] + std::vector> radiation_matrix_m2_; //!< Coupling of node i and node j by thermal radiation [m2] + std::vector nodes_; //!< vector of nodes + std::vector heatloads_; //!< vector of heatloads + std::vector heaters_; //!< vector of heaters + std::vector heater_controllers_; //!< vector of heater controllers + size_t node_num_; //!< number of nodes + double propagation_step_s_; //!< propagation step [s] + double propagation_time_s_; //!< Incremented time inside class Temperature [s], finish propagation when reaching end_time + const environment::SolarRadiationPressureEnvironment* srp_environment_; //!< SolarRadiationPressureEnvironment for calculating solar flux + const environment::EarthAlbedo* earth_albedo_; //!< EarthAlbedo object for calculating earth albedo + bool is_calc_enabled_; //!< Whether temperature calculation is enabled + SolarCalcSetting solar_calc_setting_; //!< setting for solar calculation + bool debug_; //!< Activate debug output or not /** * @fn CalcRungeOneStep @@ -51,22 +55,23 @@ class Temperature : public ILoggable { * * @param[in] time_now_s: Current elapsed time [s] * @param[in] time_step_s: Time step of RK4 [s] - * @param[in] sun_direction_b: Sun position in body frame [m] + * @param[in] local_celestial_information: LocalCelestialInformation object for calculating radiation * @param[in] node_num: Number of nodes */ - void CalcRungeOneStep(double time_now_s, double time_step_s, libra::Vector<3> sun_direction_b, size_t node_num); + void CalcRungeOneStep(double time_now_s, double time_step_s, const environment::LocalCelestialInformation* local_celestial_information, + size_t node_num); /** * @fn CalcTemperatureDifferentials * @brief Calculate differential of thermal equilibrium equation * * @param temperatures_K: [UNUSED] Temperatures of each node [K] * @param time_now_s: Current elapsed time [s] - * @param[in] sun_direction_b: Sun direction in body frame + * @param[in] local_celestial_information: LocalCelestialInformation object for calculating radiation * @param node_num: Number of nodes * @return std::vector: Differential of thermal equilibrium equation at time now */ - std::vector CalcTemperatureDifferentials(std::vector temperatures_K, double time_now_s, const libra::Vector<3> sun_direction_b, - size_t node_num); + std::vector CalcTemperatureDifferentials(std::vector temperatures_K, double time_now_s, + const environment::LocalCelestialInformation* local_celestial_information, size_t node_num); public: /** @@ -81,14 +86,16 @@ class Temperature : public ILoggable { * @param heater_controllers: Vector of all heater controllers included in calculation * @param node_num: Number of nodes * @param propagation_step_s: Propagation time step [s] + * @param srp_environment: SolarRadiationPressureEnvironment object for calculating solar flux + * @param earth_albedo: EarthAlbedo object for calculating earth albedo * @param is_calc_enabled: Whether calculation is enabled * @param solar_calc_setting: Solar calculation settings * @param debug: Whether debug is enabled */ Temperature(const std::vector> conductance_matrix_W_K, const std::vector> radiation_matrix_m2, std::vector nodes, std::vector heatloads, std::vector heaters, std::vector heater_controllers, - const size_t node_num, const double propagation_step_s, const SolarRadiationPressureEnvironment* srp_environment, - const bool is_calc_enabled, const SolarCalcSetting solar_calc_setting, const bool debug); + const size_t node_num, const double propagation_step_s, const environment::SolarRadiationPressureEnvironment* srp_environment, + const environment::EarthAlbedo* earth_albedo, const bool is_calc_enabled, const SolarCalcSetting solar_calc_setting, const bool debug); /** * @fn Temperature * @brief Construct a new Temperature object, used when thermal calculation is disabled. @@ -105,14 +112,15 @@ class Temperature : public ILoggable { * @fn Propagate * @brief Propagate thermal calculation until time_end_s * - * @param[in] sun_position_b_m: Sun position in body frame [m] + * @param[in] local_celestial_information: LocalCelestialInformation object for calculating radiation * @param time_end_s: Time to finish propagation [s] */ - void Propagate(libra::Vector<3> sun_position_b_m, const double time_end_s); + void Propagate(const environment::LocalCelestialInformation* local_celestial_information, const double time_end_s); // Getter /** * @fn GetNodes + * * @brief Return Nodes * @return std::vector */ @@ -155,8 +163,12 @@ class Temperature : public ILoggable { * @brief Initialize Temperature object from csv file * @param[in] file_name: Directory of thermal input files * @param[in] rk_prop_step_s: time step interval for temperature propagation integration + * @param[in] srp_environment: SolarRadiationPressureEnvironment object for calculating solar flux * @return Temperature* */ -Temperature* InitTemperature(const std::string file_name, const double rk_prop_step_s, const SolarRadiationPressureEnvironment* srp_environment); +Temperature* InitTemperature(const std::string file_name, const double rk_prop_step_s, + const environment::SolarRadiationPressureEnvironment* srp_environment, const environment::EarthAlbedo* earth_albedo); + +} // namespace s2e::dynamics::thermal #endif // S2E_DYNAMICS_THERMAL_TEMPERATURE_HPP_ diff --git a/src/environment/global/CMakeLists.txt b/src/environment/global/CMakeLists.txt index bc64cef0e..8ce63a332 100644 --- a/src/environment/global/CMakeLists.txt +++ b/src/environment/global/CMakeLists.txt @@ -10,7 +10,6 @@ add_library(${PROJECT_NAME} STATIC clock_generator.cpp earth_rotation.cpp moon_rotation.cpp - initialize_gnss_satellites.cpp ) include(../../../common.cmake) diff --git a/src/environment/global/celestial_information.cpp b/src/environment/global/celestial_information.cpp index 9e7a2c71a..a8ffde6eb 100644 --- a/src/environment/global/celestial_information.cpp +++ b/src/environment/global/celestial_information.cpp @@ -15,8 +15,10 @@ #include #include -#include "library/initialize/initialize_file_access.hpp" -#include "library/logger/log_utility.hpp" +#include "logger/log_utility.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { CelestialInformation::CelestialInformation(const std::string inertial_frame_name, const std::string aberration_correction_setting, const std::string center_body_name, const unsigned int number_of_selected_body, int* selected_body_ids, @@ -163,8 +165,8 @@ std::string CelestialInformation::GetLogHeader() const { std::string body_pos = name + "_position"; std::string body_vel = name + "_velocity"; - str_tmp += WriteVector(body_pos, "i", "m", 3); - str_tmp += WriteVector(body_vel, "i", "m/s", 3); + str_tmp += logger::WriteVector(body_pos, "i", "m", 3); + str_tmp += logger::WriteVector(body_vel, "i", "m/s", 3); } return str_tmp; } @@ -173,10 +175,10 @@ std::string CelestialInformation::GetLogValue() const { std::string str_tmp = ""; for (unsigned int i = 0; i < number_of_selected_bodies_; i++) { for (int j = 0; j < 3; j++) { - str_tmp += WriteScalar(celestial_body_position_from_center_i_m_[i * 3 + j]); + str_tmp += logger::WriteScalar(celestial_body_position_from_center_i_m_[i * 3 + j]); } for (int j = 0; j < 3; j++) { - str_tmp += WriteScalar(celestial_body_velocity_from_center_i_m_s_[i * 3 + j]); + str_tmp += logger::WriteScalar(celestial_body_velocity_from_center_i_m_s_[i * 3 + j]); } } return str_tmp; @@ -199,7 +201,7 @@ void CelestialInformation::GetPlanetOrbit(const char* planet_name, const double } CelestialInformation* InitCelestialInformation(std::string file_name) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); const char* section = "CELESTIAL_INFORMATION"; const char* furnsh_section = "CSPICE_KERNELS"; @@ -244,3 +246,5 @@ CelestialInformation* InitCelestialInformation(std::string file_name) { return celestial_info; } + +} // namespace s2e::environment diff --git a/src/environment/global/celestial_information.hpp b/src/environment/global/celestial_information.hpp index 7c4afa854..ea04e562d 100644 --- a/src/environment/global/celestial_information.hpp +++ b/src/environment/global/celestial_information.hpp @@ -10,11 +10,13 @@ #include #include "earth_rotation.hpp" -#include "library/logger/loggable.hpp" -#include "library/math/vector.hpp" +#include "logger/loggable.hpp" +#include "math_physics/math/vector.hpp" #include "moon_rotation.hpp" #include "simulation_time.hpp" +namespace s2e::environment { + class MoonRotation; /** @@ -22,7 +24,7 @@ class MoonRotation; * @brief Class to manage the information related with the celestial bodies * @details This class uses SPICE to get the information of celestial bodies */ -class CelestialInformation : public ILoggable { +class CelestialInformation : public logger::ILoggable { public: /** * @fn CelestialInformation @@ -47,15 +49,15 @@ class CelestialInformation : public ILoggable { */ virtual ~CelestialInformation(); - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -73,8 +75,8 @@ class CelestialInformation : public ILoggable { * @brief Return position from the center body in the inertial frame [m] * @param [in] id: ID of CelestialInformation list */ - inline libra::Vector<3> GetPositionFromCenter_i_m(const unsigned int id) const { - libra::Vector<3> pos(0.0); + inline math::Vector<3> GetPositionFromCenter_i_m(const unsigned int id) const { + math::Vector<3> pos(0.0); if (id > number_of_selected_bodies_) return pos; for (int i = 0; i < 3; i++) pos[i] = celestial_body_position_from_center_i_m_[id * 3 + i]; return pos; @@ -84,7 +86,7 @@ class CelestialInformation : public ILoggable { * @brief Return position from the center body in the inertial frame [m] * @param [in] body_name: Name of the body defined in the SPICE */ - inline libra::Vector<3> GetPositionFromCenter_i_m(const char* body_name) const { + inline math::Vector<3> GetPositionFromCenter_i_m(const char* body_name) const { int id = CalcBodyIdFromName(body_name); return GetPositionFromCenter_i_m(id); } @@ -94,11 +96,11 @@ class CelestialInformation : public ILoggable { * @param [in] target_body_name: Name of the target body defined in the SPICE * @param [in] reference_body_name: Name of the reference body defined in the SPICE */ - inline libra::Vector<3> GetPositionFromSelectedBody_i_m(const char* target_body_name, const char* reference_body_name) const { + inline math::Vector<3> GetPositionFromSelectedBody_i_m(const char* target_body_name, const char* reference_body_name) const { int target_id = CalcBodyIdFromName(target_body_name); - libra::Vector<3> target_body_position_i_m = GetPositionFromCenter_i_m(target_id); + math::Vector<3> target_body_position_i_m = GetPositionFromCenter_i_m(target_id); int reference_id = CalcBodyIdFromName(reference_body_name); - libra::Vector<3> reference_body_position_i_m = GetPositionFromCenter_i_m(reference_id); + math::Vector<3> reference_body_position_i_m = GetPositionFromCenter_i_m(reference_id); return target_body_position_i_m - reference_body_position_i_m; } @@ -108,8 +110,8 @@ class CelestialInformation : public ILoggable { * @brief Return velocity from the center body in the inertial frame [m/s] * @param [in] id: ID of CelestialInformation list */ - inline libra::Vector<3> GetVelocityFromCenter_i_m_s(const unsigned int id) const { - libra::Vector<3> vel(0.0); + inline math::Vector<3> GetVelocityFromCenter_i_m_s(const unsigned int id) const { + math::Vector<3> vel(0.0); if (id > number_of_selected_bodies_) return vel; for (int i = 0; i < 3; i++) vel[i] = celestial_body_velocity_from_center_i_m_s_[id * 3 + i]; return vel; @@ -119,7 +121,7 @@ class CelestialInformation : public ILoggable { * @brief Return velocity from the center body in the inertial frame [m/s] * @param [in] body_name: Name of the body defined in the SPICE */ - inline libra::Vector<3> GetVelocityFromCenter_i_m_s(const char* body_name) const { + inline math::Vector<3> GetVelocityFromCenter_i_m_s(const char* body_name) const { int id = CalcBodyIdFromName(body_name); return GetVelocityFromCenter_i_m_s(id); } @@ -129,11 +131,11 @@ class CelestialInformation : public ILoggable { * @param [in] target_body_name: Name of the target body defined in the SPICE * @param [in] reference_body_name: Name of the reference body defined in the SPICE */ - inline libra::Vector<3> GetVelocityFromSelectedBody_i_m_s(const char* target_body_name, const char* reference_body_name) const { + inline math::Vector<3> GetVelocityFromSelectedBody_i_m_s(const char* target_body_name, const char* reference_body_name) const { int target_id = CalcBodyIdFromName(target_body_name); - libra::Vector<3> target_body_velocity_i_m_s = GetVelocityFromCenter_i_m_s(target_id); + math::Vector<3> target_body_velocity_i_m_s = GetVelocityFromCenter_i_m_s(target_id); int reference_id = CalcBodyIdFromName(reference_body_name); - libra::Vector<3> reference_body_velocity_i_m_s = GetVelocityFromCenter_i_m_s(reference_id); + math::Vector<3> reference_body_velocity_i_m_s = GetVelocityFromCenter_i_m_s(reference_id); return target_body_velocity_i_m_s - reference_body_velocity_i_m_s; } @@ -160,8 +162,8 @@ class CelestialInformation : public ILoggable { * @brief Return 3 axis planetographic radii of a celestial body [m] * @param [in] id: ID of CelestialInformation list */ - inline libra::Vector<3> GetRadii_m(const unsigned int id) const { - libra::Vector<3> radii(0.0); + inline math::Vector<3> GetRadii_m(const unsigned int id) const { + math::Vector<3> radii(0.0); if (id > number_of_selected_bodies_) return radii; for (int i = 0; i < 3; i++) radii[i] = celestial_body_planetographic_radii_m_[id * 3 + i]; return radii; @@ -171,7 +173,7 @@ class CelestialInformation : public ILoggable { * @brief Return 3 axis planetographic radii of a celestial body [m] * @param [in] body_name: Name of the body defined in the SPICE */ - inline libra::Vector<3> GetRadiiFromName_m(const char* body_name) const { + inline math::Vector<3> GetRadiiFromName_m(const char* body_name) const { int id = CalcBodyIdFromName(body_name); return GetRadii_m(id); } @@ -207,7 +209,7 @@ class CelestialInformation : public ILoggable { * @fn GetEarthRotation * @brief Return EarthRotation information */ - inline EarthRotation GetEarthRotation(void) const { return *earth_rotation_; }; + inline EarthRotation& GetEarthRotation(void) const { return *earth_rotation_; }; /** * @fn GetMoonRotation * @brief Return MoonRotation information @@ -281,4 +283,6 @@ class CelestialInformation : public ILoggable { */ CelestialInformation* InitCelestialInformation(std::string file_name); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_CELESTIAL_INFORMATION_HPP_ diff --git a/src/environment/global/clock_generator.cpp b/src/environment/global/clock_generator.cpp index a196efac0..5fd61999c 100644 --- a/src/environment/global/clock_generator.cpp +++ b/src/environment/global/clock_generator.cpp @@ -5,11 +5,13 @@ #include "clock_generator.hpp" +namespace s2e::environment { + ClockGenerator::~ClockGenerator() {} -void ClockGenerator::RegisterComponent(ITickable* tickable) { components_.push_back(tickable); } +void ClockGenerator::RegisterComponent(components::ITickable* tickable) { components_.push_back(tickable); } -void ClockGenerator::RemoveComponent(ITickable* tickable) { +void ClockGenerator::RemoveComponent(components::ITickable* tickable) { for (auto itr = components_.begin(); itr != components_.end();) { if (*itr == tickable) { components_.erase(itr++); @@ -38,3 +40,5 @@ void ClockGenerator::UpdateComponents(const SimulationTime* simulation_time) { TickToComponents(); } } + +} // namespace s2e::environment diff --git a/src/environment/global/clock_generator.hpp b/src/environment/global/clock_generator.hpp index b09b80c4a..87361d772 100644 --- a/src/environment/global/clock_generator.hpp +++ b/src/environment/global/clock_generator.hpp @@ -11,6 +11,8 @@ #include "simulation_time.hpp" +namespace s2e::environment { + /** * @class ClockGenerator * @brief Class to generate clock for classes which have ITickable @@ -28,13 +30,13 @@ class ClockGenerator { * @brief Register component which has ITickable * @param [in] tickable: Component class */ - void RegisterComponent(ITickable* tickable); + void RegisterComponent(components::ITickable* tickable); /** * @fn RemoveComponent * @brief Removed registered component * @param [in] tickable: Registered component class */ - void RemoveComponent(ITickable* tickable); + void RemoveComponent(components::ITickable* tickable); /** * @fn TickToComponents * @brief Execute tick function of all registered components @@ -53,8 +55,10 @@ class ClockGenerator { inline void ClearTimerCount(void) { timer_count_ = 0; } private: - std::vector components_; //!< Component list fot tick - unsigned int timer_count_; //!< Timer count TODO: change to long? + std::vector components_; //!< Component list fot tick + unsigned int timer_count_; //!< Timer count TODO: change to long? }; +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_CLOCK_GENERATOR_HPP_ diff --git a/src/environment/global/earth_rotation.cpp b/src/environment/global/earth_rotation.cpp index 2f8218dde..f7eedde82 100644 --- a/src/environment/global/earth_rotation.cpp +++ b/src/environment/global/earth_rotation.cpp @@ -11,13 +11,15 @@ #include #include -#include "library/external/sgp4/sgp4ext.h" // for jday() -#include "library/external/sgp4/sgp4unit.h" // for gstime() -#include "library/math/constants.hpp" +#include "math_physics/math/constants.hpp" +#include "math_physics/orbit/sgp4/sgp4ext.h" // for jday() +#include "math_physics/orbit/sgp4/sgp4unit.h" // for gstime() + +namespace s2e::environment { // Default constructor EarthRotation::EarthRotation(const EarthRotationMode rotation_mode) : rotation_mode_(rotation_mode) { - dcm_j2000_to_ecef_ = libra::MakeIdentityMatrix<3>(); + dcm_j2000_to_ecef_ = math::MakeIdentityMatrix<3>(); dcm_teme_to_ecef_ = dcm_j2000_to_ecef_; InitializeParameters(); } @@ -32,80 +34,80 @@ void EarthRotation::InitializeParameters() { // Coefficients to compute mean obliquity of the ecliptic // The actual unit of the coefficients are [rad/century^i], where i is the index of the array - c_epsilon_rad_[0] = 23.4392911 * libra::deg_to_rad; // [rad] - c_epsilon_rad_[1] = -46.8150000 * libra::arcsec_to_rad; // [rad/century] - c_epsilon_rad_[2] = -5.9000e-4 * libra::arcsec_to_rad; // [rad/century^2] - c_epsilon_rad_[3] = 1.8130e-3 * libra::arcsec_to_rad; // [rad/century^3] + c_epsilon_rad_[0] = 23.4392911 * math::deg_to_rad; // [rad] + c_epsilon_rad_[1] = -46.8150000 * math::arcsec_to_rad; // [rad/century] + c_epsilon_rad_[2] = -5.9000e-4 * math::arcsec_to_rad; // [rad/century^2] + c_epsilon_rad_[3] = 1.8130e-3 * math::arcsec_to_rad; // [rad/century^3] // Coefficients to compute Delaunay angles // The actual unit of the coefficients are [rad/century^i], where i is the index of the array - c_lm_rad_[0] = 134.96340251 * libra::deg_to_rad; // [rad] - c_lm_rad_[1] = 1717915923.21780000 * libra::arcsec_to_rad; // [rad/century] - c_lm_rad_[2] = 31.87920000 * libra::arcsec_to_rad; // [rad/century^2] - c_lm_rad_[3] = 0.05163500 * libra::arcsec_to_rad; // [rad/century^3] - c_lm_rad_[4] = -0.00024470 * libra::arcsec_to_rad; // [rad/century^4] - - c_ls_rad_[0] = 357.52910918 * libra::deg_to_rad; // [rad] - c_ls_rad_[1] = 129596581.04810000 * libra::arcsec_to_rad; // [rad/century] - c_ls_rad_[2] = -0.55320000 * libra::arcsec_to_rad; // [rad/century^2] - c_ls_rad_[3] = 0.00013600 * libra::arcsec_to_rad; // [rad/century^3] - c_ls_rad_[4] = -0.00001149 * libra::arcsec_to_rad; // [rad/century^4] - - c_f_rad_[0] = 93.27209062 * libra::deg_to_rad; // [rad] - c_f_rad_[1] = 1739527262.84780000 * libra::arcsec_to_rad; // [rad/century] - c_f_rad_[2] = -12.75120000 * libra::arcsec_to_rad; // [rad/century^2] - c_f_rad_[3] = -0.00103700 * libra::arcsec_to_rad; // [rad/century^3] - c_f_rad_[4] = 0.00000417 * libra::arcsec_to_rad; // [rad/century^4] - - c_d_rad_[0] = 297.85019547 * libra::deg_to_rad; // [rad] - c_d_rad_[1] = 1602961601.20900000 * libra::arcsec_to_rad; // [rad/century] - c_d_rad_[2] = -6.37060000 * libra::arcsec_to_rad; // [rad/century^2] - c_d_rad_[3] = 0.00659300 * libra::arcsec_to_rad; // [rad/century^3] - c_d_rad_[4] = -0.00003169 * libra::arcsec_to_rad; // [rad/century^4] - - c_o_rad_[0] = 125.04455501 * libra::deg_to_rad; // [rad] - c_o_rad_[1] = -6962890.54310000 * libra::arcsec_to_rad; // [rad/century] - c_o_rad_[2] = 7.47220000 * libra::arcsec_to_rad; // [rad/century^2] - c_o_rad_[3] = 0.00770200 * libra::arcsec_to_rad; // [rad/century^3] - c_o_rad_[4] = -0.00005939 * libra::arcsec_to_rad; // [rad/century^4] + c_lm_rad_[0] = 134.96340251 * math::deg_to_rad; // [rad] + c_lm_rad_[1] = 1717915923.21780000 * math::arcsec_to_rad; // [rad/century] + c_lm_rad_[2] = 31.87920000 * math::arcsec_to_rad; // [rad/century^2] + c_lm_rad_[3] = 0.05163500 * math::arcsec_to_rad; // [rad/century^3] + c_lm_rad_[4] = -0.00024470 * math::arcsec_to_rad; // [rad/century^4] + + c_ls_rad_[0] = 357.52910918 * math::deg_to_rad; // [rad] + c_ls_rad_[1] = 129596581.04810000 * math::arcsec_to_rad; // [rad/century] + c_ls_rad_[2] = -0.55320000 * math::arcsec_to_rad; // [rad/century^2] + c_ls_rad_[3] = 0.00013600 * math::arcsec_to_rad; // [rad/century^3] + c_ls_rad_[4] = -0.00001149 * math::arcsec_to_rad; // [rad/century^4] + + c_f_rad_[0] = 93.27209062 * math::deg_to_rad; // [rad] + c_f_rad_[1] = 1739527262.84780000 * math::arcsec_to_rad; // [rad/century] + c_f_rad_[2] = -12.75120000 * math::arcsec_to_rad; // [rad/century^2] + c_f_rad_[3] = -0.00103700 * math::arcsec_to_rad; // [rad/century^3] + c_f_rad_[4] = 0.00000417 * math::arcsec_to_rad; // [rad/century^4] + + c_d_rad_[0] = 297.85019547 * math::deg_to_rad; // [rad] + c_d_rad_[1] = 1602961601.20900000 * math::arcsec_to_rad; // [rad/century] + c_d_rad_[2] = -6.37060000 * math::arcsec_to_rad; // [rad/century^2] + c_d_rad_[3] = 0.00659300 * math::arcsec_to_rad; // [rad/century^3] + c_d_rad_[4] = -0.00003169 * math::arcsec_to_rad; // [rad/century^4] + + c_o_rad_[0] = 125.04455501 * math::deg_to_rad; // [rad] + c_o_rad_[1] = -6962890.54310000 * math::arcsec_to_rad; // [rad/century] + c_o_rad_[2] = 7.47220000 * math::arcsec_to_rad; // [rad/century^2] + c_o_rad_[3] = 0.00770200 * math::arcsec_to_rad; // [rad/century^3] + c_o_rad_[4] = -0.00005939 * math::arcsec_to_rad; // [rad/century^4] // Coefficients to compute nutation angles - c_d_epsilon_rad_[0] = 9.2050 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[1] = 0.5730 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[2] = -0.0900 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[3] = 0.0980 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[4] = 0.0070 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[5] = -0.0010 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[6] = 0.0220 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[7] = 0.0130 * libra::arcsec_to_rad; // [rad] - c_d_epsilon_rad_[8] = -0.0100 * libra::arcsec_to_rad; // [rad] - - c_d_psi_rad_[0] = -17.2060 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[1] = -1.3170 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[2] = 0.2070 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[3] = -0.2280 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[4] = 0.1480 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[5] = 0.0710 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[6] = -0.0520 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[7] = -0.0300 * libra::arcsec_to_rad; // [rad] - c_d_psi_rad_[8] = 0.0220 * libra::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[0] = 9.2050 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[1] = 0.5730 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[2] = -0.0900 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[3] = 0.0980 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[4] = 0.0070 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[5] = -0.0010 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[6] = 0.0220 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[7] = 0.0130 * math::arcsec_to_rad; // [rad] + c_d_epsilon_rad_[8] = -0.0100 * math::arcsec_to_rad; // [rad] + + c_d_psi_rad_[0] = -17.2060 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[1] = -1.3170 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[2] = 0.2070 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[3] = -0.2280 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[4] = 0.1480 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[5] = 0.0710 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[6] = -0.0520 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[7] = -0.0300 * math::arcsec_to_rad; // [rad] + c_d_psi_rad_[8] = 0.0220 * math::arcsec_to_rad; // [rad] // Coefficients to compute precession angle // The actual unit of the coefficients are [rad/century^i], where i is the index of the array - c_zeta_rad_[0] = 2306.218100 * libra::arcsec_to_rad; // [rad/century] - c_zeta_rad_[1] = 0.301880 * libra::arcsec_to_rad; // [rad/century^2] - c_zeta_rad_[2] = 0.017998 * libra::arcsec_to_rad; // [rad/century^3] + c_zeta_rad_[0] = 2306.218100 * math::arcsec_to_rad; // [rad/century] + c_zeta_rad_[1] = 0.301880 * math::arcsec_to_rad; // [rad/century^2] + c_zeta_rad_[2] = 0.017998 * math::arcsec_to_rad; // [rad/century^3] - c_theta_rad_[0] = 2004.310900 * libra::arcsec_to_rad; // [rad/century] - c_theta_rad_[1] = -0.426650 * libra::arcsec_to_rad; // [rad/century^2] - c_theta_rad_[2] = -0.041833 * libra::arcsec_to_rad; // [rad/century^3] + c_theta_rad_[0] = 2004.310900 * math::arcsec_to_rad; // [rad/century] + c_theta_rad_[1] = -0.426650 * math::arcsec_to_rad; // [rad/century^2] + c_theta_rad_[2] = -0.041833 * math::arcsec_to_rad; // [rad/century^3] - c_z_rad_[0] = 2306.218100 * libra::arcsec_to_rad; // [rad/century] - c_z_rad_[1] = 1.094680 * libra::arcsec_to_rad; // [rad/century^2] - c_z_rad_[2] = 0.018203 * libra::arcsec_to_rad; // [rad/century^3] + c_z_rad_[0] = 2306.218100 * math::arcsec_to_rad; // [rad/century] + c_z_rad_[1] = 1.094680 * math::arcsec_to_rad; // [rad/century^2] + c_z_rad_[2] = 0.018203 * math::arcsec_to_rad; // [rad/century^3] } else { // If the rotation mode is neither Simple nor Full, disable the rotation calculation and make the DCM a unit matrix - dcm_j2000_to_ecef_ = libra::MakeIdentityMatrix<3>(); + dcm_j2000_to_ecef_ = math::MakeIdentityMatrix<3>(); } } @@ -125,10 +127,10 @@ void EarthRotation::Update(const double julian_date) { terrestrial_time_julian_century[i + 1] = terrestrial_time_julian_century[i] * terrestrial_time_julian_century[0]; } - libra::Matrix<3, 3> dcm_precession; - libra::Matrix<3, 3> dcm_nutation; - libra::Matrix<3, 3> dcm_rotation; - libra::Matrix<3, 3> dcm_polar_motion; + math::Matrix<3, 3> dcm_precession; + math::Matrix<3, 3> dcm_nutation; + math::Matrix<3, 3> dcm_rotation; + math::Matrix<3, 3> dcm_polar_motion; // Nutation + Precession dcm_precession = Precession(terrestrial_time_julian_century); dcm_nutation = Nutation(terrestrial_time_julian_century); // epsilon_rad_, d_epsilon_rad_, d_psi_rad_ are updated in this procedure @@ -154,9 +156,9 @@ void EarthRotation::Update(const double julian_date) { } } -libra::Matrix<3, 3> EarthRotation::AxialRotation(const double gast_rad) { return libra::MakeRotationMatrixZ(gast_rad); } +math::Matrix<3, 3> EarthRotation::AxialRotation(const double gast_rad) { return math::MakeRotationMatrixZ(gast_rad); } -libra::Matrix<3, 3> EarthRotation::Nutation(const double (&t_tt_century)[4]) { +math::Matrix<3, 3> EarthRotation::Nutation(const double (&t_tt_century)[4]) { // Mean obliquity of the ecliptic epsilon_rad_ = c_epsilon_rad_[0]; for (int i = 0; i < 3; i++) { @@ -208,17 +210,17 @@ libra::Matrix<3, 3> EarthRotation::Nutation(const double (&t_tt_century)[4]) { c_d_epsilon_rad_[7] * cos(2 * l_rad + lm_rad) + c_d_epsilon_rad_[8] * cos(2 * ld_rad - ls_rad); double epsi_mod_rad = epsilon_rad_ + d_epsilon_rad_; - libra::Matrix<3, 3> x_epsi_1st = libra::MakeRotationMatrixX(epsilon_rad_); - libra::Matrix<3, 3> z_d_psi = libra::MakeRotationMatrixZ(-d_psi_rad_); - libra::Matrix<3, 3> x_epsi_2nd = libra::MakeRotationMatrixX(-epsi_mod_rad); + math::Matrix<3, 3> x_epsi_1st = math::MakeRotationMatrixX(epsilon_rad_); + math::Matrix<3, 3> z_d_psi = math::MakeRotationMatrixZ(-d_psi_rad_); + math::Matrix<3, 3> x_epsi_2nd = math::MakeRotationMatrixX(-epsi_mod_rad); - libra::Matrix<3, 3> dcm_nutation; + math::Matrix<3, 3> dcm_nutation; dcm_nutation = x_epsi_2nd * z_d_psi * x_epsi_1st; return dcm_nutation; } -libra::Matrix<3, 3> EarthRotation::Precession(const double (&t_tt_century)[4]) { +math::Matrix<3, 3> EarthRotation::Precession(const double (&t_tt_century)[4]) { // Compute precession angles(zeta, theta, z) double zeta_rad = 0.0; for (int i = 0; i < 3; i++) { @@ -234,18 +236,18 @@ libra::Matrix<3, 3> EarthRotation::Precession(const double (&t_tt_century)[4]) { } // Develop transformation matrix - libra::Matrix<3, 3> z_zeta = libra::MakeRotationMatrixZ(-zeta_rad); - libra::Matrix<3, 3> y_theta = libra::MakeRotationMatrixY(theta_rad); - libra::Matrix<3, 3> z_z = libra::MakeRotationMatrixZ(-z_rad); + math::Matrix<3, 3> z_zeta = math::MakeRotationMatrixZ(-zeta_rad); + math::Matrix<3, 3> y_theta = math::MakeRotationMatrixY(theta_rad); + math::Matrix<3, 3> z_z = math::MakeRotationMatrixZ(-z_rad); - libra::Matrix<3, 3> dcm_precession; + math::Matrix<3, 3> dcm_precession; dcm_precession = z_z * y_theta * z_zeta; return dcm_precession; } -libra::Matrix<3, 3> EarthRotation::PolarMotion(const double x_p, const double y_p) { - libra::Matrix<3, 3> dcm_polar_motion; +math::Matrix<3, 3> EarthRotation::PolarMotion(const double x_p, const double y_p) { + math::Matrix<3, 3> dcm_polar_motion; dcm_polar_motion[0][0] = 1.0; dcm_polar_motion[0][1] = 0.0; @@ -275,3 +277,5 @@ EarthRotationMode ConvertEarthRotationMode(const std::string mode) { return rotation_mode; } + +} // namespace s2e::environment diff --git a/src/environment/global/earth_rotation.hpp b/src/environment/global/earth_rotation.hpp index c6adaa685..4c1668adb 100644 --- a/src/environment/global/earth_rotation.hpp +++ b/src/environment/global/earth_rotation.hpp @@ -9,7 +9,9 @@ #ifndef S2E_ENVIRONMENT_GLOBAL_EARTH_ROTATION_HPP_ #define S2E_ENVIRONMENT_GLOBAL_EARTH_ROTATION_HPP_ -#include "library/math/matrix.hpp" +#include "math_physics/math/matrix.hpp" + +namespace s2e::environment { /** * @enum EarthRotationMode @@ -45,21 +47,21 @@ class EarthRotation { * @fn GetDcmJ2000ToEcef * @brief Return the DCM between J2000 inertial frame and the Earth Centered Earth Fixed frame */ - inline const libra::Matrix<3, 3> GetDcmJ2000ToEcef() const { return dcm_j2000_to_ecef_; }; + inline const math::Matrix<3, 3> GetDcmJ2000ToEcef() const { return dcm_j2000_to_ecef_; }; /** * @fn GetDcmTemeToEcef * @brief Return the DCM between TEME (Inertial frame used in SGP4) and the Earth Centered Earth Fixed frame */ - inline const libra::Matrix<3, 3> GetDcmTemeToEcef() const { return dcm_teme_to_ecef_; }; + inline const math::Matrix<3, 3> GetDcmTemeToEcef() const { return dcm_teme_to_ecef_; }; private: - double d_psi_rad_; //!< Nutation in obliquity [rad] - double d_epsilon_rad_; //!< Nutation in longitude [rad] - double epsilon_rad_; //!< Mean obliquity of the ecliptic [rad] - libra::Matrix<3, 3> dcm_j2000_to_ecef_; //!< Direction Cosine Matrix J2000 to ECEF - libra::Matrix<3, 3> dcm_teme_to_ecef_; //!< Direction Cosine Matrix TEME to ECEF - EarthRotationMode rotation_mode_; //!< Designation of dynamics model + double d_psi_rad_; //!< Nutation in obliquity [rad] + double d_epsilon_rad_; //!< Nutation in longitude [rad] + double epsilon_rad_; //!< Mean obliquity of the ecliptic [rad] + math::Matrix<3, 3> dcm_j2000_to_ecef_; //!< Direction Cosine Matrix J2000 to ECEF + math::Matrix<3, 3> dcm_teme_to_ecef_; //!< Direction Cosine Matrix TEME to ECEF + EarthRotationMode rotation_mode_; //!< Designation of dynamics model // Definitions of coefficients // They are handling as constant values @@ -94,7 +96,7 @@ class EarthRotation { * @param [in] gast_rad: Greenwich 'Apparent' Sidereal Time [rad] * @return Rotation matrix */ - libra::Matrix<3, 3> AxialRotation(const double gast_rad); + math::Matrix<3, 3> AxialRotation(const double gast_rad); /** * @fn Nutation @@ -102,7 +104,7 @@ class EarthRotation { * @param [in] t_tt_century: nth power of julian century for terrestrial time * @return Rotation matrix */ - libra::Matrix<3, 3> Nutation(const double (&t_tt_century)[4]); + math::Matrix<3, 3> Nutation(const double (&t_tt_century)[4]); /** * @fn Precession @@ -110,16 +112,18 @@ class EarthRotation { * @param [in] t_tt_century: nth power of julian century for terrestrial time * @return Rotation matrix */ - libra::Matrix<3, 3> Precession(const double (&t_tt_century)[4]); + math::Matrix<3, 3> Precession(const double (&t_tt_century)[4]); /** * @fn PolarMotion * @brief Calculate movement of the coordinate axes due to Polar Motion * @note Currently, this function is not used. */ - libra::Matrix<3, 3> PolarMotion(const double x_p, const double y_p); + math::Matrix<3, 3> PolarMotion(const double x_p, const double y_p); }; EarthRotationMode ConvertEarthRotationMode(const std::string mode); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_EARTH_ROTATION_HPP_ diff --git a/src/environment/global/global_environment.cpp b/src/environment/global/global_environment.cpp index f170be384..0244387fe 100644 --- a/src/environment/global/global_environment.cpp +++ b/src/environment/global/global_environment.cpp @@ -5,10 +5,11 @@ #include "global_environment.hpp" -#include "initialize_gnss_satellites.hpp" -#include "library/initialize/initialize_file_access.hpp" +#include "setting_file_reader/initialize_file_access.hpp" -GlobalEnvironment::GlobalEnvironment(const SimulationConfiguration* simulation_configuration) { Initialize(simulation_configuration); } +namespace s2e::environment { + +GlobalEnvironment::GlobalEnvironment(const simulation::SimulationConfiguration* simulation_configuration) { Initialize(simulation_configuration); } GlobalEnvironment::~GlobalEnvironment() { delete simulation_time_; @@ -17,32 +18,33 @@ GlobalEnvironment::~GlobalEnvironment() { delete gnss_satellites_; } -void GlobalEnvironment::Initialize(const SimulationConfiguration* simulation_configuration) { +void GlobalEnvironment::Initialize(const simulation::SimulationConfiguration* simulation_configuration) { // Get ini file path - IniAccess iniAccess = IniAccess(simulation_configuration->initialize_base_file_name_); + setting_file_reader::IniAccess iniAccess = setting_file_reader::IniAccess(simulation_configuration->initialize_base_file_name_); std::string simulation_time_ini_path = simulation_configuration->initialize_base_file_name_; // Initialize celestial_information_ = InitCelestialInformation(simulation_configuration->initialize_base_file_name_); simulation_time_ = InitSimulationTime(simulation_time_ini_path); hipparcos_catalogue_ = InitHipparcosCatalogue(simulation_configuration->initialize_base_file_name_); - gnss_satellites_ = InitGnssSatellites(simulation_configuration->gnss_file_); + gnss_satellites_ = InitGnssSatellites(simulation_configuration->gnss_file_, celestial_information_->GetEarthRotation(), *simulation_time_); // Calc initial value celestial_information_->UpdateAllObjectsInformation(*simulation_time_); - gnss_satellites_->SetUp(simulation_time_); } void GlobalEnvironment::Update() { simulation_time_->UpdateTime(); celestial_information_->UpdateAllObjectsInformation(*simulation_time_); - gnss_satellites_->Update(simulation_time_); + gnss_satellites_->Update(*simulation_time_); } -void GlobalEnvironment::LogSetup(Logger& logger) { +void GlobalEnvironment::LogSetup(logger::Logger& logger) { logger.AddLogList(simulation_time_); logger.AddLogList(celestial_information_); logger.AddLogList(gnss_satellites_); } void GlobalEnvironment::Reset(void) { simulation_time_->ResetClock(); } + +} // namespace s2e::environment diff --git a/src/environment/global/global_environment.hpp b/src/environment/global/global_environment.hpp index 1b1483757..2ce5da7c3 100644 --- a/src/environment/global/global_environment.hpp +++ b/src/environment/global/global_environment.hpp @@ -9,10 +9,12 @@ #include "celestial_information.hpp" #include "gnss_satellites.hpp" #include "hipparcos_catalogue.hpp" -#include "library/logger/logger.hpp" +#include "logger/logger.hpp" #include "simulation/simulation_configuration.hpp" #include "simulation_time.hpp" +namespace s2e::environment { + /** * @class GlobalEnvironment * @brief Class to manage the global environment @@ -24,7 +26,7 @@ class GlobalEnvironment { * @brief Constructor * @param [in] simulation_configuration: Simulation configuration */ - GlobalEnvironment(const SimulationConfiguration* simulation_configuration); + GlobalEnvironment(const simulation::SimulationConfiguration* simulation_configuration); /** * @fn ~GlobalEnvironment * @brief Destructor @@ -36,7 +38,7 @@ class GlobalEnvironment { * @brief Initialize all global environment members * @param [in] simulation_configuration: Simulation configuration */ - void Initialize(const SimulationConfiguration* simulation_configuration); + void Initialize(const simulation::SimulationConfiguration* simulation_configuration); /** * @fn Update * @brief Update states of all global environment @@ -46,7 +48,7 @@ class GlobalEnvironment { * @fn LogSetup * @brief Log setup of global environment information */ - void LogSetup(Logger& logger); + void LogSetup(logger::Logger& logger); /** * @fn Reset * @brief Reset clock of SimulationTime @@ -82,4 +84,6 @@ class GlobalEnvironment { GnssSatellites* gnss_satellites_; //!< GNSS satellites }; +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_GLOBAL_ENVIRONMENT_HPP_ diff --git a/src/environment/global/gnss_satellites.cpp b/src/environment/global/gnss_satellites.cpp index 8f6eef65c..25724b5e2 100644 --- a/src/environment/global/gnss_satellites.cpp +++ b/src/environment/global/gnss_satellites.cpp @@ -1,1180 +1,240 @@ /** * @file gnss_satellites.cpp - * @brief Class to calculate GNSS satellite position and related states + * @brief Class to calculate GNSS satellite position and clock */ #include "gnss_satellites.hpp" -#include -#include -#include -#include +#include +#include #include "environment/global/physical_constants.hpp" -#include "library/external/sgp4/sgp4ext.h" //for jday() -#include "library/external/sgp4/sgp4unit.h" //for gstime() -#include "library/logger/log_utility.hpp" -#include "library/math/constants.hpp" -#include "library/utilities/macros.hpp" +#include "logger/log_utility.hpp" +#include "math_physics/math/constants.hpp" +#include "math_physics/time_system/date_time_format.hpp" +#include "setting_file_reader/initialize_file_access.hpp" +#include "utilities/macros.hpp" -const double nan99 = 999999.999999; +using namespace s2e::gnss; -// GNSS satellite number definition -// TODO: Move to other library to define GNSS constants -const int gps_sat_num_ = 32; //!< Number of GPS satellites -const int glonass_sat_num_ = 26; //!< Number of GLONASS satellites -const int galileo_sat_num_ = 36; //!< Number of Galileo satellites -const int beidou_sat_num_ = 16; //!< Number of BeiDou satellites -const int qzss_sat_num_ = 7; //!< Number of QZSS satellites TODO: 5 at this moment? +namespace s2e::environment { -const int gps_index_bias_ = -1; //!< Bias of index for GPS satellites -const int glonass_index_bias_ = gps_index_bias_ + gps_sat_num_; //!< Bias of index for GLONASS satellites -const int galileo_index_bias_ = glonass_index_bias_ + glonass_sat_num_; //!< Bias of index for GALILEO satellites -const int beidou_index_bias_ = galileo_index_bias_ + galileo_sat_num_; //!< Bias of index for BeiDou satellites -const int qzss_index_bias_ = beidou_index_bias_ + beidou_sat_num_; //!< Bias of index for QZSS satellites +const size_t kNumberOfInterpolation = 9; -const int all_sat_num_ = gps_sat_num_ + glonass_sat_num_ + galileo_sat_num_ + beidou_sat_num_ + qzss_sat_num_; //& sp3_files, const time_system::EpochTime start_time) { + sp3_files_ = sp3_files; + current_epoch_time_ = start_time; -using namespace std; - -/** - * @fn initialized_tm - * @brief Initialize time as calendar expression - */ -tm* initialized_tm() { - tm* time_tm = (tm*)malloc(sizeof(tm)); - - time_tm->tm_year = 0; - time_tm->tm_mon = 0; - time_tm->tm_mday = 0; - time_tm->tm_hour = 0; - time_tm->tm_min = 0; - time_tm->tm_sec = 0; - - time_tm->tm_isdst = 0; - time_tm->tm_yday = 0; - time_tm->tm_wday = 0; - -#ifndef WIN32 - time_tm->tm_zone = NULL; - time_tm->tm_gmtoff = 0; -#endif - - return time_tm; -} - -/** - * @fn get_unixtime_from_timestamp_line - * @brief Calculate unix time from calendar expression - * @param [in] s: Time as calendar expression - * @return Unix time - */ -double get_unixtime_from_timestamp_line(std::vector& s) { - tm* time_tm = initialized_tm(); - time_tm->tm_year = stoi(s.at(1)) - 1900; - time_tm->tm_mon = stoi(s.at(2)) - 1; // 0 - 11, in time struct, 1 - 12 month is expressed by 1 - 12 - time_tm->tm_mday = stoi(s.at(3)); - time_tm->tm_hour = stoi(s.at(4)); - time_tm->tm_min = stoi(s.at(5)); - time_tm->tm_sec = (int)(stod(s.at(6)) + 1e-4); // for the numerical error, plus 1e-4 (tm_sec is to be int) - double unix_time = (double)mktime(time_tm); - std::free(time_tm); - - return unix_time; -} - -// GnssSatelliteBase -template -libra::Vector GnssSatelliteBase::TrigonometricInterpolation(const vector& time_vector, const vector>& values, - double time) const { - size_t n = time_vector.size(); - double w = libra::tau / (24.0 * 60.0 * 60.0) * 1.03; // coefficient of a day long - libra::Vector res(0.0); - - for (size_t i = 0; i < n; ++i) { - double t_k = 1.0; - for (size_t j = 0; j < n; ++j) { - if (i == j) continue; - t_k *= sin(w * (time - time_vector.at(j)) / 2.0) / sin(w * (time_vector.at(i) - time_vector.at(j)) / 2.0); - } - for (size_t j = 0; j < (int)N; ++j) { - res(j) += t_k * values.at(i)(j); - } + // Get the initialize SP3 file + Sp3FileReader initial_sp3_file = sp3_files_[0]; + if (!GetCurrentSp3File(initial_sp3_file, start_time)) { + std::cout << "[Error] GNSS satellites: Calculation time mismatch with SP3 files." << std::endl; + return; } - return res; -} - -double GnssSatelliteBase::TrigonometricInterpolation(const vector& time_vector, const vector& values, double time) const { - size_t n = time_vector.size(); - double w = libra::tau / (24.0 * 60.0 * 60.0) * 1.03; // coefficient of a day long - double res = 0.0; - - for (size_t i = 0; i < n; ++i) { - double t_k = 1.0; - for (size_t j = 0; j < n; ++j) { - if (i == j) continue; - t_k *= sin(w * (time - time_vector.at(j)) / 2.0) / sin(w * (time_vector.at(i) - time_vector.at(j)) / 2.0); - } - res += t_k * values.at(i); + // Get general info + number_of_calculated_gnss_satellites_ = initial_sp3_file.GetNumberOfSatellites(); + const size_t nearest_epoch_id = initial_sp3_file.SearchNearestEpochId(start_time); + const size_t half_interpolation_number = kNumberOfInterpolation / 2; + if (nearest_epoch_id >= half_interpolation_number) { + reference_interpolation_id_ = nearest_epoch_id - half_interpolation_number; } + reference_time_ = time_system::EpochTime(initial_sp3_file.GetEpochData(reference_interpolation_id_)); - return res; -} + // Initialize orbit + orbit_.assign(number_of_calculated_gnss_satellites_, orbit::InterpolationOrbit(kNumberOfInterpolation)); -template -libra::Vector GnssSatelliteBase::LagrangeInterpolation(const vector& time_vector, const vector>& values, - double time) const { - int n = time_vector.size(); - libra::Vector res(0.0); + // Initialize clock + std::vector temp; + temp.assign(kNumberOfInterpolation, -1.0); + clock_.assign(number_of_calculated_gnss_satellites_, math::Interpolation(temp, temp)); - for (int i = 0; i < n; ++i) { - double l_i = 1.0; - for (int j = 0; j < n; ++j) { - if (i == j) continue; - l_i *= (time - time_vector.at(j)) / (time_vector.at(i) - time_vector.at(j)); - } - for (int j = 0; j < N; ++j) { - res(j) += l_i * values.at(i)(j); - } + // Initialize interpolation + for (size_t i = 0; i < kNumberOfInterpolation; i++) { + UpdateInterpolationInformation(); } - return res; + return; } -double GnssSatelliteBase::LagrangeInterpolation(const vector& time_vector, const vector& values, double time) const { - size_t n = time_vector.size(); - double res = 0.0; - for (size_t i = 0; i < n; ++i) { - double l_i = 1.0; - for (size_t j = 0; j < n; ++j) { - if (i == j) continue; - l_i *= (time - time_vector.at(j)) / (time_vector.at(i) - time_vector.at(j)); - } - res += values.at(i) * l_i; - } - - return res; -} +void GnssSatellites::Update(const SimulationTime& simulation_time) { + if (!IsCalcEnabled()) return; -int GnssSatelliteBase::GetIndexFromId(string sat_num) const { - if (sat_num.front() == 'P') { - switch (sat_num.at(1)) { - case 'G': - return stoi(sat_num.substr(2)) + gps_index_bias_; - case 'R': - return stoi(sat_num.substr(2)) + glonass_index_bias_; - case 'E': - return stoi(sat_num.substr(2)) + galileo_index_bias_; - case 'C': - return stoi(sat_num.substr(2)) + beidou_index_bias_; - case 'J': - return stoi(sat_num.substr(2)) + qzss_index_bias_; - default: - return INT32_MAX; - break; - } - } else { - switch (sat_num.front()) { - case 'G': - return stoi(sat_num.substr(1)) + gps_index_bias_; - case 'R': - return stoi(sat_num.substr(1)) + glonass_index_bias_; - case 'E': - return stoi(sat_num.substr(1)) + galileo_index_bias_; - case 'C': - return stoi(sat_num.substr(1)) + beidou_index_bias_; - case 'J': - return stoi(sat_num.substr(1)) + qzss_index_bias_; - default: - return INT32_MAX; - break; - } - } -} + // Get time + UTC current_utc = simulation_time.GetCurrentUtc(); + time_system::DateTime current_date_time((size_t)current_utc.year, (size_t)current_utc.month, (size_t)current_utc.day, (size_t)current_utc.hour, + (size_t)current_utc.minute, current_utc.second); + current_epoch_time_ = time_system::EpochTime(current_date_time); -string GnssSatelliteBase::GetIdFromIndex(int index) const { - string res; - if (index < glonass_index_bias_) { - res = 'G'; - if (index - gps_index_bias_ < 10) res += '0'; - res += to_string(index - gps_index_bias_); - } else if (index < galileo_index_bias_) { - res = 'R'; - if (index - glonass_index_bias_ < 10) res += '0'; - res += to_string(index - glonass_index_bias_); - } else if (index < beidou_index_bias_) { - res = 'E'; - if (index - galileo_index_bias_ < 10) res += '0'; - res += to_string(index - galileo_index_bias_); - } else if (index < qzss_index_bias_) { - res = 'C'; - if (index - beidou_index_bias_ < 10) res += '0'; - res += to_string(index - beidou_index_bias_); - } else { - res = 'J'; - if (index - qzss_index_bias_ < 10) res += '0'; - res += to_string(index - qzss_index_bias_); + // Check interpolation update + double diff_s = current_epoch_time_.GetTimeWithFraction_s() - reference_time_.GetTimeWithFraction_s(); + double medium_time_s = orbit_[0].GetTimeList()[4]; + if (diff_s > medium_time_s) { + UpdateInterpolationInformation(); } - return res; -} - -int GnssSatelliteBase::GetNumberOfSatellites() const { return all_sat_num_; } - -bool GnssSatelliteBase::GetWhetherValid(int gnss_satellite_id) const { - if (gnss_satellite_id >= all_sat_num_) return false; - return validate_.at(gnss_satellite_id); + return; } -// GnssSatellitePosition -pair GnssSatellitePosition::Initialize(vector>& file, int interpolation_method, int interpolation_number, - UltraRapidMode ur_flag) { - UNUSED(interpolation_method); - - interpolation_number_ = interpolation_number; - - // Expansion - time_series_position_ecef_m_.resize(all_sat_num_); // first vector size is the satellite number - time_series_position_eci_m_.resize(all_sat_num_); - unix_time_list.resize(all_sat_num_); - - // for using min and max, set the sup & inf before - double start_unix_time = 1e16; - double end_unix_time = 0; - - for (int page = 0; page < (int)file.size(); ++page) { - // Read Header Info - int num_of_time_stamps = 0; - int num_of_sat = 0; - int line; - for (line = 0; line < 3; ++line) { - istringstream iss{file.at(page).at(line)}; - - if (line == 0) { - // in seventh line, there is time stamps - // http://epncb.oma.be/ftp/data/format/sp3c.txt - for (int i = 0; i < 7; ++i) { - // how many time stamps are written? - string each; - iss >> each; - if (i == 6) num_of_time_stamps = stoi(each); - } - } else if (line == 1) { - for (int i = 0; i < 4; ++i) { - string each; - iss >> each; - if (i == 3) time_interval_ = stod(each); - } - } else if (line == 2) { - for (int i = 0; i < 2; ++i) { - string each; - iss >> each; - if (i == 1) num_of_sat = stoi(each); - } - } - } - line = 3; - while (file.at(page).at(line).front() != '*') ++line; - - // Calculate number of data lines - int start_line, end_line; - if (ur_flag == kNotUse) { - start_line = line; - end_line = line + (num_of_sat + 1) * num_of_time_stamps; - } else { - int offset = (int)ur_flag - (int)kObserve1; - start_line = line + (num_of_sat + 1) * num_of_time_stamps / 8 * offset; - end_line = line + (num_of_sat + 1) * num_of_time_stamps / 8 * (offset + 1); - } - - // Read time and position data - double unix_time = 0; - double cos_ = 0.0; //!< cos value for ECEF->ECI conversion - double sin_ = 0.0; //!< sin value for ECEF->ECI conversion - for (int i = 0; i < end_line - start_line; ++i) { - line = i + start_line; - - istringstream iss{file.at(page).at(line)}; - vector s; - if (i % (num_of_sat + 1) == 0) { - // Epoch information - for (int j = 0; j < 7; ++j) { - string tmp; - iss >> tmp; - s.push_back(tmp); - } - // Convert to julian date - unix_time = get_unixtime_from_timestamp_line(s); - double jd; - jday(stoi(s.at(1)), stoi(s.at(2)), stoi(s.at(3)), stoi(s.at(4)), stoi(s.at(5)), stod(s.at(6)), jd); - // Calculate frame conversion - double gs_time_ = gstime(jd); - cos_ = cos(gs_time_); - sin_ = sin(gs_time_); - // Set start and end unix time - start_unix_time = std::min(start_unix_time, unix_time); - end_unix_time = std::max(end_unix_time, unix_time); - } else { - // Position and clock data of each GNSS satellite - for (int j = 0; j < 5; ++j) { - string tmp; - iss >> tmp; - s.push_back(tmp); - } - int gnss_satellite_id = GetIndexFromId(s.front()); - - bool available_flag = true; - libra::Vector<3> ecef_position_m(0.0); - for (int j = 0; j < 3; ++j) { - if (std::abs(stod(s.at(j + 1)) - nan99) < 1.0) { - available_flag = false; - break; - } else { - ecef_position_m(j) = stod(s.at(j + 1)); - } - } - if (!available_flag) continue; - - // [km] -> [m] - ecef_position_m *= 1000.0; +math::Vector<3> GnssSatellites::GetPosition_ecef_m(const size_t gnss_satellite_id, const time_system::EpochTime time) const { + if (gnss_satellite_id > number_of_calculated_gnss_satellites_) return math::Vector<3>(0.0); - // ECI frame conversion - libra::Vector<3> eci_position(0.0); - double x = ecef_position_m(0); - double y = ecef_position_m(1); - double z = ecef_position_m(2); - eci_position(0) = cos_ * x - sin_ * y; - eci_position(1) = sin_ * x + cos_ * y; - eci_position(2) = z; + time_system::EpochTime target_time; - // Set data - if (!unix_time_list.at(gnss_satellite_id).empty() && std::abs(unix_time - unix_time_list.at(gnss_satellite_id).back()) < 1.0) { - unix_time_list.at(gnss_satellite_id).back() = unix_time; - time_series_position_ecef_m_.at(gnss_satellite_id).back() = ecef_position_m; - time_series_position_eci_m_.at(gnss_satellite_id).back() = eci_position; - } else { - unix_time_list.at(gnss_satellite_id).emplace_back(unix_time); - time_series_position_ecef_m_.at(gnss_satellite_id).emplace_back(ecef_position_m); - time_series_position_eci_m_.at(gnss_satellite_id).emplace_back(eci_position); - } - } - } + if (time.GetTime_s() == 0) { + target_time = current_epoch_time_; + } else { + target_time = time; } - return make_pair(start_unix_time, end_unix_time); -} - -void GnssSatellitePosition::SetUp(const double start_unix_time, const double step_width_s) { - step_width_s_ = step_width_s; - - position_ecef_m_.assign(all_sat_num_, libra::Vector<3>(0.0)); - position_eci_m_.assign(all_sat_num_, libra::Vector<3>(0.0)); - validate_.assign(all_sat_num_, false); - - nearest_index_.resize(all_sat_num_); - time_period_list_.resize(all_sat_num_); - - ecef_.resize(all_sat_num_); - eci_.resize(all_sat_num_); - - for (int gnss_satellite_id = 0; gnss_satellite_id < all_sat_num_; ++gnss_satellite_id) { - if (unix_time_list.at(gnss_satellite_id).empty()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - int index = (int)(lower_bound(unix_time_list.at(gnss_satellite_id).begin(), unix_time_list.at(gnss_satellite_id).end(), start_unix_time) - - unix_time_list.at(gnss_satellite_id).begin()); - if (index == (int)unix_time_list.at(gnss_satellite_id).size()) { - nearest_index_.at(gnss_satellite_id) = index; - validate_.at(gnss_satellite_id) = false; - continue; - } - - double nearest_unixtime = unix_time_list.at(gnss_satellite_id).at(index); - if (interpolation_number_ % 2 && index != 0) { - double pre_time = unix_time_list.at(gnss_satellite_id).at(index - 1); - if (std::abs(start_unix_time - pre_time) < std::abs(start_unix_time - nearest_unixtime)) --index; - } - nearest_index_.at(gnss_satellite_id) = index; - nearest_unixtime = unix_time_list.at(gnss_satellite_id).at(index); - if (std::abs(start_unix_time - nearest_unixtime) > time_interval_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - // for both even and odd: 2n+1 -> [-n, n] 2n -> [-n, n) - for (int j = -interpolation_number_ / 2; j < (interpolation_number_ + 1) / 2; ++j) { - int now_index = index + j; - if (now_index < 0 || now_index >= (int)unix_time_list.at(gnss_satellite_id).size()) continue; - - time_period_list_.at(gnss_satellite_id).push_back(unix_time_list.at(gnss_satellite_id).at(now_index)); - ecef_.at(gnss_satellite_id).push_back(time_series_position_ecef_m_.at(gnss_satellite_id).at(now_index)); - eci_.at(gnss_satellite_id).push_back(time_series_position_eci_m_.at(gnss_satellite_id).at(now_index)); - } - if ((int)time_period_list_.at(gnss_satellite_id).size() != interpolation_number_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - double time_period_length = time_period_list_.at(gnss_satellite_id).back() - time_period_list_.at(gnss_satellite_id).front(); - if (time_period_length > time_interval_ * (interpolation_number_ - 1 + 3) + 1e-4) { // allow for 3 missing - validate_.at(gnss_satellite_id) = false; - continue; - } else { - validate_.at(gnss_satellite_id) = true; - } + double diff_s = target_time.GetTimeWithFraction_s() - reference_time_.GetTimeWithFraction_s(); + if (diff_s < 0.0 || diff_s > 1e6) return math::Vector<3>(0.0); - if (std::abs(start_unix_time - nearest_unixtime) < 1e-4) { // for the numerical error, plus 1e-4 - position_ecef_m_.at(gnss_satellite_id) = time_series_position_ecef_m_.at(gnss_satellite_id).at(index); - position_eci_m_.at(gnss_satellite_id) = time_series_position_eci_m_.at(gnss_satellite_id).at(index); - } else { - position_ecef_m_.at(gnss_satellite_id) = - TrigonometricInterpolation(time_period_list_.at(gnss_satellite_id), ecef_.at(gnss_satellite_id), start_unix_time); - position_eci_m_.at(gnss_satellite_id) = - TrigonometricInterpolation(time_period_list_.at(gnss_satellite_id), eci_.at(gnss_satellite_id), start_unix_time); - } - } + const double kOrbitalPeriodCorrection_s = 24 * 60 * 60 * 1.003; // See http://acc.igs.org/orbits/orbit-interp_gpssoln03.pdf + return orbit_[gnss_satellite_id].CalcPositionWithTrigonometric(diff_s, math::tau / kOrbitalPeriodCorrection_s); } -void GnssSatellitePosition::Update(const double current_unix_time) { - for (int gnss_satellite_id = 0; gnss_satellite_id < all_sat_num_; ++gnss_satellite_id) { - if (unix_time_list.at(gnss_satellite_id).empty()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - int index = nearest_index_.at(gnss_satellite_id); - if (index == (int)unix_time_list.at(gnss_satellite_id).size()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - if (index + 1 < (int)unix_time_list.at(gnss_satellite_id).size()) { - double pre_unix = unix_time_list.at(gnss_satellite_id).at(index); - double post_unix = unix_time_list.at(gnss_satellite_id).at(index + 1); - - if (std::abs(current_unix_time - post_unix) < std::abs(current_unix_time - pre_unix)) { - ++index; - nearest_index_.at(gnss_satellite_id) = index; - - time_period_list_.at(gnss_satellite_id).clear(); - ecef_.at(gnss_satellite_id).clear(); - eci_.at(gnss_satellite_id).clear(); +double GnssSatellites::GetClock_s(const size_t gnss_satellite_id, const time_system::EpochTime time) const { + if (gnss_satellite_id > number_of_calculated_gnss_satellites_) return 0.0; - // for both even and odd: 2n+1 -> [-n, n] 2n -> [-n, n) - for (int j = -interpolation_number_ / 2; j < (interpolation_number_ + 1) / 2; ++j) { - int now_index = index + j; - if (now_index < 0 || now_index >= (int)unix_time_list.at(gnss_satellite_id).size()) continue; + time_system::EpochTime target_time; - time_period_list_.at(gnss_satellite_id).push_back(unix_time_list.at(gnss_satellite_id).at(now_index)); - ecef_.at(gnss_satellite_id).push_back(time_series_position_ecef_m_.at(gnss_satellite_id).at(now_index)); - eci_.at(gnss_satellite_id).push_back(time_series_position_eci_m_.at(gnss_satellite_id).at(now_index)); - } - } - } - double nearest_unix_time = unix_time_list.at(gnss_satellite_id).at(index); - if (std::abs(current_unix_time - nearest_unix_time) > time_interval_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - if ((int)time_period_list_.at(gnss_satellite_id).size() != interpolation_number_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - double time_period_length = time_period_list_.at(gnss_satellite_id).back() - time_period_list_.at(gnss_satellite_id).front(); - if (time_period_length > time_interval_ * (interpolation_number_ - 1 + 3) + 1e-4) { // allow for 3 missing - validate_.at(gnss_satellite_id) = false; - continue; - } else { - validate_.at(gnss_satellite_id) = true; - } - - if (std::abs(current_unix_time - nearest_unix_time) < 1e-4) { // for the numerical error, plus 1e-4 - position_ecef_m_.at(gnss_satellite_id) = time_series_position_ecef_m_.at(gnss_satellite_id).at(index); - position_eci_m_.at(gnss_satellite_id) = time_series_position_eci_m_.at(gnss_satellite_id).at(index); - } else { - position_ecef_m_.at(gnss_satellite_id) = - TrigonometricInterpolation(time_period_list_.at(gnss_satellite_id), ecef_.at(gnss_satellite_id), current_unix_time); - position_eci_m_.at(gnss_satellite_id) = - TrigonometricInterpolation(time_period_list_.at(gnss_satellite_id), eci_.at(gnss_satellite_id), current_unix_time); - } + if (time.GetTime_s() == 0) { + target_time = current_epoch_time_; + } else { + target_time = time; } -} -libra::Vector<3> GnssSatellitePosition::GetPosition_ecef_m(int gnss_satellite_id) const { - if (gnss_satellite_id >= all_sat_num_) return libra::Vector<3>(0.0); - return position_ecef_m_.at(gnss_satellite_id); -} + double diff_s = target_time.GetTimeWithFraction_s() - reference_time_.GetTimeWithFraction_s(); + if (diff_s < 0.0 || diff_s > 1e6) return 0.0; -libra::Vector<3> GnssSatellitePosition::GetPosition_eci_m(int gnss_satellite_id) const { - if (gnss_satellite_id >= all_sat_num_) return libra::Vector<3>(0.0); - return position_eci_m_.at(gnss_satellite_id); + return clock_[gnss_satellite_id].CalcPolynomial(diff_s) * 1e-6; } -// GnssSatelliteClock -void GnssSatelliteClock::Initialize(vector>& file, string file_extension, int interpolation_number, UltraRapidMode ur_flag, - pair unix_time_period) { - interpolation_number_ = interpolation_number; - time_series_clock_offset_m_.resize(all_sat_num_); // first vector size is the sat num - unix_time_list.resize(all_sat_num_); - - if (file_extension == ".sp3") { - for (int page = 0; page < (int)file.size(); ++page) { - // Read Header Info - int num_of_time_stamps = 0; - int num_of_sat = 0; - int line; - for (line = 0; line < 3; ++line) { - istringstream iss{file.at(page).at(line)}; - - if (line == 0) { - // in seventh line, there is time stamps - // http://epncb.oma.be/ftp/data/format/sp3c.txt - for (int i = 0; i < 7; ++i) { - // how many time stamps are written? - string each; - iss >> each; - if (i == 6) num_of_time_stamps = stoi(each); - } - } else if (line == 1) { - for (int i = 0; i < 4; ++i) { - string each; - iss >> each; - if (i == 3) time_interval_ = stod(each); - } - } else if (line == 2) { - for (int i = 0; i < 2; ++i) { - string each; - iss >> each; - if (i == 1) num_of_sat = stoi(each); - } - } - } - line = 3; - while (file.at(page).at(line).front() != '*') ++line; - - // Calculate number of data lines - int start_line, end_line; - if (ur_flag == kNotUse) { - start_line = line; - end_line = line + (num_of_sat + 1) * num_of_time_stamps; - } else { - int offset = (int)ur_flag - (int)kObserve1; - start_line = line + (num_of_sat + 1) * num_of_time_stamps / 8 * offset; - end_line = line + (num_of_sat + 1) * num_of_time_stamps / 8 * (offset + 1); - } - - // Read time and clock data - double unix_time = 0; - for (int i = 0; i < end_line - start_line; ++i) { - line = i + start_line; - - istringstream iss{file.at(page).at(line)}; - vector s; - if (i % (num_of_sat + 1) == 0) { - // Epoch information - for (int j = 0; j < 7; ++j) { - string tmp; - iss >> tmp; - s.push_back(tmp); - } - unix_time = get_unixtime_from_timestamp_line(s); - } else { - for (int j = 0; j < 5; ++j) { - string tmp; - iss >> tmp; - s.push_back(tmp); - } - int gnss_satellite_id = GetIndexFromId(s.front()); - - double clock = stod(s.at(4)); - if (std::abs(clock - nan99) < 1.0) continue; - - // In the file, clock bias is expressed in [micro second], so by multiplying by the speed_of_light & 1e-6, they are converted to [m] - clock *= (environment::speed_of_light_m_s * 1e-6); - if (!unix_time_list.at(gnss_satellite_id).empty() && std::abs(unix_time - unix_time_list.at(gnss_satellite_id).back()) < 1.0) { - unix_time_list.at(gnss_satellite_id).back() = unix_time; - time_series_clock_offset_m_.at(gnss_satellite_id).back() = clock; - } else { - unix_time_list.at(gnss_satellite_id).push_back(unix_time); - time_series_clock_offset_m_.at(gnss_satellite_id).emplace_back(clock); - } - } - } - } - } else { // .clk30s - if (kPredict1 <= ur_flag && ur_flag <= kPredict4) { - cout << "clock settings has something wrong" << endl; - exit(1); - } - time_interval_ = 1e9; - - for (int page = 0; page < (int)file.size(); ++page) { - double start_unix_time, end_unix_time; - if (ur_flag == kNotUse) { - start_unix_time = unix_time_period.first; - end_unix_time = unix_time_period.second + 30; - } else { - start_unix_time = -1; - end_unix_time = 0; - } - for (int line = 0; line < (int)file.at(page).size(); ++line) { - if (file.at(page).at(line).substr(0, 3) != "AS ") continue; - - istringstream iss{file.at(page).at(line)}; - vector s; - for (int i = 0; i < 11; ++i) { - string tmp; - iss >> tmp; - s.push_back(tmp); - } - - tm* time_tm = initialized_tm(); - time_tm->tm_year = stoi(s.at(2)) - 1900; - time_tm->tm_mon = stoi(s.at(3)) - 1; // 0 - 11, in time struct, 1 - 12 month is expressed by 1 - 12 - time_tm->tm_mday = stoi(s.at(4)); - time_tm->tm_hour = stoi(s.at(5)); - time_tm->tm_min = stoi(s.at(6)); - time_tm->tm_sec = (int)(stod(s.at(7)) + 1e-4); // for the numerical error, plus 1e-4. tm_sec is to be int - double unix_time = (double)mktime(time_tm); - const double interval = 6 * 60 * 60; - if (start_unix_time < 0) { - start_unix_time = unix_time + (ur_flag - kObserve1) * interval; // Fix here to use enum class - end_unix_time = start_unix_time + interval; - } - - std::free(time_tm); - - int gnss_satellite_id = GetIndexFromId(s.at(1)); - double clock_bias = stod(s.at(9)) * environment::speed_of_light_m_s; // [s] -> [m] - if (start_unix_time - unix_time > 1e-4) continue; // for the numerical error - if (end_unix_time - unix_time < 1e-4) break; - if (!unix_time_list.at(gnss_satellite_id).empty() && - std::abs(unix_time - unix_time_list.at(gnss_satellite_id).back()) < 1e-4) { // for the numerical error - unix_time_list.at(gnss_satellite_id).back() = unix_time; - time_series_clock_offset_m_.at(gnss_satellite_id).back() = clock_bias; - } else { - if (!unix_time_list.at(gnss_satellite_id).empty()) - time_interval_ = min(time_interval_, unix_time - unix_time_list.at(gnss_satellite_id).back()); - unix_time_list.at(gnss_satellite_id).emplace_back(unix_time); - time_series_clock_offset_m_.at(gnss_satellite_id).emplace_back(clock_bias); - } - } +bool GnssSatellites::GetCurrentSp3File(Sp3FileReader& current_sp3_file, const time_system::EpochTime current_time) { + for (size_t i = 0; i < sp3_files_.size(); i++) { + time_system::EpochTime sp3_start_time(sp3_files_[i].GetStartEpochDateTime()); + double diff_s = current_time.GetTimeWithFraction_s() - sp3_start_time.GetTimeWithFraction_s(); + if (diff_s < 0.0) { + // Error + return false; + } else if (diff_s < 24 * 60 * 60) { + current_sp3_file = sp3_files_[i]; + sp3_file_id_ = i; + return true; } } + return false; } -void GnssSatelliteClock::SetUp(const double start_unix_time, const double step_width_s) { - step_width_s_ = step_width_s; - - clock_offset_m_.resize(all_sat_num_); - validate_.assign(all_sat_num_, false); - - nearest_index_.resize(all_sat_num_); - time_period_list_.resize(all_sat_num_); - - clock_bias_.resize(all_sat_num_); - - for (int gnss_satellite_id = 0; gnss_satellite_id < all_sat_num_; ++gnss_satellite_id) { - if (unix_time_list.at(gnss_satellite_id).empty()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - int index = (int)(lower_bound(unix_time_list.at(gnss_satellite_id).begin(), unix_time_list.at(gnss_satellite_id).end(), start_unix_time) - - unix_time_list.at(gnss_satellite_id).begin()); - if (index == (int)unix_time_list.at(gnss_satellite_id).size()) { - validate_.at(gnss_satellite_id) = false; - nearest_index_.at(gnss_satellite_id) = index; - continue; - } - - double nearest_unixtime = unix_time_list.at(gnss_satellite_id).at(index); - if (interpolation_number_ % 2 && index != 0) { - double pre_time = unix_time_list.at(gnss_satellite_id).at(index - 1); - if (std::abs(start_unix_time - pre_time) < std::abs(start_unix_time - nearest_unixtime)) --index; - } - nearest_index_.at(gnss_satellite_id) = index; - nearest_unixtime = unix_time_list.at(gnss_satellite_id).at(index); - if (std::abs(start_unix_time - nearest_unixtime) > time_interval_) { - validate_.at(gnss_satellite_id) = false; - continue; - } +bool GnssSatellites::UpdateInterpolationInformation() { + Sp3FileReader sp3_file = sp3_files_[sp3_file_id_]; - // for both even and odd: 2n+1 -> [-n, n] 2n -> [-n, n) - for (int j = -interpolation_number_ / 2; j < (interpolation_number_ + 1) / 2; ++j) { - int now_index = index + j; - if (now_index < 0 || now_index >= (int)unix_time_list.at(gnss_satellite_id).size()) continue; - - time_period_list_.at(gnss_satellite_id).push_back(unix_time_list.at(gnss_satellite_id).at(now_index)); - clock_bias_.at(gnss_satellite_id).push_back(time_series_clock_offset_m_.at(gnss_satellite_id).at(now_index)); - } - - if ((int)time_period_list_.at(gnss_satellite_id).size() != interpolation_number_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - double time_period_length = time_period_list_.at(gnss_satellite_id).back() - time_period_list_.at(gnss_satellite_id).front(); - if (time_period_length > time_interval_ * (interpolation_number_ - 1) + 1e-4) { // more strict for clock_bias - validate_.at(gnss_satellite_id) = false; - continue; - } else { - validate_.at(gnss_satellite_id) = true; - } + for (size_t gnss_id = 0; gnss_id < number_of_calculated_gnss_satellites_; gnss_id++) { + time_system::EpochTime sp3_time = time_system::EpochTime(sp3_file.GetEpochData(reference_interpolation_id_)); + double time_diff_s = sp3_time.GetTimeWithFraction_s() - reference_time_.GetTimeWithFraction_s(); + math::Vector<3> sp3_position_m = 1000.0 * sp3_file.GetSatellitePosition_km(reference_interpolation_id_, gnss_id); - if (std::abs(start_unix_time - nearest_unixtime) < 1e-4) { // for the numerical error - clock_offset_m_.at(gnss_satellite_id) = time_series_clock_offset_m_.at(gnss_satellite_id).at(index); - } else { - clock_offset_m_.at(gnss_satellite_id) = - LagrangeInterpolation(time_period_list_.at(gnss_satellite_id), clock_bias_.at(gnss_satellite_id), start_unix_time); - } + orbit_[gnss_id].PushAndPopData(time_diff_s, sp3_position_m); + clock_[gnss_id].PushAndPopData(time_diff_s, sp3_file.GetSatelliteClockOffset(reference_interpolation_id_, gnss_id)); } -} - -void GnssSatelliteClock::Update(const double current_unix_time) { - for (int gnss_satellite_id = 0; gnss_satellite_id < all_sat_num_; ++gnss_satellite_id) { - if (unix_time_list.at(gnss_satellite_id).empty()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - int index = nearest_index_.at(gnss_satellite_id); - if (index == (int)unix_time_list.at(gnss_satellite_id).size()) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - if (index + 1 < (int)unix_time_list.at(gnss_satellite_id).size()) { - double pre_unix = unix_time_list.at(gnss_satellite_id).at(index); - double post_unix = unix_time_list.at(gnss_satellite_id).at(index + 1); + reference_interpolation_id_++; - if (std::abs(current_unix_time - post_unix) < std::abs(current_unix_time - pre_unix)) { - ++index; - nearest_index_.at(gnss_satellite_id) = index; - - time_period_list_.at(gnss_satellite_id).clear(); - clock_bias_.at(gnss_satellite_id).clear(); - - // for both even and odd: 2n+1 -> [-n, n] 2n -> [-n, n) - for (int j = -interpolation_number_ / 2; j < (interpolation_number_ + 1) / 2; ++j) { - int now_index = index + j; - if (now_index < 0 || now_index >= (int)unix_time_list.at(gnss_satellite_id).size()) continue; - - time_period_list_.at(gnss_satellite_id).push_back(unix_time_list.at(gnss_satellite_id).at(now_index)); - clock_bias_.at(gnss_satellite_id).push_back(time_series_clock_offset_m_.at(gnss_satellite_id).at(now_index)); - } - } - } - if ((int)time_period_list_.at(gnss_satellite_id).size() != interpolation_number_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - double nearest_unix_time = unix_time_list.at(gnss_satellite_id).at(index); - if (std::abs(current_unix_time - nearest_unix_time) > time_interval_) { - validate_.at(gnss_satellite_id) = false; - continue; - } - - // in clock_bias, more strict. - double time_period_length = time_period_list_.at(gnss_satellite_id).back() - time_period_list_.at(gnss_satellite_id).front(); - if (time_period_length > time_interval_ * (interpolation_number_ - 1) + 1e-4) { // more strict for clock_bias - validate_.at(gnss_satellite_id) = false; - continue; - } else { - validate_.at(gnss_satellite_id) = true; + // File update + if (reference_interpolation_id_ >= sp3_file.GetNumberOfEpoch()) { + reference_interpolation_id_ = 0; + sp3_file_id_++; + if (sp3_file_id_ >= sp3_files_.size()) { + std::cout << "[Error] GNSS satellites: SP3 file range over." << std::endl; + return false; } - - if (std::abs(current_unix_time - nearest_unix_time) < 1e-4) { - clock_offset_m_.at(gnss_satellite_id) = time_series_clock_offset_m_.at(gnss_satellite_id).at(index); - } else { - clock_offset_m_.at(gnss_satellite_id) = - LagrangeInterpolation(time_period_list_.at(gnss_satellite_id), clock_bias_.at(gnss_satellite_id), current_unix_time); - } - } -} - -double GnssSatelliteClock::GetSatClock(int gnss_satellite_id) const { - if (gnss_satellite_id >= all_sat_num_) return 0.0; - return clock_offset_m_.at(gnss_satellite_id); -} - -// GnssSatelliteInformation -GnssSatelliteInformation::GnssSatelliteInformation() {} -void GnssSatelliteInformation::Initialize(vector>& position_file, int position_interpolation_method, int position_interpolation_number, - UltraRapidMode position_ur_flag, vector>& clock_file, string clock_file_extension, - int clock_interpolation_number, UltraRapidMode clock_ur_flag) { - auto unix_time_period = position_.Initialize(position_file, position_interpolation_method, position_interpolation_number, position_ur_flag); - clock_.Initialize(clock_file, clock_file_extension, clock_interpolation_number, clock_ur_flag, unix_time_period); -} - -void GnssSatelliteInformation::SetUp(const double start_unix_time, const double step_width_s) { - position_.SetUp(start_unix_time, step_width_s); - clock_.SetUp(start_unix_time, step_width_s); -} - -void GnssSatelliteInformation::Update(const double current_unix_time) { - position_.Update(current_unix_time); - clock_.Update(current_unix_time); -} - -int GnssSatelliteInformation::GetNumberOfSatellites() const { - if (position_.GetNumberOfSatellites() == clock_.GetNumberOfSatellites()) { - return position_.GetNumberOfSatellites(); - } else { - cout << "Num Of Gnss Satellites has something wrong" << endl; - return 0; - } -} - -bool GnssSatelliteInformation::GetWhetherValid(int gnss_satellite_id) const { - if (position_.GetWhetherValid(gnss_satellite_id) && clock_.GetWhetherValid(gnss_satellite_id)) return true; - return false; -} - -libra::Vector<3> GnssSatelliteInformation::GetSatellitePositionEcef(int gnss_satellite_id) const { - return position_.GetPosition_ecef_m(gnss_satellite_id); -} - -libra::Vector<3> GnssSatelliteInformation::GetSatellitePositionEci(int gnss_satellite_id) const { - return position_.GetPosition_eci_m(gnss_satellite_id); -} - -double GnssSatelliteInformation::GetSatelliteClock(int gnss_satellite_id) const { return clock_.GetSatClock(gnss_satellite_id); } - -// GnssSatellites -GnssSatellites::GnssSatellites(bool is_calc_enabled) -#ifdef GNSS_SATELLITES_DEBUG_OUTPUT - : ofs_true("true.csv"), - ofs_estimation("estimation.csv"), - ofs_sa("sa.csv") -#endif -{ - // TODO: Add log enable flag in ini file - is_calc_enabled_ = is_calc_enabled; - if (is_calc_enabled_) { - is_log_enabled_ = true; - } else { - is_log_enabled_ = false; } -} - -bool GnssSatellites::IsCalcEnabled() const { return is_calc_enabled_; } - -void GnssSatellites::Initialize(vector>& true_position_file, int true_position_interpolation_method, - int true_position_interpolation_number, UltraRapidMode true_position_ur_flag, - - vector>& true_clock_file, string true_clock_file_extension, int true_clock_interpolation_number, - UltraRapidMode true_clock_ur_flag, - - vector>& estimate_position_file, int estimate_position_interpolation_method, - int estimate_position_interpolation_number, UltraRapidMode estimate_position_ur_flag, - - vector>& estimate_clock_file, string estimate_clock_file_extension, - int estimate_clock_interpolation_number, UltraRapidMode estimate_clock_ur_flag) { - true_info_.Initialize(true_position_file, true_position_interpolation_method, true_position_interpolation_number, true_position_ur_flag, - - true_clock_file, true_clock_file_extension, true_clock_interpolation_number, true_clock_ur_flag); - - estimate_info_.Initialize(estimate_position_file, estimate_position_interpolation_method, estimate_position_interpolation_number, - estimate_position_ur_flag, - - estimate_clock_file, estimate_clock_file_extension, estimate_clock_interpolation_number, estimate_clock_ur_flag); - - return; -} - -void GnssSatellites::SetUp(const SimulationTime* simulation_time) { - if (!IsCalcEnabled()) return; - tm* start_tm = initialized_tm(); - start_tm->tm_year = simulation_time->GetStartYear() - 1900; - start_tm->tm_mon = simulation_time->GetStartMonth() - 1; - start_tm->tm_mday = simulation_time->GetStartDay(); - start_tm->tm_hour = simulation_time->GetStartHour(); - start_tm->tm_min = simulation_time->GetStartMinute(); - double start_sec = simulation_time->GetStartSecond(); - start_tm->tm_sec = (int)start_sec; - double unix_time = (double)mktime(start_tm) + start_sec - floor(start_sec); - std::free(start_tm); - true_info_.SetUp(unix_time, simulation_time->GetSimulationStep_s()); - estimate_info_.SetUp(unix_time, simulation_time->GetSimulationStep_s()); - - start_unix_time_ = unix_time; - - return; -} - -void GnssSatellites::Update(const SimulationTime* simulation_time) { - if (!IsCalcEnabled()) return; - - double elapsed_sec = simulation_time->GetElapsedTime_s(); - - true_info_.Update(elapsed_sec + start_unix_time_); - estimate_info_.Update(elapsed_sec + start_unix_time_); - -#ifdef GNSS_SATELLITES_DEBUG_OUTPUT - DebugOutput(); -#endif - - return; + return true; } -int GnssSatellites::GetNumberOfSatellites() const { return estimate_info_.GetNumberOfSatellites(); } - -string GnssSatellites::GetIdFromIndex(int index) const { return estimate_info_.GetGnssSatPos().GetIdFromIndex(index); } - -int GnssSatellites::GetIndexFromId(string sat_num) const { return estimate_info_.GetGnssSatPos().GetIndexFromId(sat_num); } - -bool GnssSatellites::GetWhetherValid(int gnss_satellite_id) const { - if (gnss_satellite_id >= GetNumberOfSatellites()) return false; - - if (true_info_.GetWhetherValid(gnss_satellite_id) && estimate_info_.GetWhetherValid(gnss_satellite_id)) - return true; - else - return false; -} +std::string GnssSatellites::GetLogHeader() const { + std::string str_tmp = ""; -libra::Vector<3> GnssSatellites::GetSatellitePositionEcef(const int gnss_satellite_id) const { - // gnss_satellite_id is wrong or not valid - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) { - libra::Vector<3> res(0); - return res; + // TODO: Add log output for other navigation systems + for (size_t gps_index = 0; gps_index < kNumberOfGpsSatellite; gps_index++) { + str_tmp += logger::WriteVector("GPS" + std::to_string(gps_index) + "_position", "ecef", "m", 3); + str_tmp += logger::WriteScalar("GPS" + std::to_string(gps_index) + "_clock_offset", "s"); } - return estimate_info_.GetSatellitePositionEcef(gnss_satellite_id); + return str_tmp; } -libra::Vector<3> GnssSatellites::GetSatellitePositionEci(const int gnss_satellite_id) const { - // gnss_satellite_id is wrong or not valid - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) { - libra::Vector<3> res(0); - return res; - } - - return estimate_info_.GetSatellitePositionEci(gnss_satellite_id); -} +std::string GnssSatellites::GetLogValue() const { + std::string str_tmp = ""; -double GnssSatellites::GetSatelliteClock(const int gnss_satellite_id) const { - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) { - return 0.0; + for (size_t gps_index = 0; gps_index < kNumberOfGpsSatellite; gps_index++) { + str_tmp += logger::WriteVector(GetPosition_ecef_m(gps_index), 16); + str_tmp += logger::WriteScalar(GetClock_s(gps_index)); } - return estimate_info_.GetSatelliteClock(gnss_satellite_id); + return str_tmp; } -double GnssSatellites::GetPseudoRangeECEF(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, - const double frequency) const { - // gnss_satellite_id is wrong or not validate - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) return 0.0; - - double res = 0.0; - auto gnss_position = true_info_.GetSatellitePositionEcef(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - res += pow(rec_position(i) - gnss_position(i), 2.0); - } - res = sqrt(res); - - // clock bias - res += rec_clock - true_info_.GetSatelliteClock(gnss_satellite_id); - - // ionospheric delay - const double ionospheric_delay = AddIonosphericDelay(gnss_satellite_id, rec_position, frequency, GnssFrameDefinition::kEcef); - - res += ionospheric_delay; - - return res; -} +GnssSatellites* InitGnssSatellites(const std::string file_name, const EarthRotation& earth_rotation, const SimulationTime& simulation_time) { + setting_file_reader::IniAccess ini_file(file_name); + char section[] = "GNSS_SATELLITES"; -double GnssSatellites::GetPseudoRangeECI(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, const double frequency) const { - // gnss_satellite_id is wrong or not validate - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) return 0.0; + const bool is_calc_enable = ini_file.ReadEnable(section, INI_CALC_LABEL); + const bool is_log_enable = ini_file.ReadEnable(section, INI_LOG_LABEL); - double res = 0.0; - auto gnss_position = true_info_.GetSatellitePositionEci(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - res += pow(rec_position(i) - gnss_position(i), 2.0); + GnssSatellites* gnss_satellites = new GnssSatellites(earth_rotation, is_calc_enable, is_log_enable); + if (!gnss_satellites->IsCalcEnabled()) { + return gnss_satellites; } - res = sqrt(res); - - // clock bias - res += rec_clock - true_info_.GetSatelliteClock(gnss_satellite_id); - - // ionospheric delay - const double ionospheric_delay = AddIonosphericDelay(gnss_satellite_id, rec_position, frequency, GnssFrameDefinition::kEci); - - res += ionospheric_delay; - return res; -} - -pair GnssSatellites::GetCarrierPhaseECEF(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, - const double frequency) const { - // gnss_satellite_id is wrong or not validate - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) return {0.0, 0.0}; - - double res = 0.0; - auto gnss_position = true_info_.GetSatellitePositionEcef(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - res += pow(rec_position(i) - gnss_position(i), 2.0); + const std::string directory_path = ini_file.ReadString(section, "directory_path"); + const std::string file_name_header = ini_file.ReadString(section, "file_name_header"); + const std::string orbit_data_period = ini_file.ReadString(section, "orbit_data_period"); + const std::string clock_file_name_footer = ini_file.ReadString(section, "clock_file_name_footer"); + bool use_sp3_for_clock = false; + if (clock_file_name_footer == (orbit_data_period + "_ORB.SP3")) { + use_sp3_for_clock = true; } - res = sqrt(res); - - // clock bias - res += rec_clock - true_info_.GetSatelliteClock(gnss_satellite_id); - // ionospheric delay - const double ionospheric_delay = AddIonosphericDelay(gnss_satellite_id, rec_position, frequency, GnssFrameDefinition::kEcef); - - res -= ionospheric_delay; - - // wavelength frequency is thought to be given by MHz - double lambda = environment::speed_of_light_m_s * 1e-6 / frequency; - double cycle = res / lambda; - - double bias = floor(cycle); - cycle -= bias; - - return {cycle, bias}; -} - -pair GnssSatellites::GetCarrierPhaseECI(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, - const double frequency) const { - // gnss_satellite_id is wrong or not validate - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) return {0.0, 0.0}; - - double res = 0.0; - auto gnss_position = true_info_.GetSatellitePositionEci(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - res += pow(rec_position(i) - gnss_position(i), 2.0); + // Duration + const size_t start_date = (size_t)ini_file.ReadInt(section, "start_date"); + const size_t end_date = (size_t)ini_file.ReadInt(section, "end_date"); + if (start_date > end_date) { + std::cout << "[ERROR] GNSS satellite initialize: start_date is larger than the end date." << std::endl; } - res = sqrt(res); - - // clock bias - res += rec_clock - true_info_.GetSatelliteClock(gnss_satellite_id); - // ionospheric delay - const double ionospheric_delay = AddIonosphericDelay(gnss_satellite_id, rec_position, frequency, GnssFrameDefinition::kEci); + // Read all product files + std::vector sp3_file_readers; - res -= ionospheric_delay; + size_t read_file_date = start_date; + while (read_file_date <= end_date) { + std::string sp3_file_name = GetOrbitClockFinalFileName(file_name_header, read_file_date, orbit_data_period); + std::string sp3_full_file_path = directory_path + sp3_file_name; - // wavelength frequency is thought to be given by MHz - double lambda = environment::speed_of_light_m_s * 1e-6 / frequency; - double cycle = res / lambda; + // Read SP3 + sp3_file_readers.push_back(Sp3FileReader(sp3_full_file_path)); - double bias = floor(cycle); - cycle -= bias; - - return {cycle, bias}; -} - -// for Ionospheric delay I[m] -double GnssSatellites::AddIonosphericDelay(const int gnss_satellite_id, const libra::Vector<3> rec_position, const double frequency, - const GnssFrameDefinition flag) const { - // gnss_satellite_id is wrong or not validate - if (gnss_satellite_id >= GetNumberOfSatellites() || !GetWhetherValid(gnss_satellite_id)) return 0.0; - - const double earth_hemisphere_km = environment::earth_equatorial_radius_m / 1000.0; - - double altitude = 0.0; - for (int i = 0; i < 3; ++i) altitude += pow(rec_position[i], 2.0); - altitude = sqrt(altitude); - altitude = altitude / 1000.0 - earth_hemisphere_km; //[m -> km] - if (altitude >= 1000.0) return 0.0; // there is no Ionosphere above 1000km - - libra::Vector<3> gnss_position; - if (flag == GnssFrameDefinition::kEcef) - gnss_position = true_info_.GetSatellitePositionEcef(gnss_satellite_id); - else if (flag == GnssFrameDefinition::kEci) - gnss_position = true_info_.GetSatellitePositionEci(gnss_satellite_id); - - double angle_rad = CalcAngleTwoVectors_rad(rec_position, gnss_position - rec_position); - const double default_delay = 20.0; //[m] default delay - // Assume the maximum height as 1000.0. Divide by cos because the slope makes it longer. - double delay = default_delay * (1000.0 - altitude) / 1000.0 / cos(angle_rad); - const double default_frequency = 1500.0; //[MHz] - // Ionospheric delay is inversely proportional to the square of the frequency - delay *= pow(default_frequency / frequency, 2.0); - - return delay; -} - -std::string GnssSatellites::GetLogHeader() const { - std::string str_tmp = ""; + // Clock file + if (!use_sp3_for_clock) { + std::string clk_file_name = + GetOrbitClockFinalFileName(file_name_header, read_file_date, clock_file_name_footer.substr(0, 3), clock_file_name_footer.substr(4, 7)); + std::string clk_full_file_path = directory_path + clk_file_name; + // TODO: Read CLK file + } - // TODO: Add log output for other navigation systems - for (size_t gps_index = 0; gps_index < gps_sat_num_; gps_index++) { - str_tmp += WriteVector("GPS" + std::to_string(gps_index) + "_position", "ecef", "m", 3); - str_tmp += WriteScalar("GPS" + std::to_string(gps_index) + "_clock_offset", "m"); + // Increment + read_file_date = IncrementYearDoy(read_file_date); } - return str_tmp; -} - -std::string GnssSatellites::GetLogValue() const { - std::string str_tmp = ""; - - for (size_t gps_index = 0; gps_index < gps_sat_num_; gps_index++) { - str_tmp += WriteVector(true_info_.GetSatellitePositionEcef((int)gps_index), 16); - str_tmp += WriteScalar(true_info_.GetSatelliteClock((int)gps_index)); - } + // + time_system::DateTime start_date_time((size_t)simulation_time.GetStartYear(), (size_t)simulation_time.GetStartMonth(), + (size_t)simulation_time.GetStartDay(), (size_t)simulation_time.GetStartHour(), + (size_t)simulation_time.GetStartMinute(), simulation_time.GetStartSecond()); + time_system::EpochTime start_epoch_time(start_date_time); + gnss_satellites->Initialize(sp3_file_readers, start_epoch_time); - return str_tmp; + return gnss_satellites; } -void GnssSatellites::DebugOutput() { -#ifdef GNSS_SATELLITES_DEBUG_OUTPUT - for (int gnss_satellite_id = 0; gnss_satellite_id < gps_sat_num_; ++gnss_satellite_id) { - if (true_info_.GetWhetherValid(gnss_satellite_id)) { - auto true_pos = true_info_.GetSatellitePositionEcef(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - ofs_true << fixed << setprecision(10) << true_pos[i] << ","; - } - auto true_clock = true_info_.GetSatelliteClock(gnss_satellite_id); - ofs_true << true_clock << ","; - } else { - for (int i = 0; i < 4; ++i) { - ofs_true << 0.0 << ","; - } - } - - if (estimate_info_.GetWhetherValid(gnss_satellite_id)) { - auto estimation_pos = estimate_info_.GetSatellitePositionEcef(gnss_satellite_id); - for (int i = 0; i < 3; ++i) { - ofs_estimation << fixed << setprecision(10) << estimation_pos[i] << ","; - } - auto estimation_clock = estimate_info_.GetSatelliteClock(gnss_satellite_id); - ofs_estimation << estimation_clock << ","; - } else { - for (int i = 0; i < 4; ++i) { - ofs_estimation << 0.0 << ","; - } - } - - if (GetWhetherValid(gnss_satellite_id)) { - auto true_pos = true_info_.GetSatellitePositionEcef(gnss_satellite_id); - auto true_clock = true_info_.GetSatelliteClock(gnss_satellite_id); - auto estimation_pos = estimate_info_.GetSatellitePositionEcef(gnss_satellite_id); - auto estimation_clock = estimate_info_.GetSatelliteClock(gnss_satellite_id); - - for (int i = 0; i < 3; ++i) { - ofs_sa << fixed << setprecision(10) << estimation_pos[i] - true_pos[i] << ","; - } - ofs_sa << fixed << setprecision(10) << estimation_clock - true_clock << ","; - } else { - for (int i = 0; i < 4; ++i) { - ofs_sa << 0.0 << ","; - } - } - } - - ofs_true << endl; - ofs_estimation << endl; - ofs_sa << endl; -#endif - return; -} +} // namespace s2e::environment diff --git a/src/environment/global/gnss_satellites.hpp b/src/environment/global/gnss_satellites.hpp index 2777150e9..065dc5840 100644 --- a/src/environment/global/gnss_satellites.hpp +++ b/src/environment/global/gnss_satellites.hpp @@ -1,329 +1,49 @@ /** * @file gnss_satellites.hpp - * @brief Class to calculate GNSS satellite position and related states + * @brief Class to calculate GNSS satellite position and clock + * @note TODO: Add GNSS satellite antenna information */ #ifndef S2E_ENVIRONMENT_GLOBAL_GNSS_SATELLITES_HPP_ #define S2E_ENVIRONMENT_GLOBAL_GNSS_SATELLITES_HPP_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include "library/logger/loggable.hpp" -#include "library/math/vector.hpp" +#include "earth_rotation.hpp" +#include "logger/loggable.hpp" +#include "math_physics/gnss/gnss_satellite_number.hpp" +#include "math_physics/math/vector.hpp" #include "simulation_time.hpp" -extern const double nan99; //!< Not at Number TODO: Should be moved to another place - -enum class GnssFrameDefinition { - kEcef = 0, //!< Use ECEF frame for GNSS satellite position frame in Add_IonosphericDelay - kEci = 1 //!< Use ECI frame for GNSS satellite position frame in Add_IonosphericDelay -}; - -// #define GNSS_SATELLITES_DEBUG_OUTPUT //!< For debug output, uncomment this - -/** - * @enum UltraRapidMode - * @brief Ultra Rapid mode - * @details When Using Ultra Rapid ephemerides, decide to use which 6 hours in each observe and predict 24 hours - * @note TODO: change to enum class - */ -enum UltraRapidMode { - kNotUse, //!< Don't use ultra rapid - - kObserve1, //!< the most oldest observe 6 hours (most precise) - kObserve2, //!< the second oldest observe 6 hours (6 ~ 12) - kObserve3, - kObserve4, - - kPredict1, //!< the most oldest preserve 6 hours (most precise) - kPredict2, - kPredict3, - kPredict4, - - kUnknown -}; - -/** - * @class GnssSatelliteBase - * @brief A class to summarize basic feature of GNSS position and clock calculation - */ -class GnssSatelliteBase { - public: - /** - * @fn GetIndexFromId - * @brief Calculate index of GNSS satellite defined in this class from GNSS satellite number defined in GNSS system - * @return Index of GNSS satellite defined in this class - */ - int GetIndexFromId(std::string sat_num) const; - /** - * @fn GetIdFromIndex - * @brief Calculate GNSS satellite number defined in GNSS system from index of GNSS satellite defined in this class - * @return GNSS satellite number defined in GNSS system - */ - std::string GetIdFromIndex(int index) const; - /** - * @fn GetNumberOfSatellites - * @brief Return total satellite number in all GNSS system (Constant value) - */ - int GetNumberOfSatellites() const; - /** - * @fn GetWhetherValid - * @brief Return true the GNSS satellite information is available - * @param [in] gnss_satellite_id: Index of GNSS satellite - */ - bool GetWhetherValid(int gnss_satellite_id) const; - - protected: - /** - * @fn TrigonometricInterpolation - * @brief Interpolate with Trigonometric method - * @note Ref: http://acc.igs.org/orbits/orbit-interp_gpssoln03.pdf - * https://en.wikipedia.org/wiki/Trigonometric_interpolation# - * @param [in] time_vector: List of given time - * @param [in] values: List of given value - * @param [in] time: Time to calculate the interpolated value - * @return Interpolated value - */ - template - libra::Vector TrigonometricInterpolation(const std::vector& time_vector, const std::vector>& values, double time) const; - double TrigonometricInterpolation(const std::vector& time_vector, const std::vector& values, double time) const; - - /** - * @fn LagrangeInterpolation - * @brief Interpolate with Lagrange method - * @param [in] time_vector: List of given time - * @param [in] values: List of given value - * @param [in] time: Time to calculate the interpolated value - * @return Interpolated value - */ - template - libra::Vector LagrangeInterpolation(const std::vector& time_vector, const std::vector>& values, double time) const; - double LagrangeInterpolation(const std::vector& time_vector, const std::vector& values, double time) const; - - std::vector> unix_time_list; //!< List of unixtime for all satellite - std::vector> time_period_list_; //!< List of time period for interpolation - std::vector validate_; //!< List of whether the satellite is available at the time - std::vector nearest_index_; //!< Index list for update(in position, time_and_index_list_. in clock_bias, time_table_) - - double step_width_s_ = 0.0; //!< Step width [sec] - double time_interval_ = 0.0; //!< Time interval - int interpolation_number_ = 0; //!< Interpolation number -}; - -/** - * @class GnssSatellitePosition - * @brief Class to manage GNSS satellite position information - */ -class GnssSatellitePosition : public GnssSatelliteBase { - public: - /** - * @fn GnssSatellitePosition - * @brief Constructor - */ - GnssSatellitePosition() {} - /** - * @fn Initialize - * @brief Initialize GNSS satellite position - * @param[in] file: File path for position calculation - * @param[in] interpolation_method: Interpolation method for position calculation - * @param[in] interpolation_number: Interpolation number for position calculation - * @param[in] ur_flag: Ultra Rapid flag for position calculation - * @return Start unix time and end unix time - */ - std::pair Initialize(std::vector>& file, int interpolation_method, int interpolation_number, - UltraRapidMode ur_flag); - - /** - * @fn Setup - * @brief Setup GNSS satellite position information - * @param [in] start_unix_time: Start unix time - * @param [in] step_width_s: Step width [sec] - */ - void SetUp(const double start_unix_time, const double step_width_s); - /** - * @fn Update - * @brief Update GNSS satellite position information - * @param [in] current_unix_time: Current unix time - */ - void Update(const double current_unix_time); - - /** - * @fn GetPosition_ecef_m - * @brief Return GNSS satellite position vector in the ECEF frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - libra::Vector<3> GetPosition_ecef_m(int gnss_satellite_id) const; - /** - * @fn GetPosition_eci_m - * @brief Return GNSS satellite position vector in the ECI frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - libra::Vector<3> GetPosition_eci_m(int gnss_satellite_id) const; - - private: - std::vector> position_ecef_m_; //!< List of GNSS satellite position at specific time in the ECEF frame [m] - std::vector> position_eci_m_; //!< List of GNSS satellite position at specific time in the ECI frame [m] - - std::vector>> time_series_position_ecef_m_; //!< Time series of position of all GNSS satellites in the ECEF frame [m] - std::vector>> time_series_position_eci_m_; //!< Time series of position of all GNSS satellites in the ECEF frame [m] - - // TODO: move to local function? - std::vector>> ecef_; //!< Time series of position of all GNSS satellites in the ECEF frame before interpolation [m] - std::vector>> eci_; //!< Time series of position of all GNSS satellites in the ECEF frame before interpolation [m] -}; - -/** - * @class GnssSatelliteClock - * @brief Class to manage GNSS satellite clock information - */ -class GnssSatelliteClock : public GnssSatelliteBase { - public: - /** - * @fn GnssSatelliteClock - * @brief Constructor - */ - GnssSatelliteClock() {} - /** - * @fn Initialize - * @brief Initialize GNSS satellite clock - * @param[in] file: File path for clock calculation - * @param[in] file_extension: Extension of the clock file (ex. .sp3, .clk30s) - * @param[in] interpolation_number: Interpolation number for clock calculation - * @param[in] ur_flag: Ultra Rapid flag for clock calculation - */ - void Initialize(std::vector>& file, std::string file_extension, int interpolation_number, UltraRapidMode ur_flag, - std::pair unix_time_period); - /** - * @fn SetUp - * @brief Setup GNSS satellite clock information - * @param [in] start_unix_time: Start unix time - * @param [in] step_width_s: Step width [sec] - */ - void SetUp(const double start_unix_time, const double step_width_s); - /** - * @fn Update - * @brief Update GNSS satellite clock information - * @param [in] current_unix_time: Current unix time - */ - void Update(const double current_unix_time); - /** - * @fn GetSatClock - * @brief Return GNSS satellite clock in distance expression [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - double GetSatClock(int gnss_satellite_id) const; - - private: - std::vector clock_offset_m_; //!< List of clock bias of all GNSS satellites at specific time expressed in distance [m] - std::vector> time_series_clock_offset_m_; //!< Time series of clock bias of all GNSS satellites expressed in distance [m] - - // TODO: move to local function? - std::vector> clock_bias_; //!< Time series of clock bias of all GNSS satellites expressed in distance before interpolation [m] -}; - -/** - * @class GnssSatelliteInformation - * @brief Class to manage GNSS satellite information including position and clock - */ -class GnssSatelliteInformation { - public: - /** - * @fn GnssSatelliteInformation - * @brief Constructor - */ - GnssSatelliteInformation(); - /** - * @fn Initialize - * @brief Initialize position and clock - * @param[in] position_file: File path for position calculation - * @param[in] position_interpolation_method: Interpolation method for position calculation - * @param[in] position_interpolation_number: Interpolation number for position calculation - * @param[in] position_ur_flag: Ultra Rapid flag for position calculation - * @param[in] clock_file: File path for clock calculation - * @param[in] clock_file_extension: Extension of the clock file (ex. .sp3, .clk30s) - * @param[in] clock_interpolation_number: Interpolation number for clock calculation - * @param[in] clock_ur_flag: Ultra Rapid flag for clock calculation - */ - void Initialize(std::vector>& position_file, int position_interpolation_method, int position_interpolation_number, - UltraRapidMode position_ur_flag, std::vector>& clock_file, std::string clock_file_extension, - int clock_interpolation_number, UltraRapidMode clock_ur_flag); - /** - * @fn SetUp - * @brief Setup GNSS satellite position and clock information - * @param [in] start_unix_time: Start unix time - * @param [in] step_width_s: Step width [sec] - */ - void SetUp(const double start_unix_time, const double step_width_s); - /** - * @fn Update - * @brief Update GNSS satellite position and clock information - * @param [in] current_unix_time: Current unix time - */ - void Update(const double current_unix_time); - - /** - * @fn GetNumberOfSatellites - * @brief Get total number of GNSS satellite (constant value) - * @note TODO: Consider this function is really needed. - */ - int GetNumberOfSatellites() const; - /** - * @fn GetWhetherValid - * @brief Return true the GNSS satellite information is available for both position and clock information - * @param [in] gnss_satellite_id: Index of GNSS satellite - */ - bool GetWhetherValid(int gnss_satellite_id) const; - /** - * @fn GetSatellitePositionEcef - * @brief Return GNSS satellite position vector in the ECEF frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - libra::Vector<3> GetSatellitePositionEcef(int gnss_satellite_id) const; - /** - * @fn GetSatellitePositionEci - * @brief Return GNSS satellite position vector in the ECEF frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - libra::Vector<3> GetSatellitePositionEci(int gnss_satellite_id) const; - /** - * @fn GetSatelliteClock - * @brief Return GNSS satellite clock in distance expression [m] - * @param [in] gnss_satellite_id: GNSS satellite ID defined in this class - */ - double GetSatelliteClock(int gnss_satellite_id) const; - /** - * @fn GetGnssSatPos - * @brief Return GNSS satellite position information class - */ - inline const GnssSatellitePosition& GetGnssSatPos() const { return position_; }; - /** - * @fn GetGnssSatClock - * @brief Return GNSS satellite clock information class - */ - inline const GnssSatelliteClock& GetGnssSatClock() const { return clock_; } - - private: - GnssSatellitePosition position_; //!< GNSS satellite position information - GnssSatelliteClock clock_; //!< GNSS satellite clock information -}; +namespace s2e::environment { /** * @class GnssSatellites - * @brief Class to calculate GNSS satellite position and related states + * @brief Class to calculate GNSS satellite position and clock */ -class GnssSatellites : public ILoggable { +class GnssSatellites : public logger::ILoggable { public: /** * @fn GnssSatellites * @brief Constructor - * @param [in] is_calc_enabled: Flag to manage the GNSS satellite position calculation - */ - GnssSatellites(bool is_calc_enabled); + * @param [in] earth_rotation: Earth rotation information + * @param [in] is_calc_enabled: Flag to manage the GNSS satellite position/clock calculation + * @param [in] is_log_enabled: Flag to generate the log of GNSS satellite position/clock calculation + */ + GnssSatellites(const EarthRotation& earth_rotation, const bool is_calc_enabled = false, const bool is_log_enabled = false) + : is_calc_enabled_(is_calc_enabled), earth_rotation_(earth_rotation) { + if (!is_calc_enabled_) { + is_log_enabled_ = false; + } else { + is_log_enabled_ = is_log_enabled; + } + } /** * @fn ~GnssSatellites * @brief Destructor @@ -333,186 +53,108 @@ class GnssSatellites : public ILoggable { /** * @fn Initialize * @brief Initialize function - * @note Parameters are defined in GNSSSat_Info for true and estimated information + * @param [in] sp3_files: List of SP3 files + * @param [in] start_time: The simulation start time */ - void Initialize(std::vector>& true_position_file, int true_position_interpolation_method, - int true_position_interpolation_number, UltraRapidMode true_position_ur_flag, - std::vector>& true_clock_file, std::string true_clock_file_extension, int true_clock_interpolation_number, - UltraRapidMode true_clock_ur_flag, std::vector>& estimate_position_file, - int estimate_position_interpolation_method, int estimate_position_interpolation_number, UltraRapidMode estimate_position_ur_flag, - std::vector>& estimate_clock_file, std::string estimate_clock_file_extension, - int estimate_clock_interpolation_number, UltraRapidMode estimate_clock_ur_flag); + void Initialize(const std::vector& sp3_files, const time_system::EpochTime start_time); + /** * @fn IsCalcEnabled * @brief Return calculated enabled flag */ - bool IsCalcEnabled() const; + inline bool IsCalcEnabled() const { return is_calc_enabled_; } /** - * @fn SetUp - * @brief Setup both true and estimated GNSS satellite information - * @param [in] simulation_time: Simulation time information + * @fn GetNumberOfCalculatedSatellite + * @brief Return number of calculated satellite */ - void SetUp(const SimulationTime* simulation_time); + inline size_t GetNumberOfCalculatedSatellite() const { return number_of_calculated_gnss_satellites_; } + /** * @fn Update - * @brief Update both true and estimated GNSS satellite information + * @brief Update both GNSS satellite information * @param [in] simulation_time: Simulation time information */ - void Update(const SimulationTime* simulation_time); + void Update(const SimulationTime& simulation_time); - /** - * @fn GetIndexFromId - * @brief Calculate index of GNSS satellite defined in this class from GNSS satellite number defined in GNSS system - * @note TODO: Is this function really needed? This is just called other accessible function. - * @return Index of GNSS satellite defined in this class - */ - int GetIndexFromId(std::string sat_num) const; - /** - * @fn GetIdFromIndex - * @brief Calculate GNSS satellite number defined in GNSS system from index of GNSS satellite defined in this class - * @note TODO: Is this function really needed? This is just called other accessible function. - * @return GNSS satellite number defined in GNSS system - */ - std::string GetIdFromIndex(int index) const; - /** - * @fn GetNumberOfSatellites - * @brief Return total number of GNSS satellite for estimated information - * @note TODO: Is this function really needed? This is just called other accessible function. - */ - int GetNumberOfSatellites() const; - /** - * @fn GetWhetherValid - * @brief Return true the GNSS satellite information is available for both position and clock for both true and estimated value - * @param [in] gnss_satellite_id: Index of GNSS satellite - */ - bool GetWhetherValid(int gnss_satellite_id) const; - /** - * @fn GetStartUnixTime - * @brief Return start unix time - */ - inline double GetStartUnixTime() const { return start_unix_time_; } - /** - * @fn GetTrueInformation - * @brief Return GNSS satellite information class for true value system - */ - inline const GnssSatelliteInformation& GetTrueInformation() const { return true_info_; } - /** - * @fn GetEstimationInformation - * @brief Return GNSS satellite information class for estimated value system - */ - inline const GnssSatelliteInformation& GetEstimationInformation() const { return estimate_info_; } + inline math::Vector<3> GetPosition_eci_m(const size_t gnss_satellite_id) const { + // TODO: Add target time for earth rotation calculation + return earth_rotation_.GetDcmJ2000ToEcef().Transpose() * GetPosition_ecef_m(gnss_satellite_id); + } /** - * @fn GetSatellitePositionEcef - * @brief Return GNSS satellite position in the ECEF frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID - */ - libra::Vector<3> GetSatellitePositionEcef(const int gnss_satellite_id) const; - /** - * @fn GetSatellitePositionEci - * @brief Return GNSS satellite position in the ECI frame [m] - * @param [in] gnss_satellite_id: GNSS satellite ID - */ - libra::Vector<3> GetSatellitePositionEci(const int gnss_satellite_id) const; - /** - * @fn GetSatelliteClock - * @brief Return GNSS satellite clock - * @param [in] gnss_satellite_id: GNSS satellite ID + * @fn GetPosition_ecef_m + * @brief Return GNSS satellite position at ECEF frame + * @param [in] gnss_satellite_id: ID of GNSS satellite + * @param [in] time: Target time to get the GNSS satellite. When the argument is not set, the last updated time is used for the calculation. + * @return GNSS satellite position at ECEF frame at the time. Or return zero vector when the arguments are out of range. */ - double GetSatelliteClock(const int gnss_satellite_id) const; + math::Vector<3> GetPosition_ecef_m(const size_t gnss_satellite_id, const time_system::EpochTime time = time_system::EpochTime(0, 0.0)) const; /** - * @fn GetPseudoRangeECEF - * @brief Calculate pseudo range between receiver and a GNSS satellite - * @param [in] gnss_satellite_id: GNSS satellite ID - * @param [in] rec_position: Receiver position vector in the ECEF frame [m] - * @param [in] rec_clock: Receiver clock - * @param [in] frequency: Frequency of the signal [MHz] - * @return Pseudo range [m] - */ - double GetPseudoRangeECEF(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, const double frequency) const; - /** - * @fn GetPseudoRangeECI - * @brief Calculate pseudo range between receiver and a GNSS satellite - * @param [in] gnss_satellite_id: GNSS satellite ID - * @param [in] rec_position: Receiver position vector in the ECI frame [m] - * @param [in] rec_clock: Receiver clock - * @param [in] frequency: Frequency of the signal [MHz] - * @return Pseudo range [m] - */ - double GetPseudoRangeECI(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, const double frequency) const; - /** - * @fn GetCarrierPhaseECEF - * @brief Calculate carrier phase observed by a receiver for a GNSS satellite - * @param [in] gnss_satellite_id: GNSS satellite ID - * @param [in] rec_position: Receiver position vector in the ECEF frame [m] - * @param [in] rec_clock: Receiver clock - * @param [in] frequency: Frequency of the signal [MHz] - * @return Carrier phase cycle and bias [-] - */ - std::pair GetCarrierPhaseECEF(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, - const double frequency) const; - /** - * @fn GetCarrierPhaseECI - * @brief Calculate carrier phase observed by a receiver for a GNSS satellite - * @param [in] gnss_satellite_id: GNSS satellite ID - * @param [in] rec_position: Receiver position vector in the ECI frame [m] - * @param [in] rec_clock: Receiver clock - * @param [in] frequency: Frequency of the signal [MHz] - * @return Carrier phase cycle and bias [-] + * @fn GetGetClock_s + * @brief Return GNSS satellite clock offset + * @param [in] gnss_satellite_id: ID of GNSS satellite + * @param [in] time: Target time to get the GNSS satellite. When the argument is not set, the last updated time is used for the calculation. + * @return GNSS satellite clock offset at the time. Or return zero when the arguments are out of range. */ - std::pair GetCarrierPhaseECI(const int gnss_satellite_id, libra::Vector<3> rec_position, double rec_clock, - const double frequency) const; + double GetClock_s(const size_t gnss_satellite_id, const time_system::EpochTime time = time_system::EpochTime(0, 0.0)) const; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ std::string GetLogHeader() const override; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ std::string GetLogValue() const override; - /** - * @fn DebugOutput - * @brief Debug output - */ - void DebugOutput(void); - private: + bool is_calc_enabled_ = false; //!< Flag to manage the GNSS satellite position calculation + + std::vector sp3_files_; //!< List of SP3 files + size_t number_of_calculated_gnss_satellites_; //!< Number of calculated GNSS satellites + size_t sp3_file_id_; //!< Current SP3 file ID + time_system::EpochTime reference_time_; //!< Reference start time of the SP3 handling + size_t reference_interpolation_id_ = 0; //!< Reference epoch ID of the interpolation + time_system::EpochTime current_epoch_time_; //!< The last updated time + + std::vector orbit_; //!< GNSS satellite orbit with interpolation + std::vector clock_; //!< GNSS satellite clock offset with interpolation + + // References + const EarthRotation& earth_rotation_; //!< Earth rotation + /** - * @fn TrigonometricInterpolation - * @brief Is this similar with GnssSatelliteBase's function? + * @fn GetCurrentSp3File + * @brief Get the SP3 file should be used at the time + * @param [out] current_sp3_file: SP3 file information should be use. + * @param [in] current_time: Target time + * @return true means no error, false means the time argument is out of range */ - double TrigonometricInterpolation(std::vector time_period, std::vector position, double time); + bool GetCurrentSp3File(gnss::Sp3FileReader& current_sp3_file, const time_system::EpochTime current_time); /** - * @fn AddIonosphericDelay - * @brief Calculation of ionospheric delay - * @note TODO: Ionospheric delay very Miscellaneous need to fix - * @param [in] gnss_satellite_id: GNSS satellite ID - * @param [in] rec_position: Receiver position [m] - * @param [in] frequency: Frequency [MHz] - * @param [in] flag: The frame definition of the receiver position (ECI or ECEF) - * @return Ionospheric delay [m] + * @fn UpdateInterpolationInformation + * @brief Update interpolation information by inserting new data + * @return true: No error, false: SP3 file out of range error */ - double AddIonosphericDelay(const int gnss_satellite_id, const libra::Vector<3> rec_position, const double frequency, - const GnssFrameDefinition flag) const; + bool UpdateInterpolationInformation(); +}; - bool is_calc_enabled_ = true; //!< Flag to manage the GNSS satellite position calculation - GnssSatelliteInformation true_info_; //!< True information of GNSS satellites - GnssSatelliteInformation estimate_info_; //!< Estimated information of GNSS satellites TODO: should be move out from GlobalEnvironment - double start_unix_time_; //!< Start unix time +/** + * @fn InitGnssSatellites + * @brief Initialize function for GnssSatellites class + * @param [in] file_name: Path to the initialize file + * @param [in] earth_rotation: Earth rotation information + * @param [in] simulation_time: Simulation time information + * @return Initialized GnssSatellite class + */ +GnssSatellites* InitGnssSatellites(const std::string file_name, const EarthRotation& earth_rotation, const SimulationTime& simulation_time); -#ifdef GNSS_SATELLITES_DEBUG_OUTPUT - ofstream ofs_true; //!< Debug output for true value - ofstream ofs_estimation; //!< Debug output for estimated value - ofstream ofs_sa; //!< Debug output for difference between true and estimated value -#endif -}; +} // namespace s2e::environment #endif // S2E_ENVIRONMENT_GLOBAL_GNSS_SATELLITES_HPP_ diff --git a/src/environment/global/hipparcos_catalogue.cpp b/src/environment/global/hipparcos_catalogue.cpp index 0ea5de6d0..8888085ac 100644 --- a/src/environment/global/hipparcos_catalogue.cpp +++ b/src/environment/global/hipparcos_catalogue.cpp @@ -11,8 +11,10 @@ #include #include -#include "library/initialize/initialize_file_access.hpp" -#include "library/math/constants.hpp" +#include "math_physics/math/constants.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { HipparcosCatalogue::HipparcosCatalogue(double max_magnitude, std::string catalogue_path) : max_magnitude_(max_magnitude), catalogue_path_(catalogue_path) {} @@ -50,10 +52,10 @@ bool HipparcosCatalogue::ReadContents(const std::string& file_name, const char d return true; } -libra::Vector<3> HipparcosCatalogue::GetStarDirection_i(size_t rank) const { - libra::Vector<3> direction_i; - double ra_rad = GetRightAscension_deg(rank) * libra::deg_to_rad; - double de_rad = GetDeclination_deg(rank) * libra::deg_to_rad; +math::Vector<3> HipparcosCatalogue::GetStarDirection_i(size_t rank) const { + math::Vector<3> direction_i; + double ra_rad = GetRightAscension_deg(rank) * math::deg_to_rad; + double de_rad = GetDeclination_deg(rank) * math::deg_to_rad; direction_i[0] = cos(ra_rad) * cos(de_rad); direction_i[1] = sin(ra_rad) * cos(de_rad); @@ -62,9 +64,9 @@ libra::Vector<3> HipparcosCatalogue::GetStarDirection_i(size_t rank) const { return direction_i; } -libra::Vector<3> HipparcosCatalogue::GetStarDirection_b(size_t rank, libra::Quaternion quaternion_i2b) const { - libra::Vector<3> direction_i; - libra::Vector<3> direction_b; +math::Vector<3> HipparcosCatalogue::GetStarDirection_b(size_t rank, math::Quaternion quaternion_i2b) const { + math::Vector<3> direction_i; + math::Vector<3> direction_b; direction_i = GetStarDirection_i(rank); direction_b = quaternion_i2b.FrameConversion(direction_i); @@ -85,7 +87,7 @@ std::string HipparcosCatalogue::GetLogValue() const { } HipparcosCatalogue* InitHipparcosCatalogue(std::string file_name) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); const char* section = "HIPPARCOS_CATALOGUE"; std::string catalogue_path = ini_file.ReadString(section, "catalogue_file_path"); @@ -99,3 +101,5 @@ HipparcosCatalogue* InitHipparcosCatalogue(std::string file_name) { return hipparcos_catalogue_; } + +} // namespace s2e::environment diff --git a/src/environment/global/hipparcos_catalogue.hpp b/src/environment/global/hipparcos_catalogue.hpp index f22bd7c87..23dd55630 100644 --- a/src/environment/global/hipparcos_catalogue.hpp +++ b/src/environment/global/hipparcos_catalogue.hpp @@ -8,9 +8,11 @@ #include -#include "library/logger/loggable.hpp" -#include "library/math/quaternion.hpp" -#include "library/math/vector.hpp" +#include "logger/loggable.hpp" +#include "math_physics/math/quaternion.hpp" +#include "math_physics/math/vector.hpp" + +namespace s2e::environment { /** *@struct HipparcosData @@ -26,7 +28,7 @@ struct HipparcosData { *@class HipparcosCatalogue *@brief Class to calculate star direction with Hipparcos catalogue */ -class HipparcosCatalogue : public ILoggable { +class HipparcosCatalogue : public logger::ILoggable { public: /** *@fn HipparcosCatalogue @@ -82,24 +84,24 @@ class HipparcosCatalogue : public ILoggable { *@brief Return direction vector of a star in the inertial frame *@param [in] rank: Rank of star magnitude in read catalogue */ - libra::Vector<3> GetStarDirection_i(size_t rank) const; + math::Vector<3> GetStarDirection_i(size_t rank) const; /** *@fn GetStarDir_b *@brief Return direction vector of a star in the body-fixed frame *@param [in] rank: Rank of star magnitude in read catalogue *@param [in] quaternion_i2b: Quaternion from the inertial frame to the body-fixed frame */ - libra::Vector<3> GetStarDirection_b(size_t rank, libra::Quaternion quaternion_i2b) const; + math::Vector<3> GetStarDirection_b(size_t rank, math::Quaternion quaternion_i2b) const; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -118,4 +120,6 @@ class HipparcosCatalogue : public ILoggable { */ HipparcosCatalogue* InitHipparcosCatalogue(std::string file_name); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_HIPPARCOS_CATALOGUE_HPP_ diff --git a/src/environment/global/initialize_gnss_satellites.cpp b/src/environment/global/initialize_gnss_satellites.cpp deleted file mode 100644 index 23e98467c..000000000 --- a/src/environment/global/initialize_gnss_satellites.cpp +++ /dev/null @@ -1,357 +0,0 @@ -/** - *@file initialize_gnss_satellites.cpp - *@brief Initialize functions for GnssSatellites class - */ - -#include "initialize_gnss_satellites.hpp" - -#include -#include -#include - -/** - *@fn ReturnDirectoryPathWithFileType - *@brief Return directory path with file type infomation - *@param [in] sort: File type - *@return Directory path with file type infomation - */ -std::string ReturnDirectoryPathWithFileType(std::string sort) { - std::string main_directory, sub_directory; - - if (sort.substr(0, 2) == "IG") { - main_directory = "IGS/"; - if (sort.at(2) == 'S') { - sub_directory = "igs/"; - } else if (sort.at(2) == 'R') { - sub_directory = "igr/"; - } else if (sort.at(2) == 'U') { - sub_directory = "igu/"; - } - } else if (sort.substr(0, 2) == "ma") { - main_directory = "JAXA/"; - sub_directory = "madoca/"; - } else { - for (int i = 0; i < (int)sort.size(); ++i) { - if (sort.at(i) == '_') { - main_directory = sort.substr(0, i) + "/"; - if (sort.at(i + 1) == 'F') { - sub_directory = "final/"; - } else if (sort.at(i + 1) == 'R') { - sub_directory = "rapid/"; - } else if (sort.at(i + 1) == 'U') { - sub_directory = "ultra_rapid/"; - } else { - std::cout << "file_sort has something wrong" << std::endl; - exit(1); - } - break; - } - } - } - - return main_directory + sub_directory; -} - -/** - *@fn ReadFileContents - *@brief Read file and convert to a vector of one line strings - *@param [in] directory_path: Directory path of the file - *@param [in] file_name: File name - *@param [out] storage: vector of one line strings - */ -void ReadFileContents(std::string directory_path, std::string file_name, std::vector& storage) { - std::string all_file_path = directory_path + file_name; - std::ifstream ifs(all_file_path); - - if (!ifs.is_open()) { - std::cout << "in " << directory_path << "gnss file: " << file_name << " not found" << std::endl; - exit(1); - } - std::string str; - while (std::getline(ifs, str)) { - storage.push_back(str); - } - ifs.close(); - if (storage.back() == "EOF") storage.pop_back(); - - return; -} - -/** - *@fn ReadSp3Files - *@brief Read multiple SP3 files in the directory and generate multiple vectors of one line strings - *@param [in] directory_path: Directory path of the file - *@param [in] file_sort: File type - *@param [in] first: The first SP3 file name - *@param [in] last: The last SP3 file name - *@param [out] file_contents: Generated files as multiple vectors of one line strings - *@param [out] ur_flag: Ultra rapid flag - */ -void ReadSp3Files(std::string directory_path, std::string file_sort, std::string first, std::string last, - std::vector>& file_contents, UltraRapidMode& ur_flag) { - std::string all_directory_path = directory_path + ReturnDirectoryPathWithFileType(file_sort); - ur_flag = kNotUse; - - if (first.substr(0, 3) == "COD") { - std::string file_header = "COD0MGXFIN_"; - std::string file_footer = "0000_01D_05M_ORB.SP3"; - int year = stoi(first.substr(file_header.size(), 4)); - int year_last_day = 365 + (year % 4 == 0) - (year % 100 == 0) + (year % 400 == 0); - int day = stoi(first.substr(file_header.size() + 4, 3)); - - file_contents.clear(); - - while (true) { - if (day > year_last_day) { - ++year; - year_last_day = 365 + (year % 4 == 0) - (year % 100 == 0) + (year % 400 == 0); - day = 1; - } - std::string s_day; - if (day >= 100) - s_day = std::to_string(day); - else if (day >= 10) - s_day = '0' + std::to_string(day); - else - s_day = "00" + std::to_string(day); - std::string file_name = file_header + std::to_string(year) + s_day + file_footer; - file_contents.push_back(std::vector()); - - ReadFileContents(all_directory_path, file_name, file_contents.back()); - - if (file_name == last) break; - ++day; - } - } else if (file_sort.substr(0, 3) == "IGU" || file_sort.find("Ultra") != std::string::npos) { // In case of UR - ur_flag = kUnknown; - std::string file_header, file_footer; - int gps_week = 0, day = 0; - int hour = 0; - for (int i = 0; i < (int)first.size(); ++i) { - int n = first.at(i); - // Looking for the number of file name - if ((int)'0' <= n && n < (int)('0' + 10)) { - file_header = first.substr(0, i); - gps_week = stoi(first.substr(file_header.size(), 4)); - day = stoi(first.substr(file_header.size() + 4, 1)); - hour = stoi(first.substr(file_header.size() + 6, 2)); - file_footer = first.substr(file_header.size() + 8); - break; - } - } - - file_contents.clear(); - - while (true) { - if (hour == 24) { - hour = 0; - ++day; - } - if (day == 7) { - ++gps_week; - day = 0; - } - std::string file_name = file_header + std::to_string(gps_week) + std::to_string(day) + "_"; - if (hour < 10) { - file_name += "0"; - } - file_name += std::to_string(hour) + file_footer; - file_contents.push_back(std::vector()); - - ReadFileContents(all_directory_path, file_name, file_contents.back()); - - if (file_name == last) break; - hour += 6; - } - } else { - std::string file_header, file_footer; - int gps_week = 0, day = 0; - for (int i = 0; i < (int)first.size(); ++i) { - int n = first.at(i); - // Looking for the number of file name - if ((int)'0' <= n && n < (int)('0' + 10)) { - file_header = first.substr(0, i); - gps_week = stoi(first.substr(file_header.size(), 4)); - day = stoi(first.substr(file_header.size() + 4, 1)); - file_footer = first.substr(file_header.size() + 5); - break; - } - } - - file_contents.clear(); - - while (true) { - if (day == 7) { - ++gps_week; - day = 0; - } - std::string file_name = file_header + std::to_string(gps_week) + std::to_string(day) + file_footer; - file_contents.push_back(std::vector()); - - ReadFileContents(all_directory_path, file_name, file_contents.back()); - - if (file_name == last) break; - ++day; - } - } - - return; -} - -/** - *@fn ReadClockFiles - *@brief Read multiple SP3 files in the directory and generate multiple vectors of one line strings - *@param [in] directory_path: Directory path of the file - *@param [in] extension: Extensions of the file - *@param [in] file_sort: File type - *@param [in] first: The first SP3 file name - *@param [in] last: The last SP3 file name - *@param [out] file_contents: Generated files as multiple vectors of one line strings - */ -void ReadClockFiles(std::string directory_path, std::string extension, std::string file_sort, std::string first, std::string last, - std::vector>& file_contents) { - std::string all_directory_path = directory_path + ReturnDirectoryPathWithFileType(file_sort) + extension.substr(1) + '/'; - - if (file_sort.find("Ultra") != std::string::npos) { - std::string file_header, file_footer; - int gps_week = 0, day = 0; - int hour = 0; - for (int i = 0; i < (int)first.size(); ++i) { - int n = first.at(i); - // Looking for the number of file name - if ((int)'0' <= n && n < (int)('0' + 10)) { - file_header = first.substr(0, i); - gps_week = stoi(first.substr(file_header.size(), 4)); - day = stoi(first.substr(file_header.size() + 4, 1)); - hour = stoi(first.substr(file_header.size() + 6, 2)); - file_footer = first.substr(file_header.size() + 8); - break; - } - } - - file_contents.clear(); - - while (true) { - if (hour == 24) { - hour = 0; - ++day; - } - if (day == 7) { - ++gps_week; - day = 0; - } - std::string file_name = file_header + std::to_string(gps_week) + std::to_string(day) + "_"; - if (hour < 10) { - file_name += "0"; - } - file_name += std::to_string(hour) + file_footer; - file_contents.push_back(std::vector()); - - ReadFileContents(all_directory_path, file_name, file_contents.back()); - - if (file_name == last) break; - hour += 6; - } - } else { - std::string file_header, file_footer; - int gps_week = 0, day = 0; - for (int i = 0; i < (int)first.size(); ++i) { - int n = first.at(i); - // Looking for the number of file name - if ((int)'0' <= n && n < (int)('0' + 10)) { - file_header = first.substr(0, i); - gps_week = stoi(first.substr(file_header.size(), 4)); - day = stoi(first.substr(file_header.size() + 4, 1)); - file_footer = first.substr(file_header.size() + 5); - break; - } - } - - file_contents.clear(); - - while (true) { - if (day == 7) { - ++gps_week; - day = 0; - } - std::string file_name = file_header + std::to_string(gps_week) + std::to_string(day) + file_footer; - file_contents.push_back(std::vector()); - - ReadFileContents(all_directory_path, file_name, file_contents.back()); - - if (file_name == last) break; - ++day; - } - } - - return; -} - -GnssSatellites* InitGnssSatellites(std::string file_name) { - IniAccess ini_file(file_name); - char section[] = "GNSS_SATELLITES"; - GnssSatellites* gnss_satellites = new GnssSatellites(ini_file.ReadEnable(section, "calculation")); - if (!gnss_satellites->IsCalcEnabled()) { - return gnss_satellites; - } - - std::string directory_path = ini_file.ReadString(section, "directory_path"); - - // True position - std::vector> true_position_file; - UltraRapidMode true_position_ur_flag = kNotUse; - ReadSp3Files(directory_path, ini_file.ReadString(section, "true_position_file_sort"), ini_file.ReadString(section, "true_position_first"), - ini_file.ReadString(section, "true_position_last"), true_position_file, true_position_ur_flag); - int true_position_interpolation_method = ini_file.ReadInt(section, "true_position_interpolation_method"); - int true_position_interpolation_number = ini_file.ReadInt(section, "true_position_interpolation_number"); - - // True clock - std::vector> true_clock_file; - UltraRapidMode true_clock_ur_flag = kNotUse; - std::string true_clock_file_extension = ini_file.ReadString(section, "true_clock_file_extension"); - if (true_clock_file_extension == ".sp3") { - ReadSp3Files(directory_path, ini_file.ReadString(section, "true_clock_file_sort"), ini_file.ReadString(section, "true_clock_first"), - ini_file.ReadString(section, "true_clock_last"), true_clock_file, true_clock_ur_flag); - } else { - ReadClockFiles(directory_path, true_clock_file_extension, ini_file.ReadString(section, "true_clock_file_sort"), - ini_file.ReadString(section, "true_clock_first"), ini_file.ReadString(section, "true_clock_last"), true_clock_file); - } - int true_clock_interpolation_number = ini_file.ReadInt(section, "true_clock_interpolation_number"); - - // Estimated position - std::vector> estimate_position_file; - UltraRapidMode estimate_position_ur_flag = kNotUse; - ReadSp3Files(directory_path, ini_file.ReadString(section, "estimate_position_file_sort"), ini_file.ReadString(section, "estimate_position_first"), - ini_file.ReadString(section, "estimate_position_last"), estimate_position_file, estimate_position_ur_flag); - int estimate_position_interpolation_method = ini_file.ReadInt(section, "estimate_position_interpolation_method"); - int estimate_position_interpolation_number = ini_file.ReadInt(section, "estimate_position_interpolation_number"); - if (estimate_position_ur_flag != kNotUse) { - std::string ur_flag = ini_file.ReadString(section, "estimate_ur_observe_or_predict"); - if (ur_flag.find("observe") != std::string::npos) { - estimate_position_ur_flag = (UltraRapidMode)((int)kObserve1 + (ur_flag.back() - '1')); - } else { - estimate_position_ur_flag = (UltraRapidMode)((int)kPredict1 + (ur_flag.back() - '1')); - } - } - - // Estimated clock - std::vector> estimate_clock_file; - UltraRapidMode estimate_clock_ur_flag = estimate_position_ur_flag; - std::string estimate_clock_file_extension = ini_file.ReadString(section, "estimate_clock_file_extension"); - if (estimate_clock_file_extension == ".sp3") { - ReadSp3Files(directory_path, ini_file.ReadString(section, "estimate_clock_file_sort"), ini_file.ReadString(section, "estimate_clock_first"), - ini_file.ReadString(section, "estimate_clock_last"), estimate_clock_file, estimate_clock_ur_flag); - } else { - ReadClockFiles(directory_path, estimate_clock_file_extension, ini_file.ReadString(section, "estimate_clock_file_sort"), - ini_file.ReadString(section, "estimate_clock_first"), ini_file.ReadString(section, "estimate_clock_last"), estimate_clock_file); - } - int estimate_clock_interpolation_number = ini_file.ReadInt(section, "estimate_clock_interpolation_number"); - - // Initialize GNSS satellites - gnss_satellites->Initialize(true_position_file, true_position_interpolation_method, true_position_interpolation_number, true_position_ur_flag, - true_clock_file, true_clock_file_extension, true_clock_interpolation_number, true_clock_ur_flag, estimate_position_file, - estimate_position_interpolation_method, estimate_position_interpolation_number, estimate_position_ur_flag, - estimate_clock_file, estimate_clock_file_extension, estimate_clock_interpolation_number, estimate_clock_ur_flag); - - return gnss_satellites; -} diff --git a/src/environment/global/initialize_gnss_satellites.hpp b/src/environment/global/initialize_gnss_satellites.hpp deleted file mode 100644 index ca55e995d..000000000 --- a/src/environment/global/initialize_gnss_satellites.hpp +++ /dev/null @@ -1,18 +0,0 @@ -/** - *@file initialize_gnss_satellites.hpp - *@brief Initialize functions for GnssSatellites class - */ - -#ifndef S2E_ENVIRONMENT_GLOBAL_INITIALIZE_GNSS_SATELLITES_HPP_ -#define S2E_ENVIRONMENT_GLOBAL_INITIALIZE_GNSS_SATELLITES_HPP_ - -#include - -/** - *@fn InitGnssSatellites - *@brief Initialize function for GnssSatellites class - *@param [in] file_name: Path to the initialize function - */ -GnssSatellites* InitGnssSatellites(std::string file_name); - -#endif // S2E_ENVIRONMENT_GLOBAL_INITIALIZE_GNSS_SATELLITES_HPP_ diff --git a/src/environment/global/moon_rotation.cpp b/src/environment/global/moon_rotation.cpp index 75ede8b33..c2b107b63 100644 --- a/src/environment/global/moon_rotation.cpp +++ b/src/environment/global/moon_rotation.cpp @@ -7,19 +7,21 @@ #include -#include -#include +#include +#include + +namespace s2e::environment { MoonRotation::MoonRotation(const CelestialInformation& celestial_information, MoonRotationMode mode) : mode_(mode), celestial_information_(celestial_information) { - dcm_j2000_to_mcmf_ = libra::MakeIdentityMatrix<3>(); + dcm_j2000_to_mcmf_ = math::MakeIdentityMatrix<3>(); } void MoonRotation::Update(const SimulationTime& simulation_time) { if (mode_ == MoonRotationMode::kSimple) { - libra::Vector<3> moon_position_eci_m = celestial_information_.GetPositionFromSelectedBody_i_m("MOON", "EARTH"); - libra::Vector<3> moon_velocity_eci_m_s = celestial_information_.GetVelocityFromSelectedBody_i_m_s("MOON", "EARTH"); - dcm_j2000_to_mcmf_ = CalcDcmEciToPrincipalAxis(moon_position_eci_m, moon_velocity_eci_m_s); + math::Vector<3> moon_position_eci_m = celestial_information_.GetPositionFromSelectedBody_i_m("MOON", "EARTH"); + math::Vector<3> moon_velocity_eci_m_s = celestial_information_.GetVelocityFromSelectedBody_i_m_s("MOON", "EARTH"); + dcm_j2000_to_mcmf_ = planet_rotation::CalcDcmEciToPrincipalAxis(moon_position_eci_m, moon_velocity_eci_m_s); } else if (mode_ == MoonRotationMode::kIauMoon) { ConstSpiceChar from[] = "J2000"; ConstSpiceChar to[] = "IAU_MOON"; @@ -32,7 +34,7 @@ void MoonRotation::Update(const SimulationTime& simulation_time) { } } } else { - dcm_j2000_to_mcmf_ = libra::MakeIdentityMatrix<3>(); + dcm_j2000_to_mcmf_ = math::MakeIdentityMatrix<3>(); } } @@ -50,4 +52,6 @@ MoonRotationMode ConvertMoonRotationMode(const std::string mode) { } return rotation_mode; -} \ No newline at end of file +} + +} // namespace s2e::environment diff --git a/src/environment/global/moon_rotation.hpp b/src/environment/global/moon_rotation.hpp index 74d8eb64e..1c5ea0d68 100644 --- a/src/environment/global/moon_rotation.hpp +++ b/src/environment/global/moon_rotation.hpp @@ -7,10 +7,12 @@ #define S2E_ENVIRONMENT_GLOBAL_MOON_ROTATION_HPP_ #include "celestial_information.hpp" -#include "library/math/matrix.hpp" -#include "library/math/vector.hpp" +#include "math_physics/math/matrix.hpp" +#include "math_physics/math/vector.hpp" #include "simulation_time.hpp" +namespace s2e::environment { + class CelestialInformation; /** @@ -53,13 +55,15 @@ class MoonRotation { * @brief Return the DCM between J2000 inertial frame and the Moon Centered Moon Fixed frame * @note Because this is just a DCM, users need to consider the origin of the vector, which you want to convert with this matrix. */ - inline const libra::Matrix<3, 3> GetDcmJ2000ToMcmf() const { return dcm_j2000_to_mcmf_; }; + inline const math::Matrix<3, 3> GetDcmJ2000ToMcmf() const { return dcm_j2000_to_mcmf_; }; private: - MoonRotationMode mode_; //!< Rotation mode - libra::Matrix<3, 3> dcm_j2000_to_mcmf_; //!< Direction Cosine Matrix J2000 to MCMF (Moon Centered Moon Fixed) + MoonRotationMode mode_; //!< Rotation mode + math::Matrix<3, 3> dcm_j2000_to_mcmf_; //!< Direction Cosine Matrix J2000 to MCMF (Moon Centered Moon Fixed) const CelestialInformation &celestial_information_; //!< Celestial Information to get moon orbit }; +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_MOON_ROTATION_HPP_ diff --git a/src/environment/global/physical_constants.hpp b/src/environment/global/physical_constants.hpp index c2acd7de0..c97259ee2 100644 --- a/src/environment/global/physical_constants.hpp +++ b/src/environment/global/physical_constants.hpp @@ -8,7 +8,7 @@ #include // std::is_floating_point_v -namespace environment { +namespace s2e::environment { template using enable_if_float = std::enable_if_t, T>; @@ -39,9 +39,9 @@ DEFINE_PHYSICAL_CONSTANT(earth_flattening, 3.352797e-3L) / #undef DEFINE_PHYSICAL_CONSTANT -} // namespace environment +inline double degC2K(double degC) { return (degC - absolute_zero_degC); } +inline double K2degC(double K) { return (K + absolute_zero_degC); } -inline double degC2K(double degC) { return (degC - environment::absolute_zero_degC); } -inline double K2degC(double K) { return (K + environment::absolute_zero_degC); } +} // namespace s2e::environment #endif // S2E_ENVIRONMENT_GLOBAL_PHYSICAL_CONSTANT_HPP_ diff --git a/src/environment/global/simulation_time.cpp b/src/environment/global/simulation_time.cpp index 5872ad1c1..6438e5011 100644 --- a/src/environment/global/simulation_time.cpp +++ b/src/environment/global/simulation_time.cpp @@ -12,7 +12,7 @@ #include #include -#include "library/initialize/initialize_file_access.hpp" +#include "setting_file_reader/initialize_file_access.hpp" #ifdef WIN32 #include #else @@ -21,6 +21,8 @@ using namespace std; +namespace s2e::environment { + SimulationTime::SimulationTime(const double end_sec, const double step_sec, const double attitude_update_interval_sec, const double attitude_rk_step_sec, const double orbit_update_interval_sec, const double orbit_rk_step_sec, const double thermal_update_interval_sec, const double thermal_rk_step_sec, const double compo_propagate_step_sec, @@ -202,8 +204,8 @@ void SimulationTime::PrintStartDateTime(void) const { string SimulationTime::GetLogHeader() const { string str_tmp = ""; - str_tmp += WriteScalar("elapsed_time", "s"); - str_tmp += WriteScalar("time", "UTC"); + str_tmp += logger::WriteScalar("elapsed_time", "s"); + str_tmp += logger::WriteScalar("time", "UTC"); return str_tmp; } @@ -211,7 +213,7 @@ string SimulationTime::GetLogHeader() const { string SimulationTime::GetLogValue() const { string str_tmp = ""; - str_tmp += WriteScalar(elapsed_time_sec_); + str_tmp += logger::WriteScalar(elapsed_time_sec_); const char kSize = 100; char ymdhms[kSize]; @@ -245,7 +247,7 @@ void SimulationTime::ConvJDtoCalendarDay(const double JD) { } SimulationTime* InitSimulationTime(std::string file_name) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); const char* section = "TIME"; // Parameters about entire simulation @@ -275,3 +277,5 @@ SimulationTime* InitSimulationTime(std::string file_name) { return simTime; } + +} // namespace s2e::environment diff --git a/src/environment/global/simulation_time.hpp b/src/environment/global/simulation_time.hpp index 26c407c7b..7a2093c19 100644 --- a/src/environment/global/simulation_time.hpp +++ b/src/environment/global/simulation_time.hpp @@ -14,10 +14,12 @@ // #include #include -#include "library/external/sgp4/sgp4ext.h" -#include "library/external/sgp4/sgp4io.h" -#include "library/external/sgp4/sgp4unit.h" -#include "library/logger/loggable.hpp" +#include "logger/loggable.hpp" +#include "math_physics/orbit/sgp4/sgp4ext.h" +#include "math_physics/orbit/sgp4/sgp4io.h" +#include "math_physics/orbit/sgp4/sgp4unit.h" + +namespace s2e::environment { /** *@struct TimeState @@ -47,7 +49,7 @@ struct UTC { *@class SimulationTime *@brief Class to manage simulation time related information */ -class SimulationTime : public ILoggable { +class SimulationTime : public logger::ILoggable { public: /** *@fn SimulationTime @@ -239,15 +241,15 @@ class SimulationTime : public ILoggable { */ inline double GetStartSecond(void) const { return start_sec_; }; - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -334,4 +336,6 @@ class SimulationTime : public ILoggable { */ SimulationTime* InitSimulationTime(std::string file_name); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_GLOBAL_SIMULATION_TIME_HPP_ diff --git a/src/environment/local/CMakeLists.txt b/src/environment/local/CMakeLists.txt index e5865f783..b9943f9d0 100644 --- a/src/environment/local/CMakeLists.txt +++ b/src/environment/local/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(${PROJECT_NAME} STATIC local_environment.cpp geomagnetic_field.cpp solar_radiation_pressure_environment.cpp + earth_albedo.cpp local_celestial_information.cpp ) diff --git a/src/environment/local/atmosphere.cpp b/src/environment/local/atmosphere.cpp index 5d57621af..74b232364 100644 --- a/src/environment/local/atmosphere.cpp +++ b/src/environment/local/atmosphere.cpp @@ -5,14 +5,16 @@ #include "atmosphere.hpp" -#include "library/atmosphere/harris_priester_model.hpp" -#include "library/atmosphere/simple_air_density_model.hpp" -#include "library/initialize/initialize_file_access.hpp" -#include "library/logger/log_utility.hpp" -#include "library/math/vector.hpp" -#include "library/randomization/global_randomization.hpp" -#include "library/randomization/normal_randomization.hpp" -#include "library/randomization/random_walk.hpp" +#include "logger/log_utility.hpp" +#include "math_physics/atmosphere/harris_priester_model.hpp" +#include "math_physics/atmosphere/simple_air_density_model.hpp" +#include "math_physics/math/vector.hpp" +#include "math_physics/randomization/global_randomization.hpp" +#include "math_physics/randomization/normal_randomization.hpp" +#include "math_physics/randomization/random_walk.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { Atmosphere::Atmosphere(const std::string model, const std::string space_weather_file_name, const double gauss_standard_deviation_rate, const bool is_manual_param, const double manual_f107, const double manual_f107a, const double manual_ap, @@ -50,13 +52,13 @@ Atmosphere::Atmosphere(const std::string model, const std::string space_weather_ } } -double Atmosphere::CalcAirDensity_kg_m3(const double decimal_year, const Orbit& orbit) { +double Atmosphere::CalcAirDensity_kg_m3(const double decimal_year, const dynamics::orbit::Orbit& orbit) { if (!is_calc_enabled_) return 0; if (model_ == "STANDARD") { // Standard model double altitude_m = orbit.GetGeodeticPosition().GetAltitude_m(); - air_density_kg_m3_ = libra::atmosphere::CalcAirDensityWithSimpleModel(altitude_m); + air_density_kg_m3_ = atmosphere::CalcAirDensityWithSimpleModel(altitude_m); } else if (model_ == "NRLMSISE00") { // NRLMSISE00 model double lat_rad = orbit.GetGeodeticPosition().GetLatitude_rad(); @@ -66,8 +68,8 @@ double Atmosphere::CalcAirDensity_kg_m3(const double decimal_year, const Orbit& manual_average_f107_, manual_ap_); } else if (model_ == "HARRIS_PRIESTER") { // Harris-Priester - libra::Vector<3> sun_direction_eci = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("SUN").CalcNormalizedVector(); - air_density_kg_m3_ = libra::atmosphere::CalcAirDensityWithHarrisPriester_kg_m3(orbit.GetGeodeticPosition(), sun_direction_eci); + math::Vector<3> sun_direction_eci = local_celestial_information_->GetGlobalInformation().GetPositionFromCenter_i_m("SUN").CalcNormalizedVector(); + air_density_kg_m3_ = atmosphere::CalcAirDensityWithHarrisPriester_kg_m3(orbit.GetGeodeticPosition(), sun_direction_eci); } else { // No suitable model return air_density_kg_m3_ = 0.0; @@ -78,7 +80,7 @@ double Atmosphere::CalcAirDensity_kg_m3(const double decimal_year, const Orbit& double Atmosphere::AddNoise(const double rho_kg_m3) { // RandomWalk rw(rho_kg_m3*rw_stepwidth_,rho_kg_m3*rw_stddev_,rho_kg_m3*rw_limit_); - libra::NormalRand nr(0.0, rho_kg_m3 * gauss_standard_deviation_rate_, global_randomization.MakeSeed()); + randomization::NormalRand nr(0.0, rho_kg_m3 * gauss_standard_deviation_rate_, randomization::global_randomization.MakeSeed()); double nrd = nr; return rho_kg_m3 + nrd; @@ -86,7 +88,7 @@ double Atmosphere::AddNoise(const double rho_kg_m3) { std::string Atmosphere::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(air_density_kg_m3_); + str_tmp += logger::WriteScalar(air_density_kg_m3_); return str_tmp; } @@ -94,14 +96,14 @@ std::string Atmosphere::GetLogValue() const { std::string Atmosphere::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteScalar("air_density_at_spacecraft_position", "kg/m3"); + str_tmp += logger::WriteScalar("air_density_at_spacecraft_position", "kg/m3"); return str_tmp; } Atmosphere InitAtmosphere(const std::string initialize_file_path, const LocalCelestialInformation* local_celestial_information, const SimulationTime* simulation_time) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "ATMOSPHERE"; double f107_threshold = 50.0; double f107_default = 150.0; @@ -133,3 +135,5 @@ Atmosphere InitAtmosphere(const std::string initialize_file_path, const LocalCel return atmosphere; } + +} // namespace s2e::environment diff --git a/src/environment/local/atmosphere.hpp b/src/environment/local/atmosphere.hpp index 5e93cd719..81dd063eb 100644 --- a/src/environment/local/atmosphere.hpp +++ b/src/environment/local/atmosphere.hpp @@ -11,15 +11,17 @@ #include "dynamics/orbit/orbit.hpp" #include "environment/global/simulation_time.hpp" #include "environment/local/local_celestial_information.hpp" -#include "library/external/nrlmsise00/wrapper_nrlmsise00.hpp" -#include "library/logger/loggable.hpp" -#include "library/math/vector.hpp" +#include "logger/loggable.hpp" +#include "math_physics/atmosphere/wrapper_nrlmsise00.hpp" +#include "math_physics/math/vector.hpp" + +namespace s2e::environment { /** * @class Atmosphere * @brief Class to calculate earth's atmospheric density */ -class Atmosphere : public ILoggable { +class Atmosphere : public logger::ILoggable { public: /** * @fn Atmosphere @@ -49,7 +51,7 @@ class Atmosphere : public ILoggable { * @param [in] position: Position of target point to calculate the air density * @return Atmospheric density [kg/m^3] */ - double CalcAirDensity_kg_m3(const double decimal_year, const Orbit& orbit); + double CalcAirDensity_kg_m3(const double decimal_year, const dynamics::orbit::Orbit& orbit); /** * @fn GetAirDensity * @brief Return Atmospheric density [kg/m^3] @@ -61,15 +63,15 @@ class Atmosphere : public ILoggable { */ inline void SetCalcFlag(const bool is_calc_enabled) { is_calc_enabled_ = is_calc_enabled; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -80,8 +82,8 @@ class Atmosphere : public ILoggable { double air_density_kg_m3_; //!< Atmospheric density [kg/m^3] // NRLMSISE-00 model information - std::vector space_weather_table_; //!< Space weather table - bool is_manual_param_used_; //!< Flag to use manual parameters + std::vector space_weather_table_; //!< Space weather table + bool is_manual_param_used_; //!< Flag to use manual parameters // Reference of the following setting parameters https://www.swpc.noaa.gov/phenomena/f107-cm-radio-emissions double manual_daily_f107_; //!< Manual daily f10.7 value double manual_average_f107_; //!< Manual 3-month averaged f10.7 value @@ -116,4 +118,6 @@ class Atmosphere : public ILoggable { Atmosphere InitAtmosphere(const std::string initialize_file_path, const LocalCelestialInformation* local_celestial_information, const SimulationTime* simulation_time); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_LOCAL_ATMOSPHERE_HPP_ diff --git a/src/environment/local/earth_albedo.cpp b/src/environment/local/earth_albedo.cpp new file mode 100644 index 000000000..2e1ab6902 --- /dev/null +++ b/src/environment/local/earth_albedo.cpp @@ -0,0 +1,63 @@ +/** + * @file earth_albedo.cpp + * @brief Class to manage earth albedo + */ +#include "earth_albedo.hpp" + +#include +#include +#include + +#include "logger/log_utility.hpp" +#include "math_physics/math/constants.hpp" +#include "math_physics/math/vector.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { + +EarthAlbedo::EarthAlbedo(LocalCelestialInformation* local_celestial_information, SolarRadiationPressureEnvironment* srp_environment) + : local_celestial_information_(local_celestial_information), srp_environment_(srp_environment) {} + +void EarthAlbedo::UpdateAllStates() { + if (!GetIsCalcEarthAlbedoEnabled()) return; + CalcEarthAlbedo(local_celestial_information_); +} + +std::string EarthAlbedo::GetLogHeader() const { + std::string str_tmp = ""; + + str_tmp += logger::WriteScalar("earth_albedo_factor"); + str_tmp += logger::WriteScalar("earth_albedo_W_m2"); + + return str_tmp; +} + +std::string EarthAlbedo::GetLogValue() const { + std::string str_tmp = ""; + + str_tmp += logger::WriteScalar(earth_albedo_factor_); + str_tmp += logger::WriteScalar(earth_albedo_W_m2_); + + return str_tmp; +} + +void EarthAlbedo::CalcEarthAlbedo(const LocalCelestialInformation* local_celestial_information) { + math::Vector<3> earth_position_b_m = local_celestial_information->GetPositionFromSpacecraft_b_m("EARTH"); + double earth_distance_m = earth_position_b_m.CalcNorm(); + earth_albedo_W_m2_ = srp_environment_->GetPowerDensity_W_m2() * GetEarthAlbedoFactor() * + pow((environment::astronomy::earth_equatorial_radius_m / earth_distance_m), 2.0) / 4.0; +} + +EarthAlbedo InitEarthAlbedo(std::string initialize_file_path, LocalCelestialInformation* local_celestial_information, + SolarRadiationPressureEnvironment* srp_environment) { + auto conf = setting_file_reader::IniAccess(initialize_file_path); + const char* section = "EARTH_ALBEDO"; + + EarthAlbedo earth_albedo(local_celestial_information, srp_environment); + earth_albedo.SetIsCalcEarthAlbedoEnabled(conf.ReadEnable(section, INI_CALC_LABEL)); + earth_albedo.SetEarthAlbedoFactor(conf.ReadDouble(section, "earth_albedo_factor")); + + return earth_albedo; +} + +} // namespace s2e::environment diff --git a/src/environment/local/earth_albedo.hpp b/src/environment/local/earth_albedo.hpp new file mode 100644 index 000000000..8fbd6521b --- /dev/null +++ b/src/environment/local/earth_albedo.hpp @@ -0,0 +1,109 @@ +/** + * @file earth_albedo.hpp + * @brief Class to manage earth albedo + */ + +#ifndef S2E_ENVIRONMENT_LOCAL_EARTH_ALBEDO_HPP_ +#define S2E_ENVIRONMENT_LOCAL_EARTH_ALBEDO_HPP_ + +#include "environment/global/physical_constants.hpp" +#include "environment/local/local_celestial_information.hpp" +#include "solar_radiation_pressure_environment.hpp" + +namespace s2e::environment { + +/** + * @class EarthAlbedo + * @brief Class to calculate Solar Radiation Pressure + */ +class EarthAlbedo : public logger::ILoggable { + public: + /** + * @fn EarthAlbedo + * @brief Constructor + * @param [in] local_celestial_information: Local celestial information + */ + EarthAlbedo(LocalCelestialInformation* local_celestial_information, SolarRadiationPressureEnvironment* srp_environment); + + /** + * @fn ~EarthAlbedo + * @brief Destructor + */ + virtual ~EarthAlbedo() {} + + /** + * @fn UpdateAllStates + * @brief Update earth albedo + */ + void UpdateAllStates(); + + // Getter + /** + * @fn GetEarthAlbedoFactor + * @brief Return earth albedo factor + */ + inline double GetEarthAlbedoFactor() const { return earth_albedo_factor_; } + /** + * @fn GetPowerDensity_W_m2 + * @brief Calculate and return earth albedo [W/m^2] + */ + inline double GetEarthAlbedoRadiationPower_W_m2() const { return earth_albedo_W_m2_; } + /** + * @fn GetIsEclipsed + * @brief Returns true if the shadow function is less than 1 + */ + inline bool GetIsCalcEarthAlbedoEnabled() const { return is_calc_earth_albedo_enabled_; } + + // Setter + /** + * @fn SetEarthAlbedoFactor + * @brief Set earth albedo factor + * @param [in] earth_albedo_factor: Earth albedo factor + */ + inline void SetEarthAlbedoFactor(const double earth_albedo_factor) { earth_albedo_factor_ = earth_albedo_factor; } + /** + * @fn SetIsCalcEarthAlbedoEnabled + * @brief Set calculation flag + * @param [in] is_calc_earth_albedo_enabled: Calculation flag + */ + inline void SetIsCalcEarthAlbedoEnabled(const bool is_calc_earth_albedo_enabled) { is_calc_earth_albedo_enabled_ = is_calc_earth_albedo_enabled; } + + private: + double earth_albedo_W_m2_ = 0.0; //!< Earth albedo [W/m^2] + bool is_calc_earth_albedo_enabled_ = false; //!< Calculation flag + double earth_albedo_factor_ = 0.3; //!< Earth albedo factor + + LocalCelestialInformation* local_celestial_information_; //!< Local celestial information + SolarRadiationPressureEnvironment* srp_environment_; //!< Solar radiation pressure environment + + // Override logger::ILoggable + /** + * @fn GetLogHeader + * @brief Override GetLogHeader function of logger::ILoggable + */ + virtual std::string GetLogHeader() const; + /** + * @fn GetLogValue + * @brief Override GetLogValue function of logger::ILoggable + */ + virtual std::string GetLogValue() const; + + /** + * @fn CalcEarthAlbedo + * @brief Calculate earth albedo + * @param [in] local_celestial_information: Local celestial information + */ + void CalcEarthAlbedo(const LocalCelestialInformation* local_celestial_information); +}; + +/** + * @fn InitEarthAlbedo + * @brief Initialize solar radiation pressure + * @param [in] initialize_file_path: Path to initialize file + */ +EarthAlbedo InitEarthAlbedo(std::string initialize_file_path, LocalCelestialInformation* local_celestial_information, + SolarRadiationPressureEnvironment* srp_environment); + +} // namespace s2e::environment + +#endif // S2E_ENVIRONMENT_LOCAL_EARTH_ALBEDO_HPP_ diff --git a/src/environment/local/geomagnetic_field.cpp b/src/environment/local/geomagnetic_field.cpp index e45e04c69..8fff876a9 100644 --- a/src/environment/local/geomagnetic_field.cpp +++ b/src/environment/local/geomagnetic_field.cpp @@ -5,11 +5,13 @@ #include "geomagnetic_field.hpp" -#include "library/external/igrf/igrf.h" -#include "library/initialize/initialize_file_access.hpp" -#include "library/randomization/global_randomization.hpp" -#include "library/randomization/normal_randomization.hpp" -#include "library/randomization/random_walk.hpp" +#include "math_physics/geomagnetic/igrf.h" +#include "math_physics/randomization/global_randomization.hpp" +#include "math_physics/randomization/normal_randomization.hpp" +#include "math_physics/randomization/random_walk.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { GeomagneticField::GeomagneticField(const std::string igrf_file_name, const double random_walk_srandard_deviation_nT, const double random_walk_limit_nT, const double white_noise_standard_deviation_nT) @@ -22,8 +24,8 @@ GeomagneticField::GeomagneticField(const std::string igrf_file_name, const doubl set_file_path(igrf_file_name_.c_str()); } -void GeomagneticField::CalcMagneticField(const double decimal_year, const double sidereal_day, const GeodeticPosition position, - const libra::Quaternion quaternion_i2b) { +void GeomagneticField::CalcMagneticField(const double decimal_year, const double sidereal_day, const geodesy::GeodeticPosition position, + const math::Quaternion quaternion_i2b) { if (!IsCalcEnabled) return; const double lat_rad = position.GetLatitude_rad(); @@ -40,11 +42,11 @@ void GeomagneticField::CalcMagneticField(const double decimal_year, const double } void GeomagneticField::AddNoise(double* magnetic_field_array_i_nT) { - static libra::Vector<3> standard_deviation(random_walk_standard_deviation_nT_); - static libra::Vector<3> limit(random_walk_limit_nT_); - static RandomWalk<3> random_walk(0.1, standard_deviation, limit); + static math::Vector<3> standard_deviation(random_walk_standard_deviation_nT_); + static math::Vector<3> limit(random_walk_limit_nT_); + static randomization::RandomWalk<3> random_walk(0.1, standard_deviation, limit); - static libra::NormalRand white_noise(0.0, white_noise_standard_deviation_nT_, global_randomization.MakeSeed()); + static randomization::NormalRand white_noise(0.0, white_noise_standard_deviation_nT_, randomization::global_randomization.MakeSeed()); for (int i = 0; i < 3; ++i) { magnetic_field_array_i_nT[i] += random_walk[i] + white_noise; @@ -55,8 +57,8 @@ void GeomagneticField::AddNoise(double* magnetic_field_array_i_nT) { std::string GeomagneticField::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteVector("geomagnetic_field_at_spacecraft_position", "i", "nT", 3); - str_tmp += WriteVector("geomagnetic_field_at_spacecraft_position", "b", "nT", 3); + str_tmp += logger::WriteVector("geomagnetic_field_at_spacecraft_position", "i", "nT", 3); + str_tmp += logger::WriteVector("geomagnetic_field_at_spacecraft_position", "b", "nT", 3); return str_tmp; } @@ -64,14 +66,14 @@ std::string GeomagneticField::GetLogHeader() const { std::string GeomagneticField::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteVector(magnetic_field_i_nT_); - str_tmp += WriteVector(magnetic_field_b_nT_); + str_tmp += logger::WriteVector(magnetic_field_i_nT_); + str_tmp += logger::WriteVector(magnetic_field_b_nT_); return str_tmp; } GeomagneticField InitGeomagneticField(std::string initialize_file_path) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "MAGNETIC_FIELD_ENVIRONMENT"; std::string fname = conf.ReadString(section, "coefficient_file"); @@ -85,3 +87,5 @@ GeomagneticField InitGeomagneticField(std::string initialize_file_path) { return geomagnetic_field; } + +} // namespace s2e::environment diff --git a/src/environment/local/geomagnetic_field.hpp b/src/environment/local/geomagnetic_field.hpp index 64adc5c27..1f38c03c6 100644 --- a/src/environment/local/geomagnetic_field.hpp +++ b/src/environment/local/geomagnetic_field.hpp @@ -6,16 +6,18 @@ #ifndef S2E_ENVIRONMENT_LOCAL_GEOMAGNETIC_FIELD_HPP_ #define S2E_ENVIRONMENT_LOCAL_GEOMAGNETIC_FIELD_HPP_ -#include "library/geodesy/geodetic_position.hpp" -#include "library/logger/loggable.hpp" -#include "library/math/quaternion.hpp" -#include "library/math/vector.hpp" +#include "logger/loggable.hpp" +#include "math_physics/geodesy/geodetic_position.hpp" +#include "math_physics/math/quaternion.hpp" +#include "math_physics/math/vector.hpp" + +namespace s2e::environment { /** * @class GeomagneticField * @brief Class to calculate magnetic field of the earth */ -class GeomagneticField : public ILoggable { +class GeomagneticField : public logger::ILoggable { public: bool IsCalcEnabled = true; //!< Calculation flag @@ -43,35 +45,35 @@ class GeomagneticField : public ILoggable { * @param [in] position: Position of target point to calculate the magnetic field * @param [in] quaternion_i2b: Spacecraft attitude quaternion from the inertial frame to the body fixed frame */ - void CalcMagneticField(const double decimal_year, const double sidereal_day, const GeodeticPosition position, - const libra::Quaternion quaternion_i2b); + void CalcMagneticField(const double decimal_year, const double sidereal_day, const geodesy::GeodeticPosition position, + const math::Quaternion quaternion_i2b); /** * @fn GetGeomagneticField_i_nT * @brief Return magnetic field vector in the inertial frame [nT] */ - inline libra::Vector<3> GetGeomagneticField_i_nT() const { return magnetic_field_i_nT_; } + inline math::Vector<3> GetGeomagneticField_i_nT() const { return magnetic_field_i_nT_; } /** * @fn GetGeomagneticField_b_nT * @brief Return magnetic field vector in the body fixed frame [nT] */ - inline libra::Vector<3> GetGeomagneticField_b_nT() const { return magnetic_field_b_nT_; } + inline math::Vector<3> GetGeomagneticField_b_nT() const { return magnetic_field_b_nT_; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; private: - libra::Vector<3> magnetic_field_i_nT_; //!< Magnetic field vector at the inertial frame [nT] - libra::Vector<3> magnetic_field_b_nT_; //!< Magnetic field vector at the spacecraft body fixed frame [nT] + math::Vector<3> magnetic_field_i_nT_; //!< Magnetic field vector at the inertial frame [nT] + math::Vector<3> magnetic_field_b_nT_; //!< Magnetic field vector at the spacecraft body fixed frame [nT] double random_walk_standard_deviation_nT_; //!< Standard deviation of Random Walk [nT] double random_walk_limit_nT_; //!< Limit of Random Walk [nT] double white_noise_standard_deviation_nT_; //!< Standard deviation of white noise [nT] @@ -92,4 +94,6 @@ class GeomagneticField : public ILoggable { */ GeomagneticField InitGeomagneticField(std::string initialize_file_path); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_LOCAL_GEOMAGNETIC_FIELD_HPP_ diff --git a/src/environment/local/local_celestial_information.cpp b/src/environment/local/local_celestial_information.cpp index dc4737853..dab63eec9 100644 --- a/src/environment/local/local_celestial_information.cpp +++ b/src/environment/local/local_celestial_information.cpp @@ -12,7 +12,9 @@ #include #include -#include "library/logger/log_utility.hpp" +#include "logger/log_utility.hpp" + +namespace s2e::environment { LocalCelestialInformation::LocalCelestialInformation(const CelestialInformation* global_celestial_information) : global_celestial_information_(global_celestial_information) { @@ -43,11 +45,11 @@ LocalCelestialInformation::~LocalCelestialInformation() { delete[] celestial_body_velocity_from_spacecraft_b_m_s_; } -void LocalCelestialInformation::UpdateAllObjectsInformation(const libra::Vector<3> spacecraft_position_from_center_i_m, - const libra::Vector<3> spacecraft_velocity_from_center_i_m_s, - const libra::Quaternion quaternion_i2b, - const libra::Vector<3> spacecraft_angular_velocity_rad_s) { - libra::Vector<3> celestial_body_position_i_m, celestial_body_velocity_i_m_s; +void LocalCelestialInformation::UpdateAllObjectsInformation(const math::Vector<3> spacecraft_position_from_center_i_m, + const math::Vector<3> spacecraft_velocity_from_center_i_m_s, + const math::Quaternion quaternion_i2b, + const math::Vector<3> spacecraft_angular_velocity_rad_s) { + math::Vector<3> celestial_body_position_i_m, celestial_body_velocity_i_m_s; for (int i = 0; i < global_celestial_information_->GetNumberOfSelectedBodies(); i++) { celestial_body_position_i_m = global_celestial_information_->GetPositionFromCenter_i_m(i); celestial_body_velocity_i_m_s = global_celestial_information_->GetVelocityFromCenter_i_m_s(i); @@ -62,8 +64,8 @@ void LocalCelestialInformation::UpdateAllObjectsInformation(const libra::Vector< return; } -void LocalCelestialInformation::CalcAllPosVel_b(const libra::Quaternion quaternion_i2b, const libra::Vector<3> spacecraft_angular_velocity_rad_s) { - libra::Vector<3> celestial_body_position_i_m, celestial_body_velocity_i_m_s; +void LocalCelestialInformation::CalcAllPosVel_b(const math::Quaternion quaternion_i2b, const math::Vector<3> spacecraft_angular_velocity_rad_s) { + math::Vector<3> celestial_body_position_i_m, celestial_body_velocity_i_m_s; double r_buf1_i[3], velocity_buf1_i[3], r_buf1_b[3], velocity_buf1_b[3]; double r_buf2_i[3], velocity_buf2_i[3], r_buf2_b[3], velocity_buf2_b[3]; for (int i = 0; i < global_celestial_information_->GetNumberOfSelectedBodies(); i++) { @@ -89,50 +91,50 @@ void LocalCelestialInformation::CalcAllPosVel_b(const libra::Quaternion quaterni } } -void LocalCelestialInformation::ConvertInertialToBody(const double* input_i, double* output_b, libra::Quaternion quaternion_i2b) { - libra::Vector<3> temp_i; +void LocalCelestialInformation::ConvertInertialToBody(const double* input_i, double* output_b, math::Quaternion quaternion_i2b) { + math::Vector<3> temp_i; for (int i = 0; i < 3; i++) { temp_i[i] = input_i[i]; } - libra::Vector<3> temp_b = quaternion_i2b.FrameConversion(temp_i); + math::Vector<3> temp_b = quaternion_i2b.FrameConversion(temp_i); for (int i = 0; i < 3; i++) { output_b[i] = temp_b[i]; } } void LocalCelestialInformation::ConvertVelocityInertialToBody(const double* position_i, const double* velocity_i, double* velocity_b, - const libra::Quaternion quaternion_i2b, const libra::Vector<3> angular_velocity_b) { + const math::Quaternion quaternion_i2b, const math::Vector<3> angular_velocity_b) { // copy input vector - libra::Vector<3> vi; + math::Vector<3> vi; for (int i = 0; i < 3; i++) { vi[i] = velocity_i[i]; } - libra::Vector<3> ri; + math::Vector<3> ri; for (int i = 0; i < 3; i++) { ri[i] = position_i[i]; } // convert body rate vector into that in inertial coordinate - libra::Vector<3> wb; + math::Vector<3> wb; for (int i = 0; i < 3; i++) { wb[i] = angular_velocity_b[i]; } // compute cross term wxr - libra::Vector<3> wxposition_i = OuterProduct(wb, ri); + math::Vector<3> wxposition_i = OuterProduct(wb, ri); // compute dr/dt + wxr for (int i = 0; i < 3; i++) { vi[i] = vi[i] - wxposition_i[i]; } // convert vector in inertial coordinate into that in body coordinate - libra::Vector<3> temp_b = quaternion_i2b.FrameConversion(vi); + math::Vector<3> temp_b = quaternion_i2b.FrameConversion(vi); for (int i = 0; i < 3; i++) { velocity_b[i] = temp_b[i]; } } -libra::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_i_m(const char* body_name) const { - libra::Vector<3> position; +math::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_i_m(const char* body_name) const { + math::Vector<3> position; int index = 0; index = global_celestial_information_->CalcBodyIdFromName(body_name); for (int i = 0; i < 3; i++) { @@ -141,14 +143,14 @@ libra::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_i_m(const return position; } -libra::Vector<3> LocalCelestialInformation::GetCenterBodyPositionFromSpacecraft_i_m() const { +math::Vector<3> LocalCelestialInformation::GetCenterBodyPositionFromSpacecraft_i_m() const { std::string body_name = global_celestial_information_->GetCenterBodyName(); - libra::Vector<3> position = GetPositionFromSpacecraft_i_m(body_name.c_str()); + math::Vector<3> position = GetPositionFromSpacecraft_i_m(body_name.c_str()); return position; } -libra::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_b_m(const char* body_name) const { - libra::Vector<3> position; +math::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_b_m(const char* body_name) const { + math::Vector<3> position; int index = 0; index = global_celestial_information_->CalcBodyIdFromName(body_name); for (int i = 0; i < 3; i++) { @@ -157,9 +159,9 @@ libra::Vector<3> LocalCelestialInformation::GetPositionFromSpacecraft_b_m(const return position; } -libra::Vector<3> LocalCelestialInformation::GetCenterBodyPositionFromSpacecraft_b_m(void) const { +math::Vector<3> LocalCelestialInformation::GetCenterBodyPositionFromSpacecraft_b_m(void) const { std::string body_name = global_celestial_information_->GetCenterBodyName(); - libra::Vector<3> position = GetPositionFromSpacecraft_b_m(body_name.c_str()); + math::Vector<3> position = GetPositionFromSpacecraft_b_m(body_name.c_str()); return position; } @@ -179,8 +181,8 @@ std::string LocalCelestialInformation::GetLogHeader() const { std::string body_pos = name + "_position_from_spacecraft"; std::string body_vel = name + "_velocity_from_spacecraft"; - str_tmp += WriteVector(body_pos, "b", "m", 3); - str_tmp += WriteVector(body_vel, "b", "m/s", 3); + str_tmp += logger::WriteVector(body_pos, "b", "m", 3); + str_tmp += logger::WriteVector(body_vel, "b", "m/s", 3); } return str_tmp; } @@ -189,11 +191,13 @@ std::string LocalCelestialInformation::GetLogValue() const { std::string str_tmp = ""; for (int i = 0; i < global_celestial_information_->GetNumberOfSelectedBodies(); i++) { for (int j = 0; j < 3; j++) { - str_tmp += WriteScalar(celestial_body_position_from_spacecraft_b_m_[i * 3 + j]); + str_tmp += logger::WriteScalar(celestial_body_position_from_spacecraft_b_m_[i * 3 + j]); } for (int j = 0; j < 3; j++) { - str_tmp += WriteScalar(celestial_body_velocity_from_spacecraft_b_m_s_[i * 3 + j]); + str_tmp += logger::WriteScalar(celestial_body_velocity_from_spacecraft_b_m_s_[i * 3 + j]); } } return str_tmp; } + +} // namespace s2e::environment diff --git a/src/environment/local/local_celestial_information.hpp b/src/environment/local/local_celestial_information.hpp index 5d21b7da1..1d15a2ca6 100644 --- a/src/environment/local/local_celestial_information.hpp +++ b/src/environment/local/local_celestial_information.hpp @@ -8,11 +8,13 @@ #include "../global/celestial_information.hpp" +namespace s2e::environment { + /** * @class LocalCelestialInformation * @brief Class to manage celestial body information in the spacecraft body frame */ -class LocalCelestialInformation : public ILoggable { +class LocalCelestialInformation : public logger::ILoggable { public: /** * @fn LocalCelestialInformation @@ -34,33 +36,33 @@ class LocalCelestialInformation : public ILoggable { * @param [in] quaternion_i2b: Spacecraft attitude quaternion from the inertial frame to the body fixed frame * @param [in] spacecraft_angular_velocity_rad_s: Spacecraft angular velocity with respect to the inertial frame [rad/s] */ - void UpdateAllObjectsInformation(const libra::Vector<3> spacecraft_position_from_center_i_m, - const libra::Vector<3> spacecraft_velocity_from_center_i_m_s, const libra::Quaternion quaternion_i2b, - const libra::Vector<3> spacecraft_angular_velocity_rad_s); + void UpdateAllObjectsInformation(const math::Vector<3> spacecraft_position_from_center_i_m, + const math::Vector<3> spacecraft_velocity_from_center_i_m_s, const math::Quaternion quaternion_i2b, + const math::Vector<3> spacecraft_angular_velocity_rad_s); /** * @fn GetPositionFromSpacecraft_i_m * @brief Return position of a selected body (Origin: Spacecraft, Frame: Inertial frame) * @param [in] body_name Celestial body name */ - libra::Vector<3> GetPositionFromSpacecraft_i_m(const char* body_name) const; + math::Vector<3> GetPositionFromSpacecraft_i_m(const char* body_name) const; /** * @fn GetCenterBodyPositionFromSpacecraft_i_m * @brief Return position of the center body (Origin: Spacecraft, Frame: Inertial frame) */ - libra::Vector<3> GetCenterBodyPositionFromSpacecraft_i_m(void) const; + math::Vector<3> GetCenterBodyPositionFromSpacecraft_i_m(void) const; /** * @fn GetPositionFromSpacecraft_b_m * @brief Return position of a selected body (Origin: Spacecraft, Frame: Body fixed frame) * @param [in] body_name Celestial body name */ - libra::Vector<3> GetPositionFromSpacecraft_b_m(const char* body_name) const; + math::Vector<3> GetPositionFromSpacecraft_b_m(const char* body_name) const; /** * @fn GetCenterBodyPositionFromSpacecraft_b_m * @brief Return position of the center body (Origin: Spacecraft, Frame: Body fixed frame) */ - libra::Vector<3> GetCenterBodyPositionFromSpacecraft_b_m(void) const; + math::Vector<3> GetCenterBodyPositionFromSpacecraft_b_m(void) const; /** * @fn GetGlobalInfo @@ -68,15 +70,15 @@ class LocalCelestialInformation : public ILoggable { */ inline const CelestialInformation& GetGlobalInformation() const { return *global_celestial_information_; } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -96,7 +98,7 @@ class LocalCelestialInformation : public ILoggable { * @param [in] quaternion_i2b: Spacecraft attitude quaternion from the inertial frame to the body fixed frame * @param [in] spacecraft_angular_velocity_rad_s: Spacecraft angular velocity with respect to the inertial frame [rad/s] */ - void CalcAllPosVel_b(const libra::Quaternion quaternion_i2b, const libra::Vector<3> spacecraft_angular_velocity_rad_s); + void CalcAllPosVel_b(const math::Quaternion quaternion_i2b, const math::Vector<3> spacecraft_angular_velocity_rad_s); /** * @fn ConvertInertialToBody @@ -105,7 +107,7 @@ class LocalCelestialInformation : public ILoggable { * @param [out] output_b: Output vector in the body fixed frame * @param [in] quaternion_i2b: Spacecraft attitude quaternion from the inertial frame to the body fixed frame */ - void ConvertInertialToBody(const double* input_i, double* output_b, const libra::Quaternion quaternion_i2b); + void ConvertInertialToBody(const double* input_i, double* output_b, const math::Quaternion quaternion_i2b); /** * @fn ConvertVelocityInertialToBody @@ -116,8 +118,10 @@ class LocalCelestialInformation : public ILoggable { * @param [in] quaternion_i2b: Spacecraft attitude quaternion from the inertial frame to the body fixed frame * @param [in] angular_velocity_b: Spacecraft angular velocity with respect to the inertial frame [rad/s] */ - void ConvertVelocityInertialToBody(const double* position_i, const double* velocity_i, double* velocity_b, const libra::Quaternion quaternion_i2b, - const libra::Vector<3> angular_velocity_b); + void ConvertVelocityInertialToBody(const double* position_i, const double* velocity_i, double* velocity_b, const math::Quaternion quaternion_i2b, + const math::Vector<3> angular_velocity_b); }; +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_LOCAL_LOCAL_CELESTIAL_INFORMATION_HPP_ diff --git a/src/environment/local/local_environment.cpp b/src/environment/local/local_environment.cpp index dba52989c..7be568bce 100644 --- a/src/environment/local/local_environment.cpp +++ b/src/environment/local/local_environment.cpp @@ -6,24 +6,27 @@ #include "dynamics/attitude/attitude.hpp" #include "dynamics/orbit/orbit.hpp" -#include "library/initialize/initialize_file_access.hpp" +#include "setting_file_reader/initialize_file_access.hpp" -LocalEnvironment::LocalEnvironment(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, - const int spacecraft_id) { +namespace s2e::environment { + +LocalEnvironment::LocalEnvironment(const simulation::SimulationConfiguration* simulation_configuration, + const environment::GlobalEnvironment* global_environment, const int spacecraft_id) { Initialize(simulation_configuration, global_environment, spacecraft_id); } LocalEnvironment::~LocalEnvironment() { delete geomagnetic_field_; delete solar_radiation_pressure_environment_; + delete earth_albedo_; delete atmosphere_; delete celestial_information_; } -void LocalEnvironment::Initialize(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, - const int spacecraft_id) { +void LocalEnvironment::Initialize(const simulation::SimulationConfiguration* simulation_configuration, + const environment::GlobalEnvironment* global_environment, const int spacecraft_id) { // Read file name - IniAccess iniAccess = IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); + setting_file_reader::IniAccess iniAccess = setting_file_reader::IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); std::string ini_fname = iniAccess.ReadString("SETTING_FILES", "local_environment_file"); // Save ini file @@ -35,6 +38,7 @@ void LocalEnvironment::Initialize(const SimulationConfiguration* simulation_conf atmosphere_ = new Atmosphere(InitAtmosphere(ini_fname, celestial_information_, &global_environment->GetSimulationTime())); solar_radiation_pressure_environment_ = new SolarRadiationPressureEnvironment(InitSolarRadiationPressureEnvironment(ini_fname, celestial_information_)); + earth_albedo_ = new EarthAlbedo(InitEarthAlbedo(ini_fname, celestial_information_, solar_radiation_pressure_environment_)); // Force to disable when the center body is not the Earth if (global_environment->GetCelestialInformation().GetCenterBodyName() != "EARTH") { @@ -43,11 +47,11 @@ void LocalEnvironment::Initialize(const SimulationConfiguration* simulation_conf } // Log setting for Local celestial information - IniAccess conf = IniAccess(ini_fname); + setting_file_reader::IniAccess conf = setting_file_reader::IniAccess(ini_fname); celestial_information_->is_log_enabled_ = conf.ReadEnable("LOCAL_CELESTIAL_INFORMATION", "logging"); } -void LocalEnvironment::Update(const Dynamics* dynamics, const SimulationTime* simulation_time) { +void LocalEnvironment::Update(const dynamics::Dynamics* dynamics, const SimulationTime* simulation_time) { auto& orbit = dynamics->GetOrbit(); auto& attitude = dynamics->GetAttitude(); @@ -62,13 +66,17 @@ void LocalEnvironment::Update(const Dynamics* dynamics, const SimulationTime* si // Update local environments that depend only on the position if (simulation_time->GetOrbitPropagateFlag()) { solar_radiation_pressure_environment_->UpdateAllStates(); + earth_albedo_->UpdateAllStates(); atmosphere_->CalcAirDensity_kg_m3(simulation_time->GetCurrentDecimalYear(), orbit); } } -void LocalEnvironment::LogSetup(Logger& logger) { +void LocalEnvironment::LogSetup(logger::Logger& logger) { logger.AddLogList(geomagnetic_field_); logger.AddLogList(solar_radiation_pressure_environment_); + logger.AddLogList(earth_albedo_); logger.AddLogList(atmosphere_); logger.AddLogList(celestial_information_); } + +} // namespace s2e::environment diff --git a/src/environment/local/local_environment.hpp b/src/environment/local/local_environment.hpp index 7e2d05a92..e35b4973d 100644 --- a/src/environment/local/local_environment.hpp +++ b/src/environment/local/local_environment.hpp @@ -8,13 +8,18 @@ #include "atmosphere.hpp" #include "dynamics/dynamics.hpp" +#include "earth_albedo.hpp" #include "environment/global/global_environment.hpp" #include "geomagnetic_field.hpp" #include "local_celestial_information.hpp" #include "simulation/simulation_configuration.hpp" #include "solar_radiation_pressure_environment.hpp" +namespace s2e::dynamics { class Dynamics; +} + +namespace s2e::environment { /** * @class LocalEnvironment @@ -29,7 +34,8 @@ class LocalEnvironment { * @param [in] global_environment: Global environment * @param [in] spacecraft_id: Satellite ID */ - LocalEnvironment(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, const int spacecraft_id); + LocalEnvironment(const simulation::SimulationConfiguration* simulation_configuration, const environment::GlobalEnvironment* global_environment, + const int spacecraft_id); /** * @fn ~LocalEnvironment * @brief Destructor @@ -42,13 +48,13 @@ class LocalEnvironment { * @param [in] dynamics: Dynamics information of the satellite * @param [in] simulation_time: Simulation time */ - void Update(const Dynamics* dynamics, const SimulationTime* simulation_time); + void Update(const dynamics::Dynamics* dynamics, const SimulationTime* simulation_time); /** * @fn LogSetup * @brief Log setup for local environments */ - void LogSetup(Logger& logger); + void LogSetup(logger::Logger& logger); /** * @fn GetAtmosphere @@ -65,6 +71,11 @@ class LocalEnvironment { * @brief Return SolarRadiationPressureEnvironment class */ inline const SolarRadiationPressureEnvironment& GetSolarRadiationPressure() const { return *solar_radiation_pressure_environment_; } + /** + * @fn GetEarthAlbedo + * @brief Return EarthAlbedo class + */ + inline const EarthAlbedo& GetEarthAlbedo() const { return *earth_albedo_; } /** * @fn GetCelestialInformation * @brief Return LocalCelestialInformation class @@ -75,6 +86,7 @@ class LocalEnvironment { Atmosphere* atmosphere_; //!< Atmospheric density of the earth GeomagneticField* geomagnetic_field_; //!< Magnetic field of the earth SolarRadiationPressureEnvironment* solar_radiation_pressure_environment_; //!< Solar radiation pressure + EarthAlbedo* earth_albedo_; //!< Earth albedo LocalCelestialInformation* celestial_information_; //!< Celestial information /** @@ -84,7 +96,10 @@ class LocalEnvironment { * @param [in] global_environment: Global environment * @param [in] spacecraft_id: Satellite ID */ - void Initialize(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, const int spacecraft_id); + void Initialize(const simulation::SimulationConfiguration* simulation_configuration, const environment::GlobalEnvironment* global_environment, + const int spacecraft_id); }; +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_LOCAL_LOCAL_ENVIRONMENT_HPP_ diff --git a/src/environment/local/solar_radiation_pressure_environment.cpp b/src/environment/local/solar_radiation_pressure_environment.cpp index 8f5859e1e..c571f309f 100644 --- a/src/environment/local/solar_radiation_pressure_environment.cpp +++ b/src/environment/local/solar_radiation_pressure_environment.cpp @@ -8,10 +8,12 @@ #include #include -#include "library/initialize/initialize_file_access.hpp" -#include "library/logger/log_utility.hpp" -#include "library/math/constants.hpp" -#include "library/math/vector.hpp" +#include "logger/log_utility.hpp" +#include "math_physics/math/constants.hpp" +#include "math_physics/math/vector.hpp" +#include "setting_file_reader/initialize_file_access.hpp" + +namespace s2e::environment { SolarRadiationPressureEnvironment::SolarRadiationPressureEnvironment(LocalCelestialInformation* local_celestial_information) : local_celestial_information_(local_celestial_information) { @@ -31,7 +33,7 @@ void SolarRadiationPressureEnvironment::UpdateAllStates() { } void SolarRadiationPressureEnvironment::UpdatePressure() { - const libra::Vector<3> r_sc2sun_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m("SUN"); + const math::Vector<3> r_sc2sun_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m("SUN"); const double distance_sat_to_sun = r_sc2sun_eci.CalcNorm(); solar_radiation_pressure_N_m2_ = solar_constant_W_m2_ / environment::speed_of_light_m_s / pow(distance_sat_to_sun / environment::astronomical_unit_m, 2.0); @@ -40,8 +42,8 @@ void SolarRadiationPressureEnvironment::UpdatePressure() { std::string SolarRadiationPressureEnvironment::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteScalar("solar_radiation_pressure_at_spacecraft_position", "N/m2"); - str_tmp += WriteScalar("shadow_coefficient_at_spacecraft_position"); + str_tmp += logger::WriteScalar("solar_radiation_pressure_at_spacecraft_position", "N/m2"); + str_tmp += logger::WriteScalar("shadow_coefficient_at_spacecraft_position"); return str_tmp; } @@ -49,8 +51,8 @@ std::string SolarRadiationPressureEnvironment::GetLogHeader() const { std::string SolarRadiationPressureEnvironment::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(solar_radiation_pressure_N_m2_ * shadow_coefficient_); - str_tmp += WriteScalar(shadow_coefficient_); + str_tmp += logger::WriteScalar(solar_radiation_pressure_N_m2_ * shadow_coefficient_); + str_tmp += logger::WriteScalar(shadow_coefficient_); return str_tmp; } @@ -61,8 +63,8 @@ void SolarRadiationPressureEnvironment::CalcShadowCoefficient(std::string shadow return; } - const libra::Vector<3> r_sc2sun_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m("SUN"); - const libra::Vector<3> r_sc2source_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m(shadow_source_name.c_str()); + const math::Vector<3> r_sc2sun_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m("SUN"); + const math::Vector<3> r_sc2source_eci = local_celestial_information_->GetPositionFromSpacecraft_i_m(shadow_source_name.c_str()); const double shadow_source_radius_m = local_celestial_information_->GetGlobalInformation().GetMeanRadiusFromName_m(shadow_source_name.c_str()); @@ -71,7 +73,7 @@ void SolarRadiationPressureEnvironment::CalcShadowCoefficient(std::string shadow const double sd_source = asin(shadow_source_radius_m / r_sc2source_eci.CalcNorm()); // Apparent radius of the shadow source // Angle of deviation from shadow source center to sun center - libra::Vector<3> r_source2sun_eci = r_sc2sun_eci - r_sc2source_eci; + math::Vector<3> r_source2sun_eci = r_sc2sun_eci - r_sc2source_eci; const double delta = acos(InnerProduct(r_sc2source_eci, r_sc2sun_eci - r_sc2source_eci) / r_sc2source_eci.CalcNorm() / r_source2sun_eci.CalcNorm()); // The angle between the center of the sun and the common chord const double x = (delta * delta + sd_sun * sd_sun - sd_source * sd_source) / (2.0 * delta); @@ -91,7 +93,7 @@ void SolarRadiationPressureEnvironment::CalcShadowCoefficient(std::string shadow } else if (fabs(a - b) <= c && c <= (a + b)) // spacecraft is in penumbra { double A = a * a * acos(x / a) + b * b * acos((c - x) / b) - c * y; // The area of the occulted segment of the apparent solar disk - shadow_coefficient_ *= 1.0 - A / (libra::pi * a * a); + shadow_coefficient_ *= 1.0 - A / (math::pi * a * a); } else { // no occultation takes place if (c < (a + b)) { std::cout << "[Error SRP Environment]: The calculation error was occurred at the shadow calculation." << std::endl; @@ -104,7 +106,7 @@ void SolarRadiationPressureEnvironment::CalcShadowCoefficient(std::string shadow SolarRadiationPressureEnvironment InitSolarRadiationPressureEnvironment(std::string initialize_file_path, LocalCelestialInformation* local_celestial_information) { - auto conf = IniAccess(initialize_file_path); + auto conf = setting_file_reader::IniAccess(initialize_file_path); const char* section = "SOLAR_RADIATION_PRESSURE_ENVIRONMENT"; SolarRadiationPressureEnvironment srp_env(local_celestial_information); @@ -119,3 +121,5 @@ SolarRadiationPressureEnvironment InitSolarRadiationPressureEnvironment(std::str return srp_env; } + +} // namespace s2e::environment diff --git a/src/environment/local/solar_radiation_pressure_environment.hpp b/src/environment/local/solar_radiation_pressure_environment.hpp index 8fbc73250..98f833b6c 100644 --- a/src/environment/local/solar_radiation_pressure_environment.hpp +++ b/src/environment/local/solar_radiation_pressure_environment.hpp @@ -9,11 +9,13 @@ #include "environment/global/physical_constants.hpp" #include "environment/local/local_celestial_information.hpp" +namespace s2e::environment { + /** * @class SolarRadiationPressureEnvironment * @brief Class to calculate Solar Radiation Pressure */ -class SolarRadiationPressureEnvironment : public ILoggable { +class SolarRadiationPressureEnvironment : public logger::ILoggable { public: bool IsCalcEnabled = true; //!< Calculation flag @@ -78,15 +80,15 @@ class SolarRadiationPressureEnvironment : public ILoggable { */ inline bool GetIsEclipsed() const { return (shadow_coefficient_ >= 1.0 ? false : true); } - // Override ILoggable + // Override logger::ILoggable /** * @fn GetLogHeader - * @brief Override GetLogHeader function of ILoggable + * @brief Override GetLogHeader function of logger::ILoggable */ virtual std::string GetLogHeader() const; /** * @fn GetLogValue - * @brief Override GetLogValue function of ILoggable + * @brief Override GetLogValue function of logger::ILoggable */ virtual std::string GetLogValue() const; @@ -122,4 +124,6 @@ class SolarRadiationPressureEnvironment : public ILoggable { SolarRadiationPressureEnvironment InitSolarRadiationPressureEnvironment(std::string initialize_file_path, LocalCelestialInformation* local_celestial_information); +} // namespace s2e::environment + #endif // S2E_ENVIRONMENT_LOCAL_SOLAR_RADIATION_PRESSURE_ENVIRONMENT_HPP_ diff --git a/src/library/gnss/test_gnss_satellite_number.cpp b/src/library/gnss/test_gnss_satellite_number.cpp deleted file mode 100644 index a8df3d610..000000000 --- a/src/library/gnss/test_gnss_satellite_number.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @file test_gnss_satellite_number.cpp - * @brief Test functions for GNSS satellite number handling with GoogleTest - */ -#include - -#include "gnss_satellite_number.hpp" - -/** - * @brief Test satellite number to index - */ -TEST(GnssSatelliteNumber, SatelliteNumberToIndex) { - EXPECT_EQ(ConvertSatelliteNumberToIndex("G01"), 0); - EXPECT_EQ(ConvertSatelliteNumberToIndex("R02"), kGlonassIndexBegin + 1); - EXPECT_EQ(ConvertSatelliteNumberToIndex("E10"), kGalileoIndexBegin + 9); - EXPECT_EQ(ConvertSatelliteNumberToIndex("C40"), kBeidouIndexBegin + 39); - EXPECT_EQ(ConvertSatelliteNumberToIndex("J03"), kQzssIndexBegin + 2); - EXPECT_EQ(ConvertSatelliteNumberToIndex("I04"), kNavicIndexBegin + 3); - EXPECT_EQ(ConvertSatelliteNumberToIndex("err"), UINT32_MAX); -} - -/** - * @brief Test index to satellite number - */ -TEST(GnssSatelliteNumber, IndexToSatelliteNumber) { - EXPECT_EQ(ConvertIndexToSatelliteNumber(0), "G01"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(kGlonassIndexBegin + 9), "R10"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(kGalileoIndexBegin + 21), "E22"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(kBeidouIndexBegin + 50), "C51"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(kQzssIndexBegin + 0), "J01"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(kNavicIndexBegin + 5), "I06"); - EXPECT_EQ(ConvertIndexToSatelliteNumber(5000), "err"); -} diff --git a/src/library/planet_rotation/moon_rotation_utilities.cpp b/src/library/planet_rotation/moon_rotation_utilities.cpp deleted file mode 100644 index fc03ab9f0..000000000 --- a/src/library/planet_rotation/moon_rotation_utilities.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file moon_rotation_utilities.cpp - * @brief Functions to calculate the moon rotation frame conversion - * @note Ref: A Standardized Lunar Coordinate System for the Lunar Reconnaissance Orbiter and Lunar Datasets - * https://lunar.gsfc.nasa.gov/library/LunCoordWhitePaper-10-08.pdf - * https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de430_moon_coord.pdf - */ - -#include "moon_rotation_utilities.hpp" - -#include - -libra::Matrix<3, 3> CalcDcmEciToPrincipalAxis(const libra::Vector<3> moon_position_eci_m, const libra::Vector<3> moon_velocity_eci_m_s) { - libra::Matrix<3, 3> dcm_eci2me = CalcDcmEciToMeanEarth(moon_position_eci_m, moon_velocity_eci_m_s); - libra::Matrix<3, 3> dcm_me2pa = CalcDcmMeanEarthToPrincipalAxis(); - - return dcm_me2pa * dcm_eci2me; -} - -libra::Matrix<3, 3> CalcDcmEciToMeanEarth(const libra::Vector<3> moon_position_eci_m, const libra::Vector<3> moon_velocity_eci_m_s) { - libra::Vector<3> me_ex_eci = -1.0 * moon_position_eci_m.CalcNormalizedVector(); - - libra::Vector<3> moon_orbit_norm = libra::OuterProduct(moon_position_eci_m, moon_velocity_eci_m_s); - libra::Vector<3> me_ez_eci = moon_orbit_norm.CalcNormalizedVector(); - - libra::Vector<3> me_ey_eci = libra::OuterProduct(me_ez_eci, me_ex_eci); - - libra::Matrix<3, 3> dcm_eci_to_me; - for (size_t i = 0; i < 3; i++) { - dcm_eci_to_me[0][i] = me_ex_eci[i]; - dcm_eci_to_me[1][i] = me_ey_eci[i]; - dcm_eci_to_me[2][i] = me_ez_eci[i]; - } - - return dcm_eci_to_me; -} - -libra::Matrix<3, 3> CalcDcmMeanEarthToPrincipalAxis() { - // The correction values between DE430 Principal Axis and Mean Earth frame - const double theta_x_rad = 0.285 * libra::arcsec_to_rad; - const double theta_y_rad = 78.580 * libra::arcsec_to_rad; - const double theta_z_rad = 67.573 * libra::arcsec_to_rad; - - libra::Matrix<3, 3> dcm_me_pa = - libra::MakeRotationMatrixZ(theta_z_rad) * libra::MakeRotationMatrixY(theta_y_rad) * libra::MakeRotationMatrixX(theta_x_rad); - - return dcm_me_pa; -} diff --git a/src/logger/CMakeLists.txt b/src/logger/CMakeLists.txt new file mode 100644 index 000000000..336e85042 --- /dev/null +++ b/src/logger/CMakeLists.txt @@ -0,0 +1,9 @@ +project(LOGGER) +cmake_minimum_required(VERSION 3.13) + +add_library(${PROJECT_NAME} STATIC + logger.cpp + initialize_log.cpp +) + +include(../../common.cmake) diff --git a/src/library/logger/initialize_log.cpp b/src/logger/initialize_log.cpp similarity index 78% rename from src/library/logger/initialize_log.cpp rename to src/logger/initialize_log.cpp index 74f8b377e..84098e57b 100644 --- a/src/library/logger/initialize_log.cpp +++ b/src/logger/initialize_log.cpp @@ -5,10 +5,12 @@ #include "initialize_log.hpp" -#include +#include "../setting_file_reader/initialize_file_access.hpp" + +namespace s2e::logger { Logger* InitLog(std::string file_name) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); std::string log_file_path = ini_file.ReadString("SIMULATION_SETTINGS", "log_file_save_directory"); bool log_ini = ini_file.ReadEnable("SIMULATION_SETTINGS", "save_initialize_files"); @@ -19,7 +21,7 @@ Logger* InitLog(std::string file_name) { } Logger* InitMonteCarloLog(std::string file_name, bool enable) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); std::string log_file_path = ini_file.ReadString("SIMULATION_SETTINGS", "log_file_save_directory"); bool log_ini = ini_file.ReadEnable("SIMULATION_SETTINGS", "save_initialize_files"); @@ -28,3 +30,5 @@ Logger* InitMonteCarloLog(std::string file_name, bool enable) { return log; } + +} // namespace s2e::logger diff --git a/src/library/logger/initialize_log.hpp b/src/logger/initialize_log.hpp similarity index 88% rename from src/library/logger/initialize_log.hpp rename to src/logger/initialize_log.hpp index 2f683bb83..9d7c7a45b 100644 --- a/src/library/logger/initialize_log.hpp +++ b/src/logger/initialize_log.hpp @@ -6,7 +6,9 @@ #ifndef S2E_LIBRARY_LOGGER_INITIALIZE_LOG_HPP_ #define S2E_LIBRARY_LOGGER_INITIALIZE_LOG_HPP_ -#include +#include + +namespace s2e::logger { /** * @fn InitLog @@ -23,4 +25,6 @@ Logger* InitLog(std::string file_name); */ Logger* InitMonteCarloLog(std::string file_name, bool enable); +} // namespace s2e::logger + #endif // S2E_LIBRARY_LOGGER_INITIALIZE_LOG_HPP_ diff --git a/src/library/logger/log_utility.hpp b/src/logger/log_utility.hpp similarity index 86% rename from src/library/logger/log_utility.hpp rename to src/logger/log_utility.hpp index 6bc9fdd5c..3328d358e 100644 --- a/src/library/logger/log_utility.hpp +++ b/src/logger/log_utility.hpp @@ -7,11 +7,13 @@ #define S2E_LIBRARY_LOGGER_LOG_UTILITY_HPP_ #include -#include -#include +#include +#include #include #include +namespace s2e::logger { + /** * @fn WriteScalar * @brief Write scalar value @@ -35,7 +37,7 @@ inline std::string WriteScalar(const std::string name, const std::string unit); * @param [in] precision: precision for the value (number of digit) */ template -inline std::string WriteVector(const libra::Vector vector, const int precision = 6); +inline std::string WriteVector(const math::Vector vector, const int precision = 6); /** * @fn WriteVector * @brief Write header for vector value @@ -52,7 +54,7 @@ inline std::string WriteVector(const std::string name, const std::string frame, * @param [in] matrix: matrix value */ template -inline std::string WriteMatrix(const libra::Matrix matrix, const int precision = 6); +inline std::string WriteMatrix(const math::Matrix matrix, const int precision = 6); /** * @fn WriteMatrix * @brief Write header for matrix value @@ -70,7 +72,7 @@ inline std::string WriteMatrix(const std::string name, const std::string frame, * @brief Write quaternion value * @param [in] quaternion: Quaternion */ -inline std::string WriteQuaternion(const libra::Quaternion quaternion, const int precision = 6); +inline std::string WriteQuaternion(const math::Quaternion quaternion, const int precision = 6); /** * @fn WriteQuaternion * @brief Write header for quaternion @@ -91,7 +93,7 @@ std::string WriteScalar(const T scalar, const int precision) { std::string WriteScalar(const std::string name, const std::string unit) { return name + "[" + unit + "],"; } template -std::string WriteVector(const libra::Vector vector, const int precision) { +std::string WriteVector(const math::Vector vector, const int precision) { std::stringstream str_tmp; for (size_t n = 0; n < NUM; n++) { @@ -115,7 +117,7 @@ std::string WriteVector(const std::string name, const std::string frame, const s } template -std::string WriteMatrix(const libra::Matrix matrix, const int precision) { +std::string WriteMatrix(const math::Matrix matrix, const int precision) { std::stringstream str_tmp; for (size_t n = 0; n < ROW; n++) { @@ -138,7 +140,7 @@ std::string WriteMatrix(const std::string name, const std::string frame, const s return str_tmp.str(); } -std::string WriteQuaternion(const libra::Quaternion quaternion, const int precision) { +std::string WriteQuaternion(const math::Quaternion quaternion, const int precision) { std::stringstream str_tmp; for (size_t i = 0; i < 4; i++) { @@ -156,4 +158,6 @@ std::string WriteQuaternion(const std::string name, const std::string frame) { return str_tmp.str(); } +} // namespace s2e::logger + #endif // S2E_LIBRARY_LOGGER_LOG_UTILITY_HPP_ diff --git a/src/library/logger/loggable.hpp b/src/logger/loggable.hpp similarity index 94% rename from src/library/logger/loggable.hpp rename to src/logger/loggable.hpp index ab1b22a8b..b8616f1a7 100644 --- a/src/library/logger/loggable.hpp +++ b/src/logger/loggable.hpp @@ -10,6 +10,8 @@ #include "log_utility.hpp" // This is not necessary but include here for convenience +namespace s2e::logger { + /** * @class ILoggable * @brief Abstract class to manage logging @@ -34,4 +36,6 @@ class ILoggable { bool is_log_enabled_ = true; //!< Log enable flag }; +} // namespace s2e::logger + #endif // S2E_LIBRARY_LOGGER_LOGGABLE_HPP_ diff --git a/src/library/logger/logger.cpp b/src/logger/logger.cpp similarity index 53% rename from src/library/logger/logger.cpp rename to src/logger/logger.cpp index 2a847b286..3bc823cad 100644 --- a/src/library/logger/logger.cpp +++ b/src/logger/logger.cpp @@ -7,41 +7,42 @@ #include #include -#ifdef _WIN32 -#include -#else -#include -#endif + +namespace s2e::logger { std::vector log_list_; bool Logger::is_directory_created_ = false; -Logger::Logger(const std::string &file_name, const std::string &data_path, const std::string &ini_file_name, const bool is_ini_save_enabled, +namespace fs = std::filesystem; + +Logger::Logger(const std::string &file_name, const fs::path &data_path, const fs::path &ini_file_name, const bool is_ini_save_enabled, const bool is_enabled) : is_enabled_(is_enabled), is_ini_save_enabled_(is_ini_save_enabled) { is_file_opened_ = false; if (is_enabled_ == false) return; - // Get current time to append it to the filename + // Set current time to filename prefix time_t timer = time(NULL); struct tm *now; now = localtime(&timer); char start_time_c[64]; strftime(start_time_c, 64, "%y%m%d_%H%M%S", now); + const auto file_prefix = std::string(start_time_c) + "_"; + // Create directory if (is_ini_save_enabled_ == true || is_directory_created_ == false) { directory_path_ = CreateDirectory(data_path, start_time_c); } else { directory_path_ = data_path; } + // Create File - std::stringstream file_path; - file_path << directory_path_ << start_time_c << "_" << file_name; + fs::path file_path = directory_path_ / (file_prefix + file_name); if (is_enabled_) { - csv_file_.open(file_path.str()); + csv_file_.open(file_path.string()); is_file_opened_ = csv_file_.is_open(); - if (!is_file_opened_) std::cerr << "Error opening log file: " << file_path.str() << std::endl; + if (!is_file_opened_) std::cerr << "Error opening log file: " << file_path << std::endl; } // Copy SimBase.ini @@ -82,50 +83,27 @@ void Logger::AddLogList(ILoggable *loggable) { log_list_.push_back(loggable); } void Logger::ClearLogList() { log_list_.clear(); } -std::string Logger::CreateDirectory(const std::string &data_path, const std::string &time) { - std::string directory_path_tmp_ = data_path + "/logs_" + time + "/"; - // Make directory - int rtn_mkdir = 0; -#ifdef WIN32 - rtn_mkdir = _mkdir(directory_path_tmp_.c_str()); -#else - rtn_mkdir = mkdir(directory_path_tmp_.c_str(), 0777); -#endif - if (rtn_mkdir == 0) { - } else { - std::cerr << "Error making directory: " << directory_path_tmp_ << std::endl; - return data_path; - } - is_directory_created_ = true; - return directory_path_tmp_; -} +fs::path Logger::CreateDirectory(const fs::path &data_path, const std::string &time) { + fs::path log_dir_ = data_path; + log_dir_.append(std::string("logs_") + time); -void Logger::CopyFileToLogDirectory(const std::string &ini_file_name) { - using std::ios; + fs::create_directories(log_dir_); - if (is_ini_save_enabled_ == false) return; - // Copy files to the directory - std::string file_name = GetFileName(ini_file_name); - std::string to_file_name = directory_path_ + file_name; - std::ifstream is(ini_file_name, ios::in | ios::binary); - std::ofstream os(to_file_name, ios::out | ios::binary); - os << is.rdbuf(); - - return; + return log_dir_; } -std::string Logger::GetFileName(const std::string &path) { - size_t pos1; - - pos1 = path.rfind('\\'); - if (pos1 != std::string::npos) { - return path.substr(pos1 + 1, path.size() - pos1 - 1); - } +void Logger::CopyFileToLogDirectory(const fs::path &ini_file_name) { + if (is_ini_save_enabled_ == false) return; + // Copy files to the directory + fs::path to_file_name = directory_path_ / ini_file_name.filename(); - pos1 = path.rfind('/'); - if (pos1 != std::string::npos) { - return path.substr(pos1 + 1, path.size() - pos1 - 1); + if (fs::exists(to_file_name)) { + std::cout << "File " << to_file_name << " already exists. Skip copy from" << ini_file_name << std::endl; + return; } - return path; + fs::copy_file(ini_file_name, to_file_name); + return; } + +} // namespace s2e::logger diff --git a/src/library/logger/logger.hpp b/src/logger/logger.hpp similarity index 78% rename from src/library/logger/logger.hpp rename to src/logger/logger.hpp index 375f76962..066c6814f 100644 --- a/src/library/logger/logger.hpp +++ b/src/logger/logger.hpp @@ -8,12 +8,15 @@ #define _CRT_SECURE_NO_WARNINGS +#include #include #include #include #include "loggable.hpp" +namespace s2e::logger { + /** * @class Logger * @brief Class to manage log output file @@ -29,8 +32,8 @@ class Logger { * @param [in] is_ini_save_enabled: Enable flag to save ini files * @param [in] is_enabled: Enable flag for logging */ - Logger(const std::string &file_name, const std::string &data_path, const std::string &ini_file_name, const bool is_ini_save_enabled, - const bool is_enabled = true); + Logger(const std::string &file_name, const std::filesystem::path &data_path, const std::filesystem::path &ini_file_name, + const bool is_ini_save_enabled, const bool is_enabled = true); /** * @fn ~Logger * @brief Destructor @@ -72,7 +75,7 @@ class Logger { * @brief Copy a file (e.g., ini file) into the log directory * @param [in] ini_file_name: The path to the target file to copy */ - void CopyFileToLogDirectory(const std::string &ini_file_name); + void CopyFileToLogDirectory(const std::filesystem::path &ini_file_name); // Getter /** @@ -84,7 +87,7 @@ class Logger { * @fn GetLogPath * @brief Return the path to the directory for log files */ - inline std::string GetLogPath() const { return directory_path_; } + inline std::filesystem::path GetLogPath() const { return directory_path_; } private: std::ofstream csv_file_; //!< CSV file stream @@ -93,8 +96,8 @@ class Logger { static bool is_directory_created_; //!< Is the log output directory is created in the scenario std::vector log_list_; //!< Log list - bool is_ini_save_enabled_; //!< Enable flag to save ini files - std::string directory_path_; //!< Path to the directory for log files + bool is_ini_save_enabled_; //!< Enable flag to save ini files + std::filesystem::path directory_path_; //!< Path to the directory for log files /** * @fn Write @@ -117,15 +120,9 @@ class Logger { * @param[in] time: Time stamp (YYYYMMDD_hhmmss) * @return Path to the created directory */ - std::string CreateDirectory(const std::string &data_path, const std::string &time); - - /** - * @fn GetFileName - * @brief Extract the file name from the name with directory path - * @param [in] path: Directory path including the file name - * @return The extracted file name - */ - std::string GetFileName(const std::string &path); + std::filesystem::path CreateDirectory(const std::filesystem::path &data_path, const std::string &time); }; +} // namespace s2e::logger + #endif // S2E_LIBRARY_LOGGER_LOGGER_HPP_ diff --git a/src/library/CMakeLists.txt b/src/math_physics/CMakeLists.txt similarity index 66% rename from src/library/CMakeLists.txt rename to src/math_physics/CMakeLists.txt index 3499c09e9..7eb305f84 100644 --- a/src/library/CMakeLists.txt +++ b/src/math_physics/CMakeLists.txt @@ -1,24 +1,20 @@ -project(LIBRARY) +project(MATH_PHYSICS) cmake_minimum_required(VERSION 3.13) add_library(${PROJECT_NAME} STATIC atmosphere/simple_air_density_model.cpp atmosphere/harris_priester_model.cpp + atmosphere/wrapper_nrlmsise00.cpp geodesy/geodetic_position.cpp + geomagnetic/igrf.cpp + gnss/sp3_file_reader.cpp gnss/gnss_satellite_number.cpp gnss/antex_file_reader.cpp gnss/bias_sinex_file_reader.cpp - initialize/initialize_file_access.cpp - initialize/c2a_command_database.cpp - initialize/wings_operation_file.cpp - - logger/logger.cpp - logger/initialize_log.cpp - gravity/gravity_potential.cpp randomization/global_randomization.cpp @@ -37,25 +33,15 @@ add_library(${PROJECT_NAME} STATIC orbit/kepler_orbit.cpp orbit/relative_orbit_models.cpp orbit/interpolation_orbit.cpp + orbit/sgp4/sgp4ext.cpp + orbit/sgp4/sgp4io.cpp + orbit/sgp4/sgp4unit.cpp planet_rotation/moon_rotation_utilities.cpp time_system/date_time_format.cpp time_system/epoch_time.cpp time_system/gps_time.cpp - - external/igrf/igrf.cpp - external/inih/ini.c - external/inih/cpp/INIReader.cpp - external/nrlmsise00/wrapper_nrlmsise00.cpp - external/sgp4/sgp4ext.cpp - external/sgp4/sgp4io.cpp - external/sgp4/sgp4unit.cpp - - utilities/endian.cpp - utilities/slip.cpp - utilities/quantization.cpp - utilities/ring_buffer.cpp ) include(../../common.cmake) diff --git a/src/library/atmosphere/harris_priester_coefficients.hpp b/src/math_physics/atmosphere/harris_priester_coefficients.hpp similarity index 97% rename from src/library/atmosphere/harris_priester_coefficients.hpp rename to src/math_physics/atmosphere/harris_priester_coefficients.hpp index 763de63ab..7fd6802b7 100644 --- a/src/library/atmosphere/harris_priester_coefficients.hpp +++ b/src/math_physics/atmosphere/harris_priester_coefficients.hpp @@ -7,7 +7,7 @@ #include -namespace libra::atmosphere { +namespace s2e::atmosphere { // Height [km], density [g/km3] // TODO: Add other solar activities value @@ -28,6 +28,6 @@ const std::map harris_priester_max_density_table = { {640, 0.4121}, {660, 0.3325}, {680, 0.2691}, {700, 0.2185}, {720, 0.1779}, {740, 0.1452}, {760, 0.1190}, {780, 0.09776}, {800, 0.08059}, {840, 0.05741}, {880, 0.04210}, {920, 0.03130}, {960, 0.02360}, {1000, 0.01810}}; -} // namespace libra::atmosphere +} // namespace s2e::atmosphere #endif // S2E_LIBRARY_HARRIS_COEFFICIENTS_HPP_ diff --git a/src/library/atmosphere/harris_priester_model.cpp b/src/math_physics/atmosphere/harris_priester_model.cpp similarity index 84% rename from src/library/atmosphere/harris_priester_model.cpp rename to src/math_physics/atmosphere/harris_priester_model.cpp index 1ae3d375f..6973caf98 100644 --- a/src/library/atmosphere/harris_priester_model.cpp +++ b/src/math_physics/atmosphere/harris_priester_model.cpp @@ -5,12 +5,12 @@ #include "harris_priester_model.hpp" #include -#include -#include +#include +#include #include "harris_priester_coefficients.hpp" -namespace libra::atmosphere { +namespace s2e::atmosphere { /** * @fn CalcScaleHeight_km @@ -28,27 +28,27 @@ double CalcScaleHeight_km(const std::map::const_iterator density */ double CalcApexDensity_g_km3(const std::map::const_iterator density_itr, const double altitude_km); -double CalcAirDensityWithHarrisPriester_kg_m3(const GeodeticPosition geodetic_position, const libra::Vector<3> sun_direction_eci, const double f10_7, - const double exponent_parameter) { +double CalcAirDensityWithHarrisPriester_kg_m3(const geodesy::GeodeticPosition geodetic_position, const math::Vector<3> sun_direction_eci, + const double f10_7, const double exponent_parameter) { // Altitude double altitude_km = geodetic_position.GetAltitude_m() / 1000.0; // Position - libra::Vector<3> position_ecef_m = geodetic_position.CalcEcefPosition(); + math::Vector<3> position_ecef_m = geodetic_position.CalcEcefPosition(); // Phi: angle between the satellite position and apex of the diurnal bulge double sun_ra_rad; //!< Right ascension of the sun phi double sun_dec_rad; //!< Declination of the sun theta sun_ra_rad = atan2(sun_direction_eci[1], sun_direction_eci[0]); sun_dec_rad = atan2(sun_direction_eci[2], sqrt(sun_direction_eci[0] * sun_direction_eci[0] + sun_direction_eci[1] * sun_direction_eci[1])); - libra::Vector<3> apex_direction; - const double lag_angle_rad = 30.0 * libra::deg_to_rad; + math::Vector<3> apex_direction; + const double lag_angle_rad = 30.0 * math::deg_to_rad; double apex_ra_rad = sun_ra_rad + lag_angle_rad; apex_direction[0] = cos(sun_dec_rad) * cos(apex_ra_rad); apex_direction[1] = cos(sun_dec_rad) * sin(apex_ra_rad); apex_direction[2] = sin(sun_dec_rad); - double beta_rad = libra::InnerProduct(position_ecef_m.CalcNormalizedVector(), apex_direction); + double beta_rad = math::InnerProduct(position_ecef_m.CalcNormalizedVector(), apex_direction); double cos_phi = pow(0.5 + beta_rad / 2.0, exponent_parameter / 2.0); // Find density coefficients from altitude @@ -88,4 +88,4 @@ double CalcApexDensity_g_km3(const std::map::const_iterator dens return apex_density_g_km3; } -} // namespace libra::atmosphere +} // namespace s2e::atmosphere diff --git a/src/library/atmosphere/harris_priester_model.hpp b/src/math_physics/atmosphere/harris_priester_model.hpp similarity index 75% rename from src/library/atmosphere/harris_priester_model.hpp rename to src/math_physics/atmosphere/harris_priester_model.hpp index 1e326f42c..8b64550ad 100644 --- a/src/library/atmosphere/harris_priester_model.hpp +++ b/src/math_physics/atmosphere/harris_priester_model.hpp @@ -6,10 +6,10 @@ #ifndef S2E_LIBRARY_HARRIS_PRIESTER_MODEL_HPP_ #define S2E_LIBRARY_HARRIS_PRIESTER_MODEL_HPP_ -#include -#include +#include +#include -namespace libra::atmosphere { +namespace s2e::atmosphere { /** * @fn CalcAirDensityWithHarrisPriester @@ -20,9 +20,9 @@ namespace libra::atmosphere { * @param [in] exponent_parameter: n in the equation. n=2 for low inclination orbit and n=6 for polar orbit. * @return Atmospheric density [kg/m^3] */ -double CalcAirDensityWithHarrisPriester_kg_m3(const GeodeticPosition geodetic_position, const libra::Vector<3> sun_direction_eci, +double CalcAirDensityWithHarrisPriester_kg_m3(const geodesy::GeodeticPosition geodetic_position, const math::Vector<3> sun_direction_eci, const double f10_7 = 100.0, const double exponent_parameter = 4); -} // namespace libra::atmosphere +} // namespace s2e::atmosphere #endif // S2E_LIBRARY_HARRIS_PRIESTER_HPP_ diff --git a/src/library/atmosphere/simple_air_density_model.cpp b/src/math_physics/atmosphere/simple_air_density_model.cpp similarity index 98% rename from src/library/atmosphere/simple_air_density_model.cpp rename to src/math_physics/atmosphere/simple_air_density_model.cpp index 2444a27db..f616f674b 100644 --- a/src/library/atmosphere/simple_air_density_model.cpp +++ b/src/math_physics/atmosphere/simple_air_density_model.cpp @@ -6,7 +6,7 @@ #include -namespace libra::atmosphere { +namespace s2e::atmosphere { double CalcAirDensityWithSimpleModel(const double altitude_m) { double altitude_km = altitude_m / 1000.0; @@ -138,4 +138,4 @@ double CalcAirDensityWithSimpleModel(const double altitude_m) { return rho_kg_m3; } -} // namespace libra::atmosphere +} // namespace s2e::atmosphere diff --git a/src/library/atmosphere/simple_air_density_model.hpp b/src/math_physics/atmosphere/simple_air_density_model.hpp similarity index 89% rename from src/library/atmosphere/simple_air_density_model.hpp rename to src/math_physics/atmosphere/simple_air_density_model.hpp index 15c728ccb..834807d96 100644 --- a/src/library/atmosphere/simple_air_density_model.hpp +++ b/src/math_physics/atmosphere/simple_air_density_model.hpp @@ -5,7 +5,7 @@ #ifndef S2E_LIBRARY_ATMOSPHERE_SIMPLE_AIR_DENSITY_MODEL_HPP_ #define S2E_LIBRARY_ATMOSPHERE_SIMPLE_AIR_DENSITY_MODEL_HPP_ -namespace libra::atmosphere { +namespace s2e::atmosphere { /** * @fn CalcAirDensityWithSimpleModel @@ -15,6 +15,6 @@ namespace libra::atmosphere { */ double CalcAirDensityWithSimpleModel(const double altitude_m); -} // namespace libra::atmosphere +} // namespace s2e::atmosphere #endif // S2E_LIBRARY_ATMOSPHERE_SIMPLE_AIR_DENSITY_MODEL_HPP_ diff --git a/src/library/external/nrlmsise00/wrapper_nrlmsise00.cpp b/src/math_physics/atmosphere/wrapper_nrlmsise00.cpp similarity index 97% rename from src/library/external/nrlmsise00/wrapper_nrlmsise00.cpp rename to src/math_physics/atmosphere/wrapper_nrlmsise00.cpp index b092af211..c467efe37 100644 --- a/src/library/external/nrlmsise00/wrapper_nrlmsise00.cpp +++ b/src/math_physics/atmosphere/wrapper_nrlmsise00.cpp @@ -16,13 +16,15 @@ extern "C" { #include #include /* maths functions */ #include -#include +#include #include #include "wrapper_nrlmsise00.hpp" /* header for nrlmsise-00.h */ using namespace std; +namespace s2e::atmosphere { + /* ------------------------------------------------------------------- */ /* ------------------------------ DEFINES ---------------------------- */ /* ------------------------------------------------------------------- */ @@ -187,9 +189,9 @@ double CalcNRLMSISE00(double decyear, double latrad, double lonrad, double alt, input.year = 0; /* without effect */ input.sec = date[3] * 60.0 * 60.0 + date[4] * 60.0 + date[5]; input.alt = alt / 1000.0; - input.g_lat = latrad * libra::rad_to_deg; - input.g_long = lonrad * libra::rad_to_deg; - input.lst = input.sec / 3600.0 + lonrad * libra::rad_to_deg / 15.0; + input.g_lat = latrad * math::rad_to_deg; + input.g_long = lonrad * math::rad_to_deg; + input.lst = input.sec / 3600.0 + lonrad * math::rad_to_deg / 15.0; if (is_manual_param) { input.f107 = manual_f107; @@ -305,3 +307,5 @@ size_t GetSpaceWeatherTable_(double decyear, double endsec, const string& filena return table.size(); } + +} // namespace s2e::atmosphere diff --git a/src/library/external/nrlmsise00/wrapper_nrlmsise00.hpp b/src/math_physics/atmosphere/wrapper_nrlmsise00.hpp similarity index 98% rename from src/library/external/nrlmsise00/wrapper_nrlmsise00.hpp rename to src/math_physics/atmosphere/wrapper_nrlmsise00.hpp index 88bf51ee2..ea1e6e43f 100644 --- a/src/library/external/nrlmsise00/wrapper_nrlmsise00.hpp +++ b/src/math_physics/atmosphere/wrapper_nrlmsise00.hpp @@ -12,6 +12,8 @@ #include #include +namespace s2e::atmosphere { + /** * @struct nrlmsise_table * @brief Parameters for NRLMSISE calculation @@ -74,4 +76,6 @@ size_t GetSpaceWeatherTable_(double decyear, double endsec, const std::string& f #define __inline_double double #endif +} // namespace s2e::atmosphere + #endif // S2E_LIBRARY_EXTERNAL_NRLMSISE00_WRAPPER_NRLMSISE00__HPP_ diff --git a/src/library/control_utilities/first_order_lag.hpp b/src/math_physics/control_utilities/first_order_lag.hpp similarity index 94% rename from src/library/control_utilities/first_order_lag.hpp rename to src/math_physics/control_utilities/first_order_lag.hpp index 9bb0d9056..3c61593be 100644 --- a/src/library/control_utilities/first_order_lag.hpp +++ b/src/math_physics/control_utilities/first_order_lag.hpp @@ -6,6 +6,8 @@ #ifndef S2E_LIBRARY_CONTROL_UTILITIES_FIRST_ORDER_LAG_HPP_ #define S2E_LIBRARY_CONTROL_UTILITIES_FIRST_ORDER_LAG_HPP_ +namespace s2e::control_utilities { + /** * @class FirstOderLag * @brief A class to emulate the first order lag @@ -45,4 +47,6 @@ class FirstOrderLag { const double gain_; //!< Gain }; +} // namespace s2e::control_utilities + #endif // S2E_LIBRARY_CONTROL_UTILITIES_FIRST_ORDER_LAG_HPP_ diff --git a/src/library/geodesy/geodetic_position.cpp b/src/math_physics/geodesy/geodetic_position.cpp similarity index 83% rename from src/library/geodesy/geodetic_position.cpp rename to src/math_physics/geodesy/geodetic_position.cpp index 1cb8c6abc..b72aa1804 100644 --- a/src/library/geodesy/geodetic_position.cpp +++ b/src/math_physics/geodesy/geodetic_position.cpp @@ -4,11 +4,13 @@ */ #include "geodetic_position.hpp" -#include // TODO: do not to use the functions in SGP4 library +#include // TODO: do not to use the functions in SGP4 library #include -#include -#include +#include +#include + +namespace s2e::geodesy { GeodeticPosition::GeodeticPosition() { latitude_rad_ = 0.0; @@ -23,7 +25,7 @@ GeodeticPosition::GeodeticPosition(const double latitude_rad, const double longi CalcQuaternionXcxfToLtc(); } -void GeodeticPosition::UpdateFromEcef(const libra::Vector<3> position_ecef_m) { +void GeodeticPosition::UpdateFromEcef(const math::Vector<3> position_ecef_m) { const double earth_radius_m = environment::earth_equatorial_radius_m; const double flattening = environment::earth_flattening; @@ -44,7 +46,7 @@ void GeodeticPosition::UpdateFromEcef(const libra::Vector<3> position_ecef_m) { altitude_m_ = r_m / cos(lat_tmp_rad) - c * earth_radius_m; - if (lat_tmp_rad > libra::pi_2) lat_tmp_rad -= libra::tau; + if (lat_tmp_rad > math::pi_2) lat_tmp_rad -= math::tau; latitude_rad_ = lat_tmp_rad; @@ -52,7 +54,7 @@ void GeodeticPosition::UpdateFromEcef(const libra::Vector<3> position_ecef_m) { return; } -libra::Vector<3> GeodeticPosition::CalcEcefPosition() const { +math::Vector<3> GeodeticPosition::CalcEcefPosition() const { const double earth_radius_m = environment::earth_equatorial_radius_m; const double flattening = environment::earth_flattening; @@ -61,7 +63,7 @@ libra::Vector<3> GeodeticPosition::CalcEcefPosition() const { double c = 1.0 / sqrt(1.0 - e2 * sin(latitude_rad_) * sin(latitude_rad_)); double n = c * earth_radius_m; - libra::Vector<3> pos_ecef_m; + math::Vector<3> pos_ecef_m; pos_ecef_m(0) = (n + altitude_m_) * cos(latitude_rad_) * cos(theta); pos_ecef_m(1) = (n + altitude_m_) * cos(latitude_rad_) * sin(theta); pos_ecef_m(2) = (n * (1.0 - e2) + altitude_m_) * sin(latitude_rad_); @@ -70,7 +72,7 @@ libra::Vector<3> GeodeticPosition::CalcEcefPosition() const { } void GeodeticPosition::CalcQuaternionXcxfToLtc() { - libra::Matrix<3, 3> dcm_xcxf_to_ltc; + math::Matrix<3, 3> dcm_xcxf_to_ltc; dcm_xcxf_to_ltc[0][0] = -sin(longitude_rad_); dcm_xcxf_to_ltc[0][1] = cos(longitude_rad_); dcm_xcxf_to_ltc[0][2] = 0; @@ -83,3 +85,5 @@ void GeodeticPosition::CalcQuaternionXcxfToLtc() { quaternion_xcxf_to_ltc_ = quaternion_xcxf_to_ltc_.ConvertFromDcm(dcm_xcxf_to_ltc); } + +} // namespace s2e::geodesy diff --git a/src/library/geodesy/geodetic_position.hpp b/src/math_physics/geodesy/geodetic_position.hpp similarity index 81% rename from src/library/geodesy/geodetic_position.hpp rename to src/math_physics/geodesy/geodetic_position.hpp index 2b6c68eec..36cb4e839 100644 --- a/src/library/geodesy/geodetic_position.hpp +++ b/src/math_physics/geodesy/geodetic_position.hpp @@ -6,8 +6,10 @@ #ifndef S2E_LIBRARY_GEODESY_GEODETIC_POSITION_HPP_ #define S2E_LIBRARY_GEODESY_GEODETIC_POSITION_HPP_ -#include -#include +#include +#include + +namespace s2e::geodesy { /** * @class GeodeticPosition @@ -34,13 +36,13 @@ class GeodeticPosition { * @brief Update geodetic position with position vector in the ECEF frame * @param [in] position_ecef_m: Position vector in the ECEF frame [m] */ - void UpdateFromEcef(const libra::Vector<3> position_ecef_m); + void UpdateFromEcef(const math::Vector<3> position_ecef_m); /** * @fn CalcEcefPosition * @brief Calculate and return the ECEF position from the geodetic position */ - libra::Vector<3> CalcEcefPosition() const; + math::Vector<3> CalcEcefPosition() const; // Getter /** @@ -62,14 +64,14 @@ class GeodeticPosition { * @fn GetQuaternionXcxfToLtc * @brief Conversion quaternion from XCXF (e.g. ECEF) to LTC frame */ - inline libra::Quaternion GetQuaternionXcxfToLtc() const { return quaternion_xcxf_to_ltc_; } + inline math::Quaternion GetQuaternionXcxfToLtc() const { return quaternion_xcxf_to_ltc_; } private: double latitude_rad_; //!< Latitude [rad] South: -π/2 to 0, North: 0 to π/2 double longitude_rad_; //!< Longitude [rad] East: 0 to π, West: 2π to π (i.e., defined as 0 to 2π [rad] east of the Greenwich meridian) double altitude_m_; //!< Altitude [m] - libra::Quaternion quaternion_xcxf_to_ltc_; //!< Conversion quaternion from XCXF (e.g. ECEF) to LTC (Local Topographic Coordinate) + math::Quaternion quaternion_xcxf_to_ltc_; //!< Conversion quaternion from XCXF (e.g. ECEF) to LTC (Local Topographic Coordinate) /** * @fn CalcQuaternionXcxfToLtc @@ -78,4 +80,6 @@ class GeodeticPosition { void CalcQuaternionXcxfToLtc(); }; +} // namespace s2e::geodesy + #endif // S2E_LIBRARY_GEODESY_GEODETIC_POSITION_HPP_ \ No newline at end of file diff --git a/src/library/external/igrf/igrf.cpp b/src/math_physics/geomagnetic/igrf.cpp similarity index 96% rename from src/library/external/igrf/igrf.cpp rename to src/math_physics/geomagnetic/igrf.cpp index 92c0b25ce..cc89efc82 100644 --- a/src/library/external/igrf/igrf.cpp +++ b/src/math_physics/geomagnetic/igrf.cpp @@ -48,7 +48,7 @@ #include using namespace std; -#include "../sgp4/sgp4ext.h" +#include "../../math_physics/orbit/sgp4/sgp4ext.h" #include "igrf.h" double testglobal[3]; @@ -297,12 +297,12 @@ void gigrf(int gen, double year) { // char file[]="igrf10.coef"; // char path[] = "igrf11.coef"; // char file[] = "igrf11.coef"; - // char path[] = "src/library/external/igrf/igrf11.coef"; - // char file[] = "src/library/external/igrf/igrf11.coef"; - // char path[] = "../SatAttSim/src/library/external/igrf/igrf12.coef"; - // char file[] = "../SatAttSim/src/library/external/igrf/igrf12.coef"; - // char path[] = "../../SatAttSim/src/library/external/igrf/igrf13.coef"; //from 2020 - // char file[] = "../../SatAttSim/src/library/external/igrf/igrf13.coef"; //from 2020 + // char path[] = "src/external_libraries/igrf/igrf11.coef"; + // char file[] = "src/external_libraries/igrf/igrf11.coef"; + // char path[] = "../SatAttSim/src/external_libraries/igrf/igrf12.coef"; + // char file[] = "../SatAttSim/src/external_libraries/igrf/igrf12.coef"; + // char path[] = "../../SatAttSim/src/external_libraries/igrf/igrf13.coef"; //from 2020 + // char file[] = "../../SatAttSim/src/external_libraries/igrf/igrf13.coef"; //from 2020 char file[256]; diff --git a/src/library/external/igrf/igrf.h b/src/math_physics/geomagnetic/igrf.h similarity index 100% rename from src/library/external/igrf/igrf.h rename to src/math_physics/geomagnetic/igrf.h diff --git a/src/library/gnss/antex_file_reader.cpp b/src/math_physics/gnss/antex_file_reader.cpp similarity index 94% rename from src/library/gnss/antex_file_reader.cpp rename to src/math_physics/gnss/antex_file_reader.cpp index 73d91d87c..4a3c74f23 100644 --- a/src/library/gnss/antex_file_reader.cpp +++ b/src/math_physics/gnss/antex_file_reader.cpp @@ -8,7 +8,9 @@ #include #include -#include +#include + +namespace s2e::gnss { #define ANTEX_LINE_TYPE_POSITION (60) @@ -95,7 +97,7 @@ void AntexFileReader::ReadAntexData(std::ifstream& antex_file) { if (line.find("TYPE / SERIAL NO") == ANTEX_LINE_TYPE_POSITION) { std::string antenna_type = line.substr(0, 20); std::string serial_number = line.substr(20, 20); - size_t satellite_index = ConvertSatelliteNumberToIndex(serial_number); + size_t satellite_index = ConvertGnssSatelliteNumberToIndex(serial_number); if (satellite_index == UINT32_MAX) { // receiver @@ -169,7 +171,7 @@ AntexPhaseCenterData AntexFileReader::ReadPhaseCenterData(std::ifstream& antex_f } // Phase center offset if (line.find("NORTH / EAST / UP") == ANTEX_LINE_TYPE_POSITION) { - libra::Vector<3> offset{0.0}; + math::Vector<3> offset{0.0}; sscanf(line.c_str(), "%lf %lf %lf", &offset[0], &offset[1], &offset[2]); phase_center_data.SetPhaseCenterOffset_mm(offset); } @@ -190,9 +192,11 @@ AntexPhaseCenterData AntexFileReader::ReadPhaseCenterData(std::ifstream& antex_f return phase_center_data; } -DateTime AntexFileReader::ReadDateTime(std::string line) { +time_system::DateTime AntexFileReader::ReadDateTime(std::string line) { size_t year, month, day, hour, minute; double second; sscanf(line.c_str(), "%zu %2zu %2zu %2zu %2zu %10lf", &year, &month, &day, &hour, &minute, &second); - return DateTime(year, month, day, hour, minute, second); + return time_system::DateTime(year, month, day, hour, minute, second); } + +} // namespace s2e::gnss diff --git a/src/library/gnss/antex_file_reader.hpp b/src/math_physics/gnss/antex_file_reader.hpp similarity index 91% rename from src/library/gnss/antex_file_reader.hpp rename to src/math_physics/gnss/antex_file_reader.hpp index 7e7fc8073..b463c5f4d 100644 --- a/src/library/gnss/antex_file_reader.hpp +++ b/src/math_physics/gnss/antex_file_reader.hpp @@ -10,12 +10,14 @@ #include -#include -#include #include +#include +#include #include #include +namespace s2e::gnss { + /** * @class AntexGridDefinition * @brief grid data definition in ANTEX file @@ -126,7 +128,7 @@ class AntexPhaseCenterData { * @fn SetPhaseCenterOffset_mm * @param[in] phase_center_offset_mm: Phase center offset vector [mm] */ - inline void SetPhaseCenterOffset_mm(const libra::Vector<3> phase_center_offset_mm) { phase_center_offset_mm_ = phase_center_offset_mm; } + inline void SetPhaseCenterOffset_mm(const math::Vector<3> phase_center_offset_mm) { phase_center_offset_mm_ = phase_center_offset_mm; } /** * @fn SetGridInformation * @param[in] grid_information: Grid information @@ -150,7 +152,7 @@ class AntexPhaseCenterData { * @fn GetPhaseCenterOffset_mm * @return Phase center offset vector [mm] */ - inline libra::Vector<3> GetPhaseCenterOffset_mm() const { return phase_center_offset_mm_; } + inline math::Vector<3> GetPhaseCenterOffset_mm() const { return phase_center_offset_mm_; } /** * @fn GetGridInformation * @return Grid information @@ -164,7 +166,7 @@ class AntexPhaseCenterData { private: std::string frequency_name_ = ""; //!< Frequency name - libra::Vector<3> phase_center_offset_mm_{0.0}; //!< Phase center offset [mm] + math::Vector<3> phase_center_offset_mm_{0.0}; //!< Phase center offset [mm] AntexGridDefinition grid_information_; //!< Grid information std::vector> phase_center_variation_matrix_mm_; //!< Phase center variation [mm] (column, row definition: [azimuth][zenith]) }; @@ -201,12 +203,12 @@ class AntexSatelliteData { * @fn SetValidStartTime * @param[in] valid_start_time: Valid start time */ - inline void SetValidStartTime(const DateTime valid_start_time) { valid_start_time_ = valid_start_time; }; + inline void SetValidStartTime(const time_system::DateTime valid_start_time) { valid_start_time_ = valid_start_time; }; /** * @fn SetValidEndTime * @param[in] valid_end_time: Valid end time */ - inline void SetValidEndTime(const DateTime valid_end_time) { valid_end_time_ = valid_end_time; }; + inline void SetValidEndTime(const time_system::DateTime valid_end_time) { valid_end_time_ = valid_end_time; }; /** * @fn SetNumberOfFrequency * @param[in] number_of_frequency: Number of frequency @@ -233,12 +235,12 @@ class AntexSatelliteData { * @fn GetValidStartTime * @return Valid start time */ - inline DateTime GetValidStartTime() const { return valid_start_time_; }; + inline time_system::DateTime GetValidStartTime() const { return valid_start_time_; }; /** * @fn GetValidEndTime * @return Valid end time */ - inline DateTime GetValidEndTime() const { return valid_end_time_; }; + inline time_system::DateTime GetValidEndTime() const { return valid_end_time_; }; /** * @fn GetNumberOfFrequency * @return Number of frequency @@ -254,8 +256,8 @@ class AntexSatelliteData { private: std::string antenna_type_; //!< Antenna type std::string serial_number_; //!< Serial number or satellite code - DateTime valid_start_time_; //!< Valid start time - DateTime valid_end_time_; //!< Valid end time (The latest data does not have the end time) + time_system::DateTime valid_start_time_; //!< Valid start time + time_system::DateTime valid_end_time_; //!< Valid end time (The latest data does not have the end time) size_t number_of_frequency_ = 1; //!< Number of frequency std::vector phase_center_data_; //!< Phase center data for each frequency }; @@ -340,7 +342,9 @@ class AntexFileReader { * @param[in] line: A single line in ANTEX file * @return Read date time */ - DateTime ReadDateTime(std::string line); + time_system::DateTime ReadDateTime(std::string line); }; +} // namespace s2e::gnss + #endif // S2E_LIBRARY_ANTEX_FILE_READER_HPP_ diff --git a/src/library/gnss/bias_sinex_file_reader.cpp b/src/math_physics/gnss/bias_sinex_file_reader.cpp similarity index 99% rename from src/library/gnss/bias_sinex_file_reader.cpp rename to src/math_physics/gnss/bias_sinex_file_reader.cpp index ebb47913a..b8a203c27 100644 --- a/src/library/gnss/bias_sinex_file_reader.cpp +++ b/src/math_physics/gnss/bias_sinex_file_reader.cpp @@ -9,6 +9,8 @@ #include #include +namespace s2e::gnss { + bool BiasSinexFileReader::ReadFile(const std::string file_name) { // File open std::ifstream bias_sinex_file(file_name); @@ -242,3 +244,5 @@ void BiasSolutionData::SetTargetSignal(const std::string signal1, const std::str target_signal_ = BiasTargetSignal::kError; } } + +} // namespace s2e::gnss diff --git a/src/library/gnss/bias_sinex_file_reader.hpp b/src/math_physics/gnss/bias_sinex_file_reader.hpp similarity index 99% rename from src/library/gnss/bias_sinex_file_reader.hpp rename to src/math_physics/gnss/bias_sinex_file_reader.hpp index 49d85e91e..694a9bcc5 100644 --- a/src/library/gnss/bias_sinex_file_reader.hpp +++ b/src/math_physics/gnss/bias_sinex_file_reader.hpp @@ -10,6 +10,8 @@ #include #include +namespace s2e::gnss { + /** * @enum BiasIdentifier * @brief Bias Identifier @@ -184,4 +186,6 @@ class BiasSinexFileReader { void ReadBiasSolution(std::ifstream& bias_sinex_file); }; +} // namespace s2e::gnss + #endif // S2E_LIBRARY_BIAS_SINEX_FILE_READER_HPP_ \ No newline at end of file diff --git a/src/library/gnss/example.BSX b/src/math_physics/gnss/example.BSX similarity index 100% rename from src/library/gnss/example.BSX rename to src/math_physics/gnss/example.BSX diff --git a/src/library/gnss/example.atx b/src/math_physics/gnss/example.atx similarity index 100% rename from src/library/gnss/example.atx rename to src/math_physics/gnss/example.atx diff --git a/src/library/gnss/example.sp3 b/src/math_physics/gnss/example.sp3 similarity index 100% rename from src/library/gnss/example.sp3 rename to src/math_physics/gnss/example.sp3 diff --git a/src/library/gnss/gnss_satellite_number.cpp b/src/math_physics/gnss/gnss_satellite_number.cpp similarity index 88% rename from src/library/gnss/gnss_satellite_number.cpp rename to src/math_physics/gnss/gnss_satellite_number.cpp index 0c77ee5c4..2241db843 100644 --- a/src/library/gnss/gnss_satellite_number.cpp +++ b/src/math_physics/gnss/gnss_satellite_number.cpp @@ -5,7 +5,9 @@ #include "gnss_satellite_number.hpp" -size_t ConvertSatelliteNumberToIndex(const std::string satellite_number) { +namespace s2e::gnss { + +size_t ConvertGnssSatelliteNumberToIndex(const std::string satellite_number) { switch (satellite_number.front()) { case 'G': return stoi(satellite_number.substr(1)) + kGpsIndexBegin - 1; @@ -25,7 +27,7 @@ size_t ConvertSatelliteNumberToIndex(const std::string satellite_number) { } } -std::string ConvertIndexToSatelliteNumber(const size_t index) { +std::string ConvertIndexToGnssSatelliteNumber(const size_t index) { std::string output; size_t prn_number = 0; @@ -58,3 +60,5 @@ std::string ConvertIndexToSatelliteNumber(const size_t index) { return output; } + +} // namespace s2e::gnss diff --git a/src/library/gnss/gnss_satellite_number.hpp b/src/math_physics/gnss/gnss_satellite_number.hpp similarity index 89% rename from src/library/gnss/gnss_satellite_number.hpp rename to src/math_physics/gnss/gnss_satellite_number.hpp index 95a192694..2b4e1f08b 100644 --- a/src/library/gnss/gnss_satellite_number.hpp +++ b/src/math_physics/gnss/gnss_satellite_number.hpp @@ -10,6 +10,8 @@ #include +namespace s2e::gnss { + // GNSS satellite number definition // TODO: Move to initialized file? const size_t kNumberOfGpsSatellite = 32; //!< Number of GPS satellites @@ -31,17 +33,19 @@ const size_t kQzssIndexBegin = kBeidouIndexBegin + kNumberOfBeidouSatellite; const size_t kNavicIndexBegin = kQzssIndexBegin + kNumberOfQzssSatellite; //!< Begin value of index for NavIC satellites /** - * @fn ConvertSatelliteNumberToIndex + * @fn ConvertGnssSatelliteNumberToIndex * @brief Calculate index of GNSS satellite defined in S2E from GNSS satellite number defined in RINEX v4 * @return Index of GNSS satellite defined in this class. or INT32_MAX when the input is wrong. */ -size_t ConvertSatelliteNumberToIndex(const std::string satellite_number); +size_t ConvertGnssSatelliteNumberToIndex(const std::string satellite_number); /** - * @fn ConvertIndexToSatelliteNumber + * @fn ConvertIndexToGnssSatelliteNumber * @brief Calculate GNSS satellite number defined in RINEX v4 from index of GNSS satellite defined in this class * @return GNSS satellite number defined in RINEX v4. or err when the input is wrong. */ -std::string ConvertIndexToSatelliteNumber(const size_t index); +std::string ConvertIndexToGnssSatelliteNumber(const size_t index); + +} // namespace s2e::gnss #endif // S2E_LIBRARY_GNSS_GNSS_SATELLITE_NUMBER_HPP_ diff --git a/src/math_physics/gnss/igs_product_name_handling.hpp b/src/math_physics/gnss/igs_product_name_handling.hpp new file mode 100644 index 000000000..01c923fe7 --- /dev/null +++ b/src/math_physics/gnss/igs_product_name_handling.hpp @@ -0,0 +1,90 @@ +/** + * @file igs_product_name_handling.hpp + * @brief Manage IGS product name handling + * @note IGS product: https://igs.org/products/#orbits_clocks + * MGEX product: https://igs.org/mgex/data-products/#orbit_clock + */ + +#ifndef S2E_LIBRARY_GNSS_IGS_PRODUCT_NAME_HANDLING_HPP_ +#define S2E_LIBRARY_GNSS_IGS_PRODUCT_NAME_HANDLING_HPP_ + +#include + +namespace s2e::gnss { + +/** + * @fn GetOrbitClockFileName + * @brief Return IGS orbit and clock final product file name + * @param [in] header: Header information (ex. IGS0OPSFIN) + * @param [in] year_doy: Merged number of year(YYY) and day of year(DDD) (YYYYDDD) + * @param [in] period: Period of the data (ex. 15M = 15 mins.) + * @param [in] file_type: File type and extensions (ex. ORB.SP3) + * @return: file name + */ +std::string GetOrbitClockFinalFileName(const std::string header, const size_t year_doy, const std::string period = "15M", + const std::string file_type = "ORB.SP3") { + std::string file_name = header + "_" + std::to_string(year_doy) + "0000_01D_" + period + "_" + file_type; + + return file_name; +} + +/** + * @fn MergeYearDoy + * @brief Return Merged number of year(YYY) and day of year(DDD) (YYYYDDD) + * @param [in] year: 4-digit Year + * @param [in] doy: 3-digit Day of year + * @return: Merged number + */ +size_t MergeYearDoy(const size_t year, const size_t doy) { return year * 1000 + doy; } + +/** + * @fn PerseYearFromYearDoy + * @brief Return 4-digit year + * @param [in] year_doy: Merged number of year(YYY) and day of year(DDD) (YYYYDDD) + * @return: year + */ +size_t PerseYearFromYearDoy(const size_t year_doy) { return year_doy / 1000; } + +/** + * @fn PerseDoyFromYearDoy + * @brief Return 3-digit day of year + * @param [in] year_doy: Merged number of year(YYY) and day of year(DDD) (YYYYDDD) + * @return: day of year + */ +size_t PerseDoyFromYearDoy(const size_t year_doy) { + size_t year = PerseYearFromYearDoy(year_doy); + return year_doy - year * 1000; +} + +/** + * @fn IncrementYearDoy + * @brief Calculate increment value of year_doy considering year update + * @param [in] year_doy: Merged number of year(YYY) and day of year(DDD) (YYYYDDD) + * @return: Incremented value + */ +size_t IncrementYearDoy(const size_t year_doy) { + size_t output = year_doy + 1; + size_t doy = PerseDoyFromYearDoy(output); + + // Year update + if (doy > 365) { + size_t year = PerseYearFromYearDoy(output); + // Leap year + if (year % 4 == 0) { + if (doy > 366) { + year++; + doy = 1; + } + } else { + year++; + doy = 1; + } + output = MergeYearDoy(year, doy); + } + + return output; +} + +} // namespace s2e::gnss + +#endif // S2E_LIBRARY_GNSS_IGS_PRODUCT_NAME_HANDLING_HPP_ diff --git a/src/library/gnss/sp3_file_reader.cpp b/src/math_physics/gnss/sp3_file_reader.cpp similarity index 90% rename from src/library/gnss/sp3_file_reader.cpp rename to src/math_physics/gnss/sp3_file_reader.cpp index 944c10786..2ae136626 100644 --- a/src/library/gnss/sp3_file_reader.cpp +++ b/src/math_physics/gnss/sp3_file_reader.cpp @@ -11,11 +11,13 @@ #include #include +namespace s2e::gnss { + Sp3FileReader::Sp3FileReader(const std::string file_name) { ReadFile(file_name); } -DateTime Sp3FileReader::GetEpochData(const size_t epoch_id) const { +time_system::DateTime Sp3FileReader::GetEpochData(const size_t epoch_id) const { if (epoch_id > epoch_.size()) { - DateTime zero; + time_system::DateTime zero; return zero; } return epoch_[epoch_id]; @@ -38,7 +40,7 @@ double Sp3FileReader::GetSatelliteClockOffset(const size_t epoch_id, const size_ return position_clock.clock_us_; } -libra::Vector<3> Sp3FileReader::GetSatellitePosition_km(const size_t epoch_id, const size_t satellite_id) { +math::Vector<3> Sp3FileReader::GetSatellitePosition_km(const size_t epoch_id, const size_t satellite_id) { Sp3PositionClock position_clock = GetPositionClock(epoch_id, satellite_id); return position_clock.position_km_; } @@ -67,7 +69,7 @@ bool Sp3FileReader::ReadFile(const std::string file_name) { size_t year, month, day, hour, minute; double second; sscanf(line.substr(3, 28).c_str(), "%zu %2zu %2zu %2zu %2zu %12lf", &year, &month, &day, &hour, &minute, &second); - epoch_.push_back(DateTime(year, month, day, hour, minute, second)); + epoch_.push_back(time_system::DateTime(year, month, day, hour, minute, second)); // Orbit and Clock information for (size_t satellite_id = 0; satellite_id < header_.number_of_satellites_; satellite_id++) { @@ -115,7 +117,7 @@ bool Sp3FileReader::ReadFile(const std::string file_name) { } // Test - DateTime test = epoch_[0]; + time_system::DateTime test = epoch_[0]; test = epoch_[1]; std::vector test_p = position_clock_[0]; test_p = position_clock_[1]; @@ -124,6 +126,27 @@ bool Sp3FileReader::ReadFile(const std::string file_name) { return true; } +size_t Sp3FileReader::SearchNearestEpochId(const time_system::EpochTime time) { + size_t nearest_epoch_id = 0; + + // Get header info + const size_t num_epoch = header_.number_of_epoch_; + const double interval_s = header_.epoch_interval_s_; + + // Check range + time_system::EpochTime start_epoch(epoch_[0]); + if (start_epoch > time) { + nearest_epoch_id = 0; + } else if ((time_system::EpochTime)(epoch_[num_epoch - 1]) < time) { + nearest_epoch_id = num_epoch - 1; + } else { // Calc nearest point + double diff_s = time.GetTimeWithFraction_s() - start_epoch.GetTimeWithFraction_s(); + nearest_epoch_id = (size_t)(diff_s / interval_s + 0.5); + } + + return nearest_epoch_id; +} + size_t Sp3FileReader::ReadHeader(std::ifstream& sp3_file) { size_t line_number = 0; std::string line; @@ -148,7 +171,7 @@ size_t Sp3FileReader::ReadHeader(std::ifstream& sp3_file) { size_t year, month, day, hour, minute; double second; sscanf(line.substr(3, 28).c_str(), "%zu %2zu %2zu %2zu %2zu %12lf", &year, &month, &day, &hour, &minute, &second); - header_.start_epoch_ = DateTime(year, month, day, hour, minute, second); + header_.start_epoch_ = time_system::DateTime(year, month, day, hour, minute, second); header_.number_of_epoch_ = std::stoi(line.substr(32, 7)); header_.used_data_ = line.substr(40, 5); header_.coordinate_system_ = line.substr(46, 5); @@ -176,7 +199,7 @@ size_t Sp3FileReader::ReadHeader(std::ifstream& sp3_file) { return 0; } // Read contents - header_.start_gps_time_ = GpsTime(std::stoi(line.substr(3, 4)), std::stod(line.substr(8, 15))); + header_.start_gps_time_ = time_system::GpsTime(std::stoi(line.substr(3, 4)), std::stod(line.substr(8, 15))); header_.epoch_interval_s_ = std::stod(line.substr(24, 14)); header_.start_time_mjday_ = std::stoi(line.substr(39, 5)); header_.start_time_mjday_fractional_day_ = std::stod(line.substr(45, 15)); @@ -291,7 +314,7 @@ Sp3PositionClock Sp3FileReader::DecodePositionClockData(std::string line) { position_clock.satellite_id_ = line.substr(1, 3); // Position and clock - libra::Vector<3> position_km; + math::Vector<3> position_km; for (size_t axis = 0; axis < 3; axis++) { position_km[axis] = stod(line.substr(4 + axis * 14, 14)); } @@ -300,7 +323,7 @@ Sp3PositionClock Sp3FileReader::DecodePositionClockData(std::string line) { // Standard deviations if (line.size() > 61) { - libra::Vector<3> position_standard_deviation; + math::Vector<3> position_standard_deviation; for (size_t axis = 0; axis < 3; axis++) { try { position_standard_deviation[axis] = stod(line.substr(61 + axis * 3, 2)); @@ -361,7 +384,7 @@ Sp3VelocityClockRate Sp3FileReader::DecodeVelocityClockRateData(std::string line velocity_clock_rate.satellite_id_ = line.substr(1, 3); // Velocity and clock rate - libra::Vector<3> velocity_dm_s; + math::Vector<3> velocity_dm_s; for (size_t axis = 0; axis < 3; axis++) { velocity_dm_s[axis] = stod(line.substr(4 + axis * 14, 14)); } @@ -370,7 +393,7 @@ Sp3VelocityClockRate Sp3FileReader::DecodeVelocityClockRateData(std::string line // Standard deviations if (line.size() > 60) { - libra::Vector<3> velocity_standard_deviation; + math::Vector<3> velocity_standard_deviation; for (size_t axis = 0; axis < 3; axis++) { velocity_standard_deviation[axis] = stod(line.substr(61 + axis * 2, 2)); } @@ -398,3 +421,5 @@ Sp3VelocityClockRateCorrelation Sp3FileReader::DecodeVelocityClockRateCorrelatio return correlation; } + +} // namespace s2e::gnss diff --git a/src/library/gnss/sp3_file_reader.hpp b/src/math_physics/gnss/sp3_file_reader.hpp similarity index 75% rename from src/library/gnss/sp3_file_reader.hpp rename to src/math_physics/gnss/sp3_file_reader.hpp index ee59b10fd..4e98933aa 100644 --- a/src/library/gnss/sp3_file_reader.hpp +++ b/src/math_physics/gnss/sp3_file_reader.hpp @@ -10,13 +10,15 @@ #include -#include -#include -#include #include +#include +#include +#include #include #include +namespace s2e::gnss { + #define SP3_BAD_CLOCK_VALUE (999999.999999) #define SP3_BAD_POSITION_VALUE (0.000000) @@ -49,16 +51,16 @@ enum class Sp3OrbitType { struct Sp3Header { // 1st line information // version -> not implemented yet - Sp3Mode mode_; //!< position or velocity - DateTime start_epoch_; //!< Time of start epoch - size_t number_of_epoch_ = 0; //!< Number of epoch in the SP3 file - std::string used_data_; //!< Used data to generate the SP3 file - std::string coordinate_system_; //!< Coordinate system for the position and velocity data - Sp3OrbitType orbit_type_; //!< Orbit type - std::string agency_name_; //!< Agency name who generates the SP3 file + Sp3Mode mode_; //!< position or velocity + time_system::DateTime start_epoch_; //!< Time of start epoch + size_t number_of_epoch_ = 0; //!< Number of epoch in the SP3 file + std::string used_data_; //!< Used data to generate the SP3 file + std::string coordinate_system_; //!< Coordinate system for the position and velocity data + Sp3OrbitType orbit_type_; //!< Orbit type + std::string agency_name_; //!< Agency name who generates the SP3 file // 2nd line information - GpsTime start_gps_time_; //!< Start time of orbit + time_system::GpsTime start_gps_time_; //!< Start time of orbit double epoch_interval_s_ = 1.0; //!< Epoch interval (0.0, 100000.0) size_t start_time_mjday_; //!< Start time of the orbit data (44244 = 6th Jan. 1980) [Modified Julian day] double start_time_mjday_fractional_day_ = 0.0; //!< Fractional part of the start time [0.0, 1.0) [day] @@ -92,15 +94,15 @@ struct Sp3Header { * @note The coordinate system of the position is defined in the SP3 header */ struct Sp3PositionClock { - std::string satellite_id_; //!< GNSS satellite ID - libra::Vector<3> position_km_{SP3_BAD_POSITION_VALUE}; //!< Satellite position [km] - double clock_us_ = SP3_BAD_CLOCK_VALUE; //!< Satellite clock offset [us] - libra::Vector<3> position_standard_deviation_{0.0}; //!< Satellite position standard deviation [-] - double clock_standard_deviation_ = 0.0; //!< Satellite clock offset standard deviation [-] - bool clock_event_flag_ = false; //!< true when clock discontinuity is happened - bool clock_prediction_flag_ = false; //!< true when clock data is predicted - bool maneuver_flag_ = false; //!< true when orbit maneuver is happened in last 50 minutes - bool orbit_prediction_flag_ = false; //!< true when orbit data is predicted + std::string satellite_id_; //!< GNSS satellite ID + math::Vector<3> position_km_{SP3_BAD_POSITION_VALUE}; //!< Satellite position [km] + double clock_us_ = SP3_BAD_CLOCK_VALUE; //!< Satellite clock offset [us] + math::Vector<3> position_standard_deviation_{0.0}; //!< Satellite position standard deviation [-] + double clock_standard_deviation_ = 0.0; //!< Satellite clock offset standard deviation [-] + bool clock_event_flag_ = false; //!< true when clock discontinuity is happened + bool clock_prediction_flag_ = false; //!< true when clock data is predicted + bool maneuver_flag_ = false; //!< true when orbit maneuver is happened in last 50 minutes + bool orbit_prediction_flag_ = false; //!< true when orbit data is predicted }; /** @@ -127,11 +129,11 @@ struct Sp3PositionClockCorrelation { * @note The coordinate system of the position is defined in the SP3 header */ struct Sp3VelocityClockRate { - std::string satellite_id_; //!< GNSS satellite ID - libra::Vector<3> velocity_dm_s_{0.0}; //!< Satellite velocity [dm/s] - double clock_rate_ = 0.0; //!< Satellite clock offset change rate [-] - libra::Vector<3> velocity_standard_deviation_{0.0}; //!< Satellite position standard deviation [-] - double clock_rate_standard_deviation_ = 0.0; //!< Satellite clock offset standard deviation [-] + std::string satellite_id_; //!< GNSS satellite ID + math::Vector<3> velocity_dm_s_{0.0}; //!< Satellite velocity [dm/s] + double clock_rate_ = 0.0; //!< Satellite clock offset change rate [-] + math::Vector<3> velocity_standard_deviation_{0.0}; //!< Satellite position standard deviation [-] + double clock_rate_standard_deviation_ = 0.0; //!< Satellite clock offset standard deviation [-] }; /** @@ -170,17 +172,19 @@ class Sp3FileReader { inline Sp3Header GetHeader() const { return header_; } inline size_t GetNumberOfEpoch() const { return header_.number_of_epoch_; } inline size_t GetNumberOfSatellites() const { return header_.number_of_satellites_; } - inline DateTime GetStartEpochDateTime() const { return header_.start_epoch_; } - inline GpsTime GetStartEpochGpsTime() const { return header_.start_gps_time_; } + inline time_system::DateTime GetStartEpochDateTime() const { return header_.start_epoch_; } + inline time_system::GpsTime GetStartEpochGpsTime() const { return header_.start_gps_time_; } // Data - DateTime GetEpochData(const size_t epoch_id) const; + time_system::DateTime GetEpochData(const size_t epoch_id) const; Sp3PositionClock GetPositionClock(const size_t epoch_id, const size_t satellite_id); double GetSatelliteClockOffset(const size_t epoch_id, const size_t satellite_id); - libra::Vector<3> GetSatellitePosition_km(const size_t epoch_id, const size_t satellite_id); + math::Vector<3> GetSatellitePosition_km(const size_t epoch_id, const size_t satellite_id); + + size_t SearchNearestEpochId(const time_system::EpochTime time); private: - Sp3Header header_; //!< SP3 header information - std::vector epoch_; //!< Epoch data list + Sp3Header header_; //!< SP3 header information + std::vector epoch_; //!< Epoch data list // Orbit and clock data (Use as position_clock_[satellite_id][epoch_id]) std::map> position_clock_; //!< Position and Clock data @@ -232,4 +236,6 @@ class Sp3FileReader { Sp3VelocityClockRateCorrelation DecodeVelocityClockRateCorrelation(std::string line); }; +} // namespace s2e::gnss + #endif // S2E_LIBRARY_GNSS_SP3_FILE_READER_HPP_ diff --git a/src/library/gnss/test_antex_file_reader.cpp b/src/math_physics/gnss/test_antex_file_reader.cpp similarity index 99% rename from src/library/gnss/test_antex_file_reader.cpp rename to src/math_physics/gnss/test_antex_file_reader.cpp index b696e1df7..f64af1003 100644 --- a/src/library/gnss/test_antex_file_reader.cpp +++ b/src/math_physics/gnss/test_antex_file_reader.cpp @@ -7,11 +7,13 @@ #include "antex_file_reader.hpp" +using namespace s2e::gnss; + /** * @brief Test Constructor */ TEST(AntexReader, Constructor) { - std::string test_file_name = "/src/library/gnss/example.atx"; + std::string test_file_name = "/src/math_physics/gnss/example.atx"; AntexFileReader antex_file_fault("false_file_path.atx"); EXPECT_FALSE(antex_file_fault.GetFileReadSuccessFlag()); diff --git a/src/library/gnss/test_bias_sinex_file_reader.cpp b/src/math_physics/gnss/test_bias_sinex_file_reader.cpp similarity index 93% rename from src/library/gnss/test_bias_sinex_file_reader.cpp rename to src/math_physics/gnss/test_bias_sinex_file_reader.cpp index ab806a070..c58f7ceae 100644 --- a/src/library/gnss/test_bias_sinex_file_reader.cpp +++ b/src/math_physics/gnss/test_bias_sinex_file_reader.cpp @@ -2,13 +2,15 @@ #include "bias_sinex_file_reader.hpp" +using namespace s2e::gnss; + TEST(BiasSinex, Constructor) { // File read error check BiasSinexFileReader bias_sinex_file_fault("false_file_path.BSX"); EXPECT_FALSE(bias_sinex_file_fault.GetFileReadSuccessFlag()); // File read check - std::string test_file_name = "/src/library/gnss/example.BSX"; + std::string test_file_name = "/src/math_physics/gnss/example.BSX"; BiasSinexFileReader bias_sinex_file(CORE_DIR_FROM_EXE + test_file_name); EXPECT_TRUE(bias_sinex_file.GetFileReadSuccessFlag()); diff --git a/src/math_physics/gnss/test_gnss_satellite_number.cpp b/src/math_physics/gnss/test_gnss_satellite_number.cpp new file mode 100644 index 000000000..0d4cae6f6 --- /dev/null +++ b/src/math_physics/gnss/test_gnss_satellite_number.cpp @@ -0,0 +1,35 @@ +/** + * @file test_gnss_satellite_number.cpp + * @brief Test functions for GNSS satellite number handling with GoogleTest + */ +#include + +#include "gnss_satellite_number.hpp" + +using namespace s2e::gnss; + +/** + * @brief Test satellite number to index + */ +TEST(GnssSatelliteNumber, SatelliteNumberToIndex) { + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("G01"), 0); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("R02"), kGlonassIndexBegin + 1); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("E10"), kGalileoIndexBegin + 9); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("C40"), kBeidouIndexBegin + 39); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("J03"), kQzssIndexBegin + 2); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("I04"), kNavicIndexBegin + 3); + EXPECT_EQ(ConvertGnssSatelliteNumberToIndex("err"), UINT32_MAX); +} + +/** + * @brief Test index to satellite number + */ +TEST(GnssSatelliteNumber, IndexToSatelliteNumber) { + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(0), "G01"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(kGlonassIndexBegin + 9), "R10"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(kGalileoIndexBegin + 21), "E22"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(kBeidouIndexBegin + 50), "C51"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(kQzssIndexBegin + 0), "J01"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(kNavicIndexBegin + 5), "I06"); + EXPECT_EQ(ConvertIndexToGnssSatelliteNumber(5000), "err"); +} diff --git a/src/math_physics/gnss/test_igs_product_name_handling.cpp b/src/math_physics/gnss/test_igs_product_name_handling.cpp new file mode 100644 index 000000000..6b5d40270 --- /dev/null +++ b/src/math_physics/gnss/test_igs_product_name_handling.cpp @@ -0,0 +1,87 @@ +/** + * @file test_igs_product_name_handling.cpp + * @brief Test functions for IGS product name handling with GoogleTest + */ +#include +#include + +#include "igs_product_name_handling.hpp" + +using namespace s2e::gnss; + +/** + * @brief Test GetOrbitClockFinalFileName + */ +TEST(IgsProductName, GetOrbitClockFinalFileName) { + std::string header = "IGS0OPSFIN"; + size_t year_doy = 2023190; + + std::string file_name = GetOrbitClockFinalFileName(header, year_doy); + EXPECT_THAT(file_name, ::testing::MatchesRegex("IGS0OPSFIN_20231900000_01D_15M_ORB.SP3")); + + std::string period = "15M"; + std::string file_type = "ORB.SP3"; + + file_name = GetOrbitClockFinalFileName(header, year_doy, period, file_type); + EXPECT_THAT(file_name, ::testing::MatchesRegex("IGS0OPSFIN_20231900000_01D_15M_ORB.SP3")); + + header = "IGS0OPSFIN"; + year_doy = 2023365; + period = "30S"; + file_type = "CLK.CLK"; + + file_name = GetOrbitClockFinalFileName(header, year_doy, period, file_type); + EXPECT_THAT(file_name, ::testing::MatchesRegex("IGS0OPSFIN_20233650000_01D_30S_CLK.CLK")); +} + +/** + * @brief Test MergeYearDoy + */ +TEST(IgsProductName, MergeYearDoy) { + size_t year = 2023; + size_t doy = 190; + size_t year_doy = MergeYearDoy(year, doy); + + EXPECT_EQ(2023190, year_doy); +} + +/** + * @brief Test PerseFromYearDoy + */ +TEST(IgsProductName, PerseFromYearDoy) { + size_t year = 1989; + size_t doy = 84; + size_t year_doy = MergeYearDoy(year, doy); + + EXPECT_EQ(year, PerseYearFromYearDoy(year_doy)); + EXPECT_EQ(doy, PerseDoyFromYearDoy(year_doy)); + + year_doy = 1989365; + EXPECT_EQ(1989, PerseYearFromYearDoy(year_doy)); + EXPECT_EQ(365, PerseDoyFromYearDoy(year_doy)); + + year_doy = 2000001; + EXPECT_EQ(2000, PerseYearFromYearDoy(year_doy)); + EXPECT_EQ(001, PerseDoyFromYearDoy(year_doy)); +} + +/** + * @brief Test IncrementYearDoy + */ +TEST(IgsProductName, IncrementYearDoy) { + size_t year_doy = 2024030; + year_doy = IncrementYearDoy(year_doy); + EXPECT_EQ(2024031, year_doy); + + // Year update + year_doy = 2023365; + year_doy = IncrementYearDoy(year_doy); + EXPECT_EQ(2024001, year_doy); + + // Leap year + year_doy = 2024365; + year_doy = IncrementYearDoy(year_doy); + EXPECT_EQ(2024366, year_doy); + year_doy = IncrementYearDoy(year_doy); + EXPECT_EQ(2025001, year_doy); +} diff --git a/src/library/gnss/test_sp3_file_reader.cpp b/src/math_physics/gnss/test_sp3_file_reader.cpp similarity index 96% rename from src/library/gnss/test_sp3_file_reader.cpp rename to src/math_physics/gnss/test_sp3_file_reader.cpp index ef8e3e245..2f9672ab0 100644 --- a/src/library/gnss/test_sp3_file_reader.cpp +++ b/src/math_physics/gnss/test_sp3_file_reader.cpp @@ -6,11 +6,13 @@ #include "sp3_file_reader.hpp" +using namespace s2e::gnss; + /** * @brief Test Constructor */ TEST(Sp3FileReader, Constructor) { - std::string test_file_name = "/src/library/gnss/example.sp3"; + std::string test_file_name = "/src/math_physics/gnss/example.sp3"; Sp3FileReader sp3_file(CORE_DIR_FROM_EXE + test_file_name); // Test Header diff --git a/src/library/gravity/gravity_potential.cpp b/src/math_physics/gravity/gravity_potential.cpp similarity index 97% rename from src/library/gravity/gravity_potential.cpp rename to src/math_physics/gravity/gravity_potential.cpp index 895273523..05f502fa5 100644 --- a/src/library/gravity/gravity_potential.cpp +++ b/src/math_physics/gravity/gravity_potential.cpp @@ -10,6 +10,8 @@ #include #include +namespace s2e::gravity { + GravityPotential::GravityPotential(const size_t degree, const std::vector> cosine_coefficients, const std::vector> sine_coefficients, const double gravity_constants_m3_s2, const double center_body_radius_m) @@ -26,8 +28,8 @@ GravityPotential::GravityPotential(const size_t degree, const std::vector GravityPotential::CalcAcceleration_xcxf_m_s2(const libra::Vector<3> &position_xcxf_m) { - libra::Vector<3> acceleration_xcxf_m_s2(0.0); +math::Vector<3> GravityPotential::CalcAcceleration_xcxf_m_s2(const math::Vector<3> &position_xcxf_m) { + math::Vector<3> acceleration_xcxf_m_s2(0.0); if (degree_ <= 0) return acceleration_xcxf_m_s2; // TODO: Consider this assertion is needed xcxf_x_m_ = position_xcxf_m[0]; @@ -93,8 +95,8 @@ libra::Vector<3> GravityPotential::CalcAcceleration_xcxf_m_s2(const libra::Vecto return acceleration_xcxf_m_s2; } -libra::Matrix<3, 3> GravityPotential::CalcPartialDerivative_xcxf_s2(const libra::Vector<3> &position_xcxf_m) { - libra::Matrix<3, 3> partial_derivative(0.0); +math::Matrix<3, 3> GravityPotential::CalcPartialDerivative_xcxf_s2(const math::Vector<3> &position_xcxf_m) { + math::Matrix<3, 3> partial_derivative(0.0); if (degree_ <= 0) return partial_derivative; xcxf_x_m_ = position_xcxf_m[0]; @@ -275,3 +277,5 @@ void GravityPotential::v_w_nm_update(double *v_nm, double *w_nm, const double v_ *w_nm = c_normalize * (c1 * z_tmp * w_prev - c2 * c2_normalize * re_tmp * w_prev2); return; } + +} // namespace s2e::gravity diff --git a/src/library/gravity/gravity_potential.hpp b/src/math_physics/gravity/gravity_potential.hpp similarity index 93% rename from src/library/gravity/gravity_potential.hpp rename to src/math_physics/gravity/gravity_potential.hpp index 37af3c634..bf06ee4d2 100644 --- a/src/library/gravity/gravity_potential.hpp +++ b/src/math_physics/gravity/gravity_potential.hpp @@ -12,6 +12,8 @@ #include "../math/matrix.hpp" #include "../math/vector.hpp" +namespace s2e::gravity { + /** * @class GravityPotential * @brief Class to calculate gravity potential @@ -46,7 +48,7 @@ class GravityPotential { * @param [in] position_xcxf_m: Position of the spacecraft in the XCXF frame [m] * @return Acceleration in XCXF frame [m/s2] */ - libra::Vector<3> CalcAcceleration_xcxf_m_s2(const libra::Vector<3> &position_xcxf_m); + math::Vector<3> CalcAcceleration_xcxf_m_s2(const math::Vector<3> &position_xcxf_m); /** * @fn CalcAcceleration_xcxf_m_s2 @@ -54,7 +56,7 @@ class GravityPotential { * @param [in] position_xcxf_m: Position of the spacecraft in the XCXF frame [m] * @return Partial derivative of acceleration in XCXF frame [-/s2] */ - libra::Matrix<3, 3> CalcPartialDerivative_xcxf_s2(const libra::Vector<3> &position_xcxf_m); + math::Matrix<3, 3> CalcPartialDerivative_xcxf_s2(const math::Vector<3> &position_xcxf_m); private: size_t degree_ = 0; //!< Maximum degree @@ -83,4 +85,6 @@ class GravityPotential { void v_w_nm_update(double *v_nm, double *w_nm, const double v_prev, const double w_prev, const double v_prev2, const double w_prev2); }; +} // namespace s2e::gravity + #endif // S2E_LIBRARY_GRAVITY_GRAVITY_POTENTIAL_HPP_ diff --git a/src/library/gravity/test_gravity_potential.cpp b/src/math_physics/gravity/test_gravity_potential.cpp similarity index 72% rename from src/library/gravity/test_gravity_potential.cpp rename to src/math_physics/gravity/test_gravity_potential.cpp index 47b745788..0dd54376e 100644 --- a/src/library/gravity/test_gravity_potential.cpp +++ b/src/math_physics/gravity/test_gravity_potential.cpp @@ -20,11 +20,11 @@ TEST(GravityPotential, Acceleration) { s_.assign(degree + 1, std::vector(degree + 1, 1.0)); // Initialize GravityPotential - GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); + s2e::gravity::GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); // Acceleration Calculation check - libra::Vector<3> position_xcxf_m; - libra::Vector<3> acceleration_xcxf_m_s2; + s2e::math::Vector<3> position_xcxf_m; + s2e::math::Vector<3> acceleration_xcxf_m_s2; const double accuracy = 1.0e-3; // Calc Acceleration @@ -62,11 +62,11 @@ TEST(GravityPotential, PartialDerivative1) { s_.assign(degree + 1, std::vector(degree + 1, 1.0)); // Initialize GravityPotential - GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); + s2e::gravity::GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); // Calculation check - libra::Vector<3> position_xcxf_m; - libra::Matrix<3, 3> partial_derivative_xcxf_s2; + s2e::math::Vector<3> position_xcxf_m; + s2e::math::Matrix<3, 3> partial_derivative_xcxf_s2; const double accuracy = 1.0e-3; // Calc Partial Derivative @@ -77,22 +77,22 @@ TEST(GravityPotential, PartialDerivative1) { // Calc Acceleration and numerical partial derivatives double d_r = 1e-9; - libra::Matrix<3, 3> numerical_partial_derivative_xcxf_s2; + s2e::math::Matrix<3, 3> numerical_partial_derivative_xcxf_s2; for (size_t i = 0; i < 3; i++) { - libra::Vector<3> position_1_xcxf_m = position_xcxf_m; - libra::Vector<3> position_2_xcxf_m = position_xcxf_m; + s2e::math::Vector<3> position_1_xcxf_m = position_xcxf_m; + s2e::math::Vector<3> position_2_xcxf_m = position_xcxf_m; position_1_xcxf_m[i] = position_xcxf_m[i] - d_r / 2.0; position_2_xcxf_m[i] = position_xcxf_m[i] + d_r / 2.0; - libra::Vector<3> acceleration_1_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_1_xcxf_m); - libra::Vector<3> acceleration_2_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_2_xcxf_m); - libra::Vector<3> diff_acceleration_xcxf_m_s2 = acceleration_2_xcxf_m_s2 - acceleration_1_xcxf_m_s2; + s2e::math::Vector<3> acceleration_1_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_1_xcxf_m); + s2e::math::Vector<3> acceleration_2_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_2_xcxf_m); + s2e::math::Vector<3> diff_acceleration_xcxf_m_s2 = acceleration_2_xcxf_m_s2 - acceleration_1_xcxf_m_s2; for (size_t j = 0; j < 3; j++) { numerical_partial_derivative_xcxf_s2[i][j] = diff_acceleration_xcxf_m_s2[j] / d_r; } } // Compare numerical and analytical calculation - libra::Matrix<3, 3> diff; + s2e::math::Matrix<3, 3> diff; for (size_t i = 0; i < 3; i++) { for (size_t j = 0; j < 3; j++) { EXPECT_NEAR(numerical_partial_derivative_xcxf_s2[i][j], partial_derivative_xcxf_s2[i][j], accuracy); @@ -115,11 +115,11 @@ TEST(GravityPotential, PartialDerivative2) { s_.assign(degree + 1, std::vector(degree + 1, 1.0)); // Initialize GravityPotential - GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); + s2e::gravity::GravityPotential gravity_potential_(degree, c_, s_, 1.0, 1.0); // Calculation check - libra::Vector<3> position_xcxf_m; - libra::Matrix<3, 3> partial_derivative_xcxf_s2; + s2e::math::Vector<3> position_xcxf_m; + s2e::math::Matrix<3, 3> partial_derivative_xcxf_s2; const double accuracy = 1.0e-3; // Calc Partial Derivative @@ -130,22 +130,22 @@ TEST(GravityPotential, PartialDerivative2) { // Calc Acceleration and numerical partial derivatives double d_r = 1e-9; - libra::Matrix<3, 3> numerical_partial_derivative_xcxf_s2; + s2e::math::Matrix<3, 3> numerical_partial_derivative_xcxf_s2; for (size_t i = 0; i < 3; i++) { - libra::Vector<3> position_1_xcxf_m = position_xcxf_m; - libra::Vector<3> position_2_xcxf_m = position_xcxf_m; + s2e::math::Vector<3> position_1_xcxf_m = position_xcxf_m; + s2e::math::Vector<3> position_2_xcxf_m = position_xcxf_m; position_1_xcxf_m[i] = position_xcxf_m[i] - d_r / 2.0; position_2_xcxf_m[i] = position_xcxf_m[i] + d_r / 2.0; - libra::Vector<3> acceleration_1_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_1_xcxf_m); - libra::Vector<3> acceleration_2_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_2_xcxf_m); - libra::Vector<3> diff_acceleration_xcxf_m_s2 = acceleration_2_xcxf_m_s2 - acceleration_1_xcxf_m_s2; + s2e::math::Vector<3> acceleration_1_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_1_xcxf_m); + s2e::math::Vector<3> acceleration_2_xcxf_m_s2 = gravity_potential_.CalcAcceleration_xcxf_m_s2(position_2_xcxf_m); + s2e::math::Vector<3> diff_acceleration_xcxf_m_s2 = acceleration_2_xcxf_m_s2 - acceleration_1_xcxf_m_s2; for (size_t j = 0; j < 3; j++) { numerical_partial_derivative_xcxf_s2[i][j] = diff_acceleration_xcxf_m_s2[j] / d_r; } } // Compare numerical and analytical calculation - libra::Matrix<3, 3> diff; + s2e::math::Matrix<3, 3> diff; for (size_t i = 0; i < 3; i++) { for (size_t j = 0; j < 3; j++) { EXPECT_NEAR(numerical_partial_derivative_xcxf_s2[i][j], partial_derivative_xcxf_s2[i][j], accuracy); diff --git a/src/library/math/constants.hpp b/src/math_physics/math/constants.hpp similarity index 97% rename from src/library/math/constants.hpp rename to src/math_physics/math/constants.hpp index 998b265fd..7a6f0cf21 100644 --- a/src/library/math/constants.hpp +++ b/src/math_physics/math/constants.hpp @@ -8,7 +8,7 @@ #include // std::is_floating_point_v -namespace libra { +namespace s2e::math { // instead of C++20 std::numbers inline namespace numbers { @@ -47,6 +47,6 @@ DEFINE_MATH_CONSTANT(rad_s_to_rpm, 60.0L / tau) /* rad/s to rpm */ #undef DEFINE_MATH_CONSTANT } // namespace numbers -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_CONSTANTS_HPP_ diff --git a/src/library/math/interpolation.cpp b/src/math_physics/math/interpolation.cpp similarity index 98% rename from src/library/math/interpolation.cpp rename to src/math_physics/math/interpolation.cpp index c787d98f5..2cab687a6 100644 --- a/src/library/math/interpolation.cpp +++ b/src/math_physics/math/interpolation.cpp @@ -7,7 +7,7 @@ #include -namespace libra { +namespace s2e::math { double Interpolation::CalcPolynomial(const double x) const { // Search nearest point @@ -94,4 +94,4 @@ size_t Interpolation::FindNearestPoint(const double x) const { return output; } -} // namespace libra +} // namespace s2e::math diff --git a/src/library/math/interpolation.hpp b/src/math_physics/math/interpolation.hpp similarity index 98% rename from src/library/math/interpolation.hpp rename to src/math_physics/math/interpolation.hpp index ef71186b4..f9815bc78 100644 --- a/src/library/math/interpolation.hpp +++ b/src/math_physics/math/interpolation.hpp @@ -9,7 +9,7 @@ #include #include -namespace libra { +namespace s2e::math { /** * @class Interpolation @@ -90,6 +90,6 @@ class Interpolation { size_t FindNearestPoint(const double x) const; }; -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_INTERPOLATION_HPP_ diff --git a/src/library/math/matrix.hpp b/src/math_physics/math/matrix.hpp similarity index 99% rename from src/library/math/matrix.hpp rename to src/math_physics/math/matrix.hpp index 4b9f6b91f..a731e1d79 100644 --- a/src/library/math/matrix.hpp +++ b/src/math_physics/math/matrix.hpp @@ -9,7 +9,7 @@ #include // for size_t #include // for ostream, cout -namespace libra { +namespace s2e::math { /** * @class Matrix @@ -244,7 +244,7 @@ Matrix MakeRotationMatrixY(const double& theta_rad); template Matrix MakeRotationMatrixZ(const double& theta_rad); -} // namespace libra +} // namespace s2e::math #include "matrix_template_functions.hpp" diff --git a/src/library/math/matrix_template_functions.hpp b/src/math_physics/math/matrix_template_functions.hpp similarity index 98% rename from src/library/math/matrix_template_functions.hpp rename to src/math_physics/math/matrix_template_functions.hpp index a31c74a35..56685a685 100644 --- a/src/library/math/matrix_template_functions.hpp +++ b/src/math_physics/math/matrix_template_functions.hpp @@ -9,7 +9,7 @@ #include #include // for cout -namespace libra { +namespace s2e::math { template Matrix::Matrix(const T& n) { @@ -186,6 +186,6 @@ Matrix MakeRotationMatrixZ(const double& theta_rad) { return m; } -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_MATRIX_TEMPLATE_FUNCTIONS_HPP_ diff --git a/src/library/math/matrix_vector.hpp b/src/math_physics/math/matrix_vector.hpp similarity index 97% rename from src/library/math/matrix_vector.hpp rename to src/math_physics/math/matrix_vector.hpp index 5e932fbb3..1d4803ded 100644 --- a/src/library/math/matrix_vector.hpp +++ b/src/math_physics/math/matrix_vector.hpp @@ -9,7 +9,7 @@ #include "matrix.hpp" #include "vector.hpp" -namespace libra { +namespace s2e::math { /** * @fn operator* @@ -52,7 +52,7 @@ Matrix& LuDecomposition(Matrix& matrix, size_t index[]); template Vector& SolveLinearSystemWithLu(const Matrix& matrix, const size_t index[], Vector& vector); -} // namespace libra +} // namespace s2e::math #include "matrix_vector_template_functions.hpp" diff --git a/src/library/math/matrix_vector_template_functions.hpp b/src/math_physics/math/matrix_vector_template_functions.hpp similarity index 98% rename from src/library/math/matrix_vector_template_functions.hpp rename to src/math_physics/math/matrix_vector_template_functions.hpp index 5955dad48..31289721b 100644 --- a/src/library/math/matrix_vector_template_functions.hpp +++ b/src/math_physics/math/matrix_vector_template_functions.hpp @@ -8,7 +8,7 @@ #include // for invalid_argument. -namespace libra { +namespace s2e::math { template Vector operator*(const Matrix& matrix, const Vector& vector) { @@ -139,6 +139,6 @@ Vector& SolveLinearSystemWithLu(const Matrix& a, const size_t index[], return b; } -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_MATRIX_VECTOR_TEMPLATE_FUNCTIONS_HPP_ diff --git a/src/library/math/ordinary_differential_equation.hpp b/src/math_physics/math/ordinary_differential_equation.hpp similarity index 96% rename from src/library/math/ordinary_differential_equation.hpp rename to src/math_physics/math/ordinary_differential_equation.hpp index 4ac81717b..1c861a391 100644 --- a/src/library/math/ordinary_differential_equation.hpp +++ b/src/math_physics/math/ordinary_differential_equation.hpp @@ -8,7 +8,7 @@ #include "./vector.hpp" -namespace libra { +namespace s2e::math { /** * @class OrdinaryDifferentialEquation @@ -102,7 +102,7 @@ class OrdinaryDifferentialEquation { * @fn GetState * @brief Return current state vector for inheriting class */ - inline libra::Vector& GetState() { return state_; } + inline math::Vector& GetState() { return state_; } private: double independent_variable_; //!< Latest value of independent variable @@ -111,7 +111,7 @@ class OrdinaryDifferentialEquation { double step_width_s_; //!< Step width }; -} // namespace libra +} // namespace s2e::math #include "./ordinary_differential_equation_template_functions.hpp" diff --git a/src/library/math/ordinary_differential_equation_template_functions.hpp b/src/math_physics/math/ordinary_differential_equation_template_functions.hpp similarity index 97% rename from src/library/math/ordinary_differential_equation_template_functions.hpp rename to src/math_physics/math/ordinary_differential_equation_template_functions.hpp index 644a77589..334be563a 100644 --- a/src/library/math/ordinary_differential_equation_template_functions.hpp +++ b/src/math_physics/math/ordinary_differential_equation_template_functions.hpp @@ -5,7 +5,7 @@ #ifndef S2E_LIBRARY_MATH_ORDINARY_DIFFERENTIA_EQUATION_TEMPLATE_FUNCTIONS_HPP_ #define S2E_LIBRARY_MATH_ORDINARY_DIFFERENTIA_EQUATION_TEMPLATE_FUNCTIONS_HPP_ -namespace libra { +namespace s2e::math { template OrdinaryDifferentialEquation::OrdinaryDifferentialEquation(double step_width_s) @@ -44,6 +44,6 @@ void OrdinaryDifferentialEquation::Update() { independent_variable_ += step_width_s_; // Update independent variable } -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_ORDINARY_DIFFERENTIA_EQUATION_TEMPLATE_FUNCTIONS_HPP_ diff --git a/src/library/math/quaternion.cpp b/src/math_physics/math/quaternion.cpp similarity index 99% rename from src/library/math/quaternion.cpp rename to src/math_physics/math/quaternion.cpp index a6b398a1c..d2f28f085 100644 --- a/src/library/math/quaternion.cpp +++ b/src/math_physics/math/quaternion.cpp @@ -9,7 +9,7 @@ #include #include -namespace libra { +namespace s2e::math { Quaternion::Quaternion(const Vector<3>& rotation_axis, const double rotation_angle_rad) { double half_rotation_angle_rad = rotation_angle_rad * 0.5; @@ -236,4 +236,4 @@ Vector<3> Quaternion::InverseFrameConversion(const Vector<3>& vector) const { Vector<4> Quaternion::ConvertToVector() { return quaternion_; } -} // namespace libra +} // namespace s2e::math diff --git a/src/library/math/quaternion.hpp b/src/math_physics/math/quaternion.hpp similarity index 99% rename from src/library/math/quaternion.hpp rename to src/math_physics/math/quaternion.hpp index e49722e64..1980ec8c1 100644 --- a/src/library/math/quaternion.hpp +++ b/src/math_physics/math/quaternion.hpp @@ -9,7 +9,7 @@ #include "matrix.hpp" #include "vector.hpp" -namespace libra { +namespace s2e::math { /** * @class Quaternion @@ -203,6 +203,6 @@ Quaternion operator*(const Quaternion& lhs, const Vector<3>& rhs); * @return Quaternion */ Quaternion operator*(const double& lhs, const Quaternion& rhs); -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_QUATERNION_HPP_ diff --git a/src/library/math/s2e_math.cpp b/src/math_physics/math/s2e_math.cpp similarity index 55% rename from src/library/math/s2e_math.cpp rename to src/math_physics/math/s2e_math.cpp index 4ed37a10e..fb4e53e1e 100644 --- a/src/library/math/s2e_math.cpp +++ b/src/math_physics/math/s2e_math.cpp @@ -5,22 +5,22 @@ #include "s2e_math.hpp" -#include +#include -namespace libra { +namespace s2e::math { double WrapTo2Pi(const double angle_rad) { double angle_out = angle_rad; if (angle_out < 0.0) { while (angle_out < 0.0) { - angle_out += libra::tau; + angle_out += math::tau; } - } else if (angle_out > libra::tau) { - while (angle_out > libra::tau) { - angle_out -= libra::tau; + } else if (angle_out > math::tau) { + while (angle_out > math::tau) { + angle_out -= math::tau; } } else { // nothing to do } return angle_out; } -} // namespace libra +} // namespace s2e::math diff --git a/src/library/math/s2e_math.hpp b/src/math_physics/math/s2e_math.hpp similarity index 87% rename from src/library/math/s2e_math.hpp rename to src/math_physics/math/s2e_math.hpp index b2095ad21..8cafb64d4 100644 --- a/src/library/math/s2e_math.hpp +++ b/src/math_physics/math/s2e_math.hpp @@ -8,7 +8,7 @@ #include -namespace libra { +namespace s2e::math { /** * @fn WrapTo2Pi @@ -17,6 +17,6 @@ namespace libra { */ double WrapTo2Pi(const double angle_rad); -} // namespace libra +} // namespace s2e::math #endif // S2E_LIBRARY_MATH_S2E_MATH_HPP_ diff --git a/src/library/math/test_interpolation.cpp b/src/math_physics/math/test_interpolation.cpp similarity index 78% rename from src/library/math/test_interpolation.cpp rename to src/math_physics/math/test_interpolation.cpp index 9b99335fa..a29f3b330 100644 --- a/src/library/math/test_interpolation.cpp +++ b/src/math_physics/math/test_interpolation.cpp @@ -15,7 +15,7 @@ TEST(Interpolation, PolynomialLinearFunction) { std::vector x{0.0, 1.0, 2.0, 3.0, 4.0}; std::vector y{0.0, 2.0, 4.0, 6.0, 8.0}; - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); double xx = 0.4; EXPECT_DOUBLE_EQ(2.0 * xx, interpolation.CalcPolynomial(xx)); @@ -31,7 +31,7 @@ TEST(Interpolation, PolynomialLinearFunction) { TEST(Interpolation, PolynomialQuadraticFunction) { std::vector x{0.0, 1.0, 2.0, 3.0, 4.0}; std::vector y{0.0, 1.0, 4.0, 9.0, 16.0}; - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); double xx = 0.4; EXPECT_DOUBLE_EQ(pow(xx, 2.0), interpolation.CalcPolynomial(xx)); @@ -45,16 +45,16 @@ TEST(Interpolation, PolynomialQuadraticFunction) { * @brief Test for sin function with trigonometric interpolation */ TEST(Interpolation, TrigonometricSinFunction) { - std::vector x{0.0, libra::pi_2, libra::pi, libra::pi * 3.0 / 2.0, libra::tau}; + std::vector x{0.0, s2e::math::pi_2, s2e::math::pi, s2e::math::pi * 3.0 / 2.0, s2e::math::tau}; std::vector y; for (size_t i = 0; i < x.size(); i++) { y.push_back(sin(x[i])); } - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); - double xx = 0.4 * libra::pi; + double xx = 0.4 * s2e::math::pi; EXPECT_DOUBLE_EQ(sin(xx), interpolation.CalcTrigonometric(xx)); - xx = 1.4 * libra::pi; + xx = 1.4 * s2e::math::pi; EXPECT_DOUBLE_EQ(sin(xx), interpolation.CalcTrigonometric(xx)); } @@ -62,16 +62,16 @@ TEST(Interpolation, TrigonometricSinFunction) { * @brief Test for cos function with trigonometric interpolation */ TEST(Interpolation, TrigonometricCosFunction) { - std::vector x{0.0, 0.3 * libra::pi_2, 0.6 * libra::pi_2, 0.9 * libra::pi_2, 1.2 * libra::pi_2}; + std::vector x{0.0, 0.3 * s2e::math::pi_2, 0.6 * s2e::math::pi_2, 0.9 * s2e::math::pi_2, 1.2 * s2e::math::pi_2}; std::vector y; for (size_t i = 0; i < x.size(); i++) { y.push_back(cos(x[i])); } - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); - double xx = 0.1 * libra::pi_2; + double xx = 0.1 * s2e::math::pi_2; EXPECT_NEAR(cos(xx), interpolation.CalcTrigonometric(xx), 1e-6); - xx = 0.8 * libra::pi_2; + xx = 0.8 * s2e::math::pi_2; EXPECT_NEAR(cos(xx), interpolation.CalcTrigonometric(xx), 1e-6); } @@ -79,16 +79,16 @@ TEST(Interpolation, TrigonometricCosFunction) { * @brief Test for cos function with trigonometric interpolation */ TEST(Interpolation, TrigonometricCosSinFunctionOddDegree) { - std::vector x{0.0, 0.3 * libra::pi_2, 0.6 * libra::pi_2, 0.9 * libra::pi_2, 1.2 * libra::pi_2, 1.5 * libra::pi_2}; + std::vector x{0.0, 0.3 * s2e::math::pi_2, 0.6 * s2e::math::pi_2, 0.9 * s2e::math::pi_2, 1.2 * s2e::math::pi_2, 1.5 * s2e::math::pi_2}; std::vector y; for (size_t i = 0; i < x.size(); i++) { y.push_back(cos(x[i]) + sin(x[i])); } - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); - double xx = 0.1 * libra::pi_2; + double xx = 0.1 * s2e::math::pi_2; EXPECT_NEAR(cos(xx) + sin(xx), interpolation.CalcTrigonometric(xx), 1e-6); - xx = 0.8 * libra::pi_2; + xx = 0.8 * s2e::math::pi_2; EXPECT_NEAR(cos(xx) + sin(xx), interpolation.CalcTrigonometric(xx), 1e-6); } @@ -98,7 +98,7 @@ TEST(Interpolation, TrigonometricCosSinFunctionOddDegree) { TEST(Interpolation, PushAndPop) { std::vector x{0.0, 1.0, 2.0, 3.0, 4.0}; std::vector y{0.0, 2.0, 4.0, 6.0, 8.0}; - libra::Interpolation interpolation(x, y); + s2e::math::Interpolation interpolation(x, y); EXPECT_EQ(x.size(), interpolation.GetDegree()); for (size_t i = 0; i < x.size(); i++) { diff --git a/src/library/math/test_matrix.cpp b/src/math_physics/math/test_matrix.cpp similarity index 85% rename from src/library/math/test_matrix.cpp rename to src/math_physics/math/test_matrix.cpp index 87080d601..9b23c15d5 100644 --- a/src/library/math/test_matrix.cpp +++ b/src/math_physics/math/test_matrix.cpp @@ -14,7 +14,7 @@ TEST(Matrix, ConstructorWithNumber) { const size_t R = 6; const size_t C = 3; double initialize_value = 2.0; - libra::Matrix m(initialize_value); + s2e::math::Matrix m(initialize_value); for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -30,7 +30,7 @@ TEST(Matrix, ConstructorWithNumber) { TEST(Matrix, GetLength) { const size_t R = 6; const size_t C = 3; - libra::Matrix m; + s2e::math::Matrix m; EXPECT_EQ(R, m.GetRowLength()); EXPECT_EQ(C, m.GetColumnLength()); @@ -43,8 +43,8 @@ TEST(Matrix, OperatorPlusEqual) { const size_t R = 6; const size_t C = 3; double initialize_value = 2.0; - libra::Matrix m(initialize_value); - libra::Matrix adding; + s2e::math::Matrix m(initialize_value); + s2e::math::Matrix adding; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -71,8 +71,8 @@ TEST(Matrix, OperatorMinusEqual) { const size_t R = 6; const size_t C = 3; double initialize_value = 2.0; - libra::Matrix m(initialize_value); - libra::Matrix subtracting; + s2e::math::Matrix m(initialize_value); + s2e::math::Matrix subtracting; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -99,7 +99,7 @@ TEST(Matrix, OperatorMultiplyEqual) { const size_t R = 6; const size_t C = 3; - libra::Matrix m; + s2e::math::Matrix m; double multiplying = 2.0; for (size_t r = 0; r < R; r++) { @@ -125,7 +125,7 @@ TEST(Matrix, OperatorDivideEqual) { const size_t R = 6; const size_t C = 3; - libra::Matrix m; + s2e::math::Matrix m; double dividing = 2.0; for (size_t r = 0; r < R; r++) { @@ -152,7 +152,7 @@ TEST(Matrix, FillUp) { const size_t C = 3; double value = 3.0; - libra::Matrix m; + s2e::math::Matrix m; m.FillUp(value); @@ -169,7 +169,7 @@ TEST(Matrix, FillUp) { */ TEST(Matrix, CalcTrace) { const size_t N = 6; - libra::Matrix m; + s2e::math::Matrix m; for (size_t r = 0; r < N; r++) { for (size_t c = 0; c < N; c++) { @@ -201,8 +201,8 @@ TEST(Matrix, OperatorPlus) { const size_t R = 6; const size_t C = 3; double initialize_value = -2.0; - libra::Matrix m(initialize_value); - libra::Matrix adding; + s2e::math::Matrix m(initialize_value); + s2e::math::Matrix adding; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -210,7 +210,7 @@ TEST(Matrix, OperatorPlus) { } } - libra::Matrix added = m + adding; + s2e::math::Matrix added = m + adding; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -230,8 +230,8 @@ TEST(Matrix, OperatorMinus) { const size_t R = 6; const size_t C = 3; double initialize_value = 0.6; - libra::Matrix m(initialize_value); - libra::Matrix subtracting; + s2e::math::Matrix m(initialize_value); + s2e::math::Matrix subtracting; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -239,7 +239,7 @@ TEST(Matrix, OperatorMinus) { } } - libra::Matrix subtracted = m - subtracting; + s2e::math::Matrix subtracted = m - subtracting; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -259,7 +259,7 @@ TEST(Matrix, OperatorMultiplyScalar) { const size_t R = 6; const size_t C = 3; - libra::Matrix m; + s2e::math::Matrix m; double multiplying = 0.3; for (size_t r = 0; r < R; r++) { @@ -268,7 +268,7 @@ TEST(Matrix, OperatorMultiplyScalar) { } } - libra::Matrix subtracted = multiplying * m; + s2e::math::Matrix subtracted = multiplying * m; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -287,8 +287,8 @@ TEST(Matrix, OperatorMultiplyMatrix) { const size_t R = 2; const size_t C = 3; - libra::Matrix a; - libra::Matrix b; + s2e::math::Matrix a; + s2e::math::Matrix b; a[0][0] = 1.0; a[0][1] = 2.0; @@ -304,7 +304,7 @@ TEST(Matrix, OperatorMultiplyMatrix) { b[2][0] = 5.0; b[2][1] = 6.0; - libra::Matrix result = a * b; + s2e::math::Matrix result = a * b; EXPECT_DOUBLE_EQ(22.0, result[0][0]); EXPECT_DOUBLE_EQ(28.0, result[0][1]); @@ -319,14 +319,14 @@ TEST(Matrix, Transpose) { const size_t R = 6; const size_t C = 3; - libra::Matrix m; + s2e::math::Matrix m; for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { m[r][c] = r * c; } } - libra::Matrix transposed = m.Transpose(); + s2e::math::Matrix transposed = m.Transpose(); for (size_t r = 0; r < R; r++) { for (size_t c = 0; c < C; c++) { @@ -344,7 +344,7 @@ TEST(Matrix, Transpose) { TEST(Matrix, MakeIdentityMatrix) { const size_t N = 6; - libra::Matrix m = libra::MakeIdentityMatrix(); + s2e::math::Matrix m = s2e::math::MakeIdentityMatrix(); for (size_t r = 0; r < N; r++) { for (size_t c = 0; c < N; c++) { @@ -362,9 +362,9 @@ TEST(Matrix, MakeIdentityMatrix) { */ TEST(Matrix, MakeRotationMatrixX) { const size_t N = 3; - double theta_rad = -45.0 * libra::deg_to_rad; + double theta_rad = -45.0 * s2e::math::deg_to_rad; - libra::Matrix m = libra::MakeRotationMatrixX(theta_rad); + s2e::math::Matrix m = s2e::math::MakeRotationMatrixX(theta_rad); EXPECT_DOUBLE_EQ(1.0, m[0][0]); EXPECT_DOUBLE_EQ(0.0, m[0][1]); @@ -382,9 +382,9 @@ TEST(Matrix, MakeRotationMatrixX) { */ TEST(Matrix, MakeRotationMatrixY) { const size_t N = 3; - double theta_rad = 120.0 * libra::deg_to_rad; + double theta_rad = 120.0 * s2e::math::deg_to_rad; - libra::Matrix m = libra::MakeRotationMatrixY(theta_rad); + s2e::math::Matrix m = s2e::math::MakeRotationMatrixY(theta_rad); EXPECT_DOUBLE_EQ(cos(theta_rad), m[0][0]); EXPECT_DOUBLE_EQ(0.0, m[0][1]); @@ -402,9 +402,9 @@ TEST(Matrix, MakeRotationMatrixY) { */ TEST(Matrix, MakeRotationMatrixZ) { const size_t N = 3; - double theta_rad = 30.0 * libra::deg_to_rad; + double theta_rad = 30.0 * s2e::math::deg_to_rad; - libra::Matrix m = libra::MakeRotationMatrixZ(theta_rad); + s2e::math::Matrix m = s2e::math::MakeRotationMatrixZ(theta_rad); EXPECT_DOUBLE_EQ(cos(theta_rad), m[0][0]); EXPECT_DOUBLE_EQ(sin(theta_rad), m[0][1]); diff --git a/src/library/math/test_matrix_vector.cpp b/src/math_physics/math/test_matrix_vector.cpp similarity index 86% rename from src/library/math/test_matrix_vector.cpp rename to src/math_physics/math/test_matrix_vector.cpp index af17b6fe2..958a409b6 100644 --- a/src/library/math/test_matrix_vector.cpp +++ b/src/math_physics/math/test_matrix_vector.cpp @@ -14,8 +14,8 @@ TEST(MatrixVector, MultiplyMatrixVector) { const size_t R = 3; const size_t C = 2; - libra::Matrix m; - libra::Vector v; + s2e::math::Matrix m; + s2e::math::Vector v; m[0][0] = 1.0; m[0][1] = 2.0; @@ -27,7 +27,7 @@ TEST(MatrixVector, MultiplyMatrixVector) { v[0] = 7.0; v[1] = 1.0; - libra::Vector result = m * v; + s2e::math::Vector result = m * v; EXPECT_DOUBLE_EQ(9.0, result[0]); EXPECT_DOUBLE_EQ(-7.0, result[1]); @@ -40,7 +40,7 @@ TEST(MatrixVector, MultiplyMatrixVector) { TEST(MatrixVector, CalcInverseMatrix) { const size_t N = 3; - libra::Matrix m; + s2e::math::Matrix m; m[0][0] = 1.0; m[0][1] = 1.0; @@ -52,7 +52,7 @@ TEST(MatrixVector, CalcInverseMatrix) { m[2][1] = -2.0; m[2][2] = 1.0; - libra::Matrix inverse = libra::CalcInverseMatrix(m); + s2e::math::Matrix inverse = s2e::math::CalcInverseMatrix(m); EXPECT_NEAR(-1.0, inverse[0][0], 1e-10); EXPECT_NEAR(-1.0, inverse[0][1], 1e-10); diff --git a/src/library/math/test_quaternion.cpp b/src/math_physics/math/test_quaternion.cpp similarity index 73% rename from src/library/math/test_quaternion.cpp rename to src/math_physics/math/test_quaternion.cpp index 12053cca2..2821eccee 100644 --- a/src/library/math/test_quaternion.cpp +++ b/src/math_physics/math/test_quaternion.cpp @@ -11,7 +11,7 @@ * @brief Test for constructor from four numbers */ TEST(Quaternion, ConstructorFourNumber) { - libra::Quaternion q(0.5, 0.5, 0.5, 0.5); + s2e::math::Quaternion q(0.5, 0.5, 0.5, 0.5); EXPECT_DOUBLE_EQ(0.5, q[0]); EXPECT_DOUBLE_EQ(0.5, q[1]); @@ -23,8 +23,8 @@ TEST(Quaternion, ConstructorFourNumber) { * @brief Test for constructor from Vector */ TEST(Quaternion, ConstructorVector) { - libra::Vector<4> v(0.5); - libra::Quaternion q(v); + s2e::math::Vector<4> v(0.5); + s2e::math::Quaternion q(v); EXPECT_DOUBLE_EQ(0.5, q[0]); EXPECT_DOUBLE_EQ(0.5, q[1]); @@ -36,12 +36,12 @@ TEST(Quaternion, ConstructorVector) { * @brief Test for constructor from axis and rotation angle X rotation */ TEST(Quaternion, ConstructorAxisAndAngleX) { - libra::Vector<3> axis; + s2e::math::Vector<3> axis; axis[0] = 1.0; axis[1] = 0.0; axis[2] = 0.0; - double theta_rad = 90 * libra::deg_to_rad; - libra::Quaternion q(axis, theta_rad); + double theta_rad = 90 * s2e::math::deg_to_rad; + s2e::math::Quaternion q(axis, theta_rad); EXPECT_NEAR(axis[0] * sin(theta_rad / 2.0), q[0], 1e-5); EXPECT_NEAR(axis[1] * sin(theta_rad / 2.0), q[1], 1e-5); @@ -53,12 +53,12 @@ TEST(Quaternion, ConstructorAxisAndAngleX) { * @brief Test for constructor from axis and rotation angle Y rotation */ TEST(Quaternion, ConstructorAxisAndAngleY) { - libra::Vector<3> axis; + s2e::math::Vector<3> axis; axis[0] = 0.0; axis[1] = 1.0; axis[2] = 0.0; - double theta_rad = 45 * libra::deg_to_rad; - libra::Quaternion q(axis, theta_rad); + double theta_rad = 45 * s2e::math::deg_to_rad; + s2e::math::Quaternion q(axis, theta_rad); EXPECT_NEAR(axis[0] * sin(theta_rad / 2.0), q[0], 1e-5); EXPECT_NEAR(axis[1] * sin(theta_rad / 2.0), q[1], 1e-5); @@ -70,12 +70,12 @@ TEST(Quaternion, ConstructorAxisAndAngleY) { * @brief Test for constructor from axis and rotation angle Z rotation */ TEST(Quaternion, ConstructorAxisAndAngleZ) { - libra::Vector<3> axis; + s2e::math::Vector<3> axis; axis[0] = 0.0; axis[1] = 0.0; axis[2] = 1.0; - double theta_rad = -60 * libra::deg_to_rad; - libra::Quaternion q(axis, theta_rad); + double theta_rad = -60 * s2e::math::deg_to_rad; + s2e::math::Quaternion q(axis, theta_rad); EXPECT_NEAR(axis[0] * sin(theta_rad / 2.0), q[0], 1e-5); EXPECT_NEAR(axis[1] * sin(theta_rad / 2.0), q[1], 1e-5); @@ -87,12 +87,12 @@ TEST(Quaternion, ConstructorAxisAndAngleZ) { * @brief Test for constructor from axis and rotation angle All axes rotation */ TEST(Quaternion, ConstructorAxisAndAngleAll) { - libra::Vector<3> axis; + s2e::math::Vector<3> axis; axis[0] = 1.0; axis[1] = 1.0; axis[2] = 1.0; - double theta_rad = 180 * libra::deg_to_rad; - libra::Quaternion q(axis, theta_rad); + double theta_rad = 180 * s2e::math::deg_to_rad; + s2e::math::Quaternion q(axis, theta_rad); EXPECT_NEAR(axis[0] * sin(theta_rad / 2.0), q[0], 1e-5); EXPECT_NEAR(axis[1] * sin(theta_rad / 2.0), q[1], 1e-5); @@ -104,16 +104,16 @@ TEST(Quaternion, ConstructorAxisAndAngleAll) { * @brief Test for constructor from two vectors: No rotation */ TEST(Quaternion, ConstructorTwoVectorsNoRotation) { - libra::Vector<3> before; + s2e::math::Vector<3> before; before[0] = 0.0; before[1] = 0.0; before[2] = 2.0; // To check normalization - libra::Vector<3> after; + s2e::math::Vector<3> after; after[0] = 0.0; after[1] = 0.0; after[2] = 1.0; - libra::Quaternion q(before, after); + s2e::math::Quaternion q(before, after); EXPECT_NEAR(0.0, q[0], 1e-5); EXPECT_NEAR(0.0, q[1], 1e-5); @@ -125,18 +125,18 @@ TEST(Quaternion, ConstructorTwoVectorsNoRotation) { * @brief Test for constructor from two vectors: X rotation */ TEST(Quaternion, ConstructorTwoVectorsX) { - libra::Vector<3> before; + s2e::math::Vector<3> before; before[0] = 0.0; before[1] = 0.0; before[2] = 1.0; - libra::Vector<3> after; + s2e::math::Vector<3> after; after[0] = 0.0; after[1] = 1.0; after[2] = 0.0; - libra::Quaternion q(before, after); + s2e::math::Quaternion q(before, after); - double theta_rad = -90 * libra::deg_to_rad; + double theta_rad = -90 * s2e::math::deg_to_rad; EXPECT_NEAR(sin(theta_rad / 2.0), q[0], 1e-5); EXPECT_NEAR(0.0, q[1], 1e-5); EXPECT_NEAR(0.0, q[2], 1e-5); @@ -147,18 +147,18 @@ TEST(Quaternion, ConstructorTwoVectorsX) { * @brief Test for constructor from two vectors: Y rotation */ TEST(Quaternion, ConstructorTwoVectorsY) { - libra::Vector<3> before; + s2e::math::Vector<3> before; before[0] = 0.0; before[1] = 0.0; before[2] = 1.0; - libra::Vector<3> after; + s2e::math::Vector<3> after; after[0] = 1.0; after[1] = 0.0; after[2] = 0.0; - libra::Quaternion q(before, after); + s2e::math::Quaternion q(before, after); - double theta_rad = 90 * libra::deg_to_rad; + double theta_rad = 90 * s2e::math::deg_to_rad; EXPECT_NEAR(0.0, q[0], 1e-5); EXPECT_NEAR(sin(theta_rad / 2.0), q[1], 1e-5); EXPECT_NEAR(0.0, q[2], 1e-5); @@ -169,18 +169,18 @@ TEST(Quaternion, ConstructorTwoVectorsY) { * @brief Test for constructor from two vectors: Z rotation */ TEST(Quaternion, ConstructorTwoVectorsZ) { - libra::Vector<3> before; + s2e::math::Vector<3> before; before[0] = 1.0; before[1] = 0.0; before[2] = 0.0; - libra::Vector<3> after; + s2e::math::Vector<3> after; after[0] = 0.0; after[1] = 1.0; after[2] = 0.0; - libra::Quaternion q(before, after); + s2e::math::Quaternion q(before, after); - double theta_rad = 90 * libra::deg_to_rad; + double theta_rad = 90 * s2e::math::deg_to_rad; EXPECT_NEAR(0.0, q[0], 1e-5); EXPECT_NEAR(0.0, q[1], 1e-5); EXPECT_NEAR(sin(theta_rad / 2.0), q[2], 1e-5); @@ -192,7 +192,7 @@ TEST(Quaternion, ConstructorTwoVectorsZ) { * @note TODO: Fix to nondestructive function */ TEST(Quaternion, Normalize) { - libra::Quaternion q(1.0, 1.0, 1.0, 1.0); + s2e::math::Quaternion q(1.0, 1.0, 1.0, 1.0); EXPECT_DOUBLE_EQ(1.0, q[0]); EXPECT_DOUBLE_EQ(1.0, q[1]); EXPECT_DOUBLE_EQ(1.0, q[2]); @@ -209,9 +209,9 @@ TEST(Quaternion, Normalize) { * @brief Test for Conjugate */ TEST(Quaternion, Conjugate) { - libra::Quaternion q(0.5, 0.5, 0.5, 0.5); + s2e::math::Quaternion q(0.5, 0.5, 0.5, 0.5); - libra::Quaternion q_conjugate = q.Conjugate(); + s2e::math::Quaternion q_conjugate = q.Conjugate(); // Check nondestructive function EXPECT_DOUBLE_EQ(0.5, q[0]); @@ -229,10 +229,10 @@ TEST(Quaternion, Conjugate) { * @brief Test for ConvertToDcm Y rotation */ TEST(Quaternion, ConvertToDcmY) { - libra::Quaternion q(0.0, 1.0, 0.0, 1.0); + s2e::math::Quaternion q(0.0, 1.0, 0.0, 1.0); q.Normalize(); - libra::Matrix<3, 3> dcm = q.ConvertToDcm(); + s2e::math::Matrix<3, 3> dcm = q.ConvertToDcm(); // Check nondestructive function EXPECT_DOUBLE_EQ(0.0, q[0]); @@ -253,7 +253,7 @@ TEST(Quaternion, ConvertToDcmY) { EXPECT_NEAR(0.0, dcm[2][2], accuracy); // Inverse Conversion - libra::Quaternion q_from_dcm = libra::Quaternion::ConvertFromDcm(dcm); + s2e::math::Quaternion q_from_dcm = s2e::math::Quaternion::ConvertFromDcm(dcm); for (size_t i = 0; i < 4; i++) { EXPECT_NEAR(q[i], q_from_dcm[i], accuracy); } @@ -263,10 +263,10 @@ TEST(Quaternion, ConvertToDcmY) { * @brief Test for ConvertToDcm */ TEST(Quaternion, ConvertToDcm) { - libra::Quaternion q(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q(0.5, 0.3, 0.1, 1.0); q.Normalize(); - libra::Matrix<3, 3> dcm = q.ConvertToDcm(); + s2e::math::Matrix<3, 3> dcm = q.ConvertToDcm(); // Check nondestructive function const double accuracy = 1.0e-5; @@ -281,7 +281,7 @@ TEST(Quaternion, ConvertToDcm) { EXPECT_NEAR(0.4962963, dcm[2][2], accuracy); // Inverse Conversion - libra::Quaternion q_from_dcm = libra::Quaternion::ConvertFromDcm(dcm); + s2e::math::Quaternion q_from_dcm = s2e::math::Quaternion::ConvertFromDcm(dcm); for (size_t i = 0; i < 4; i++) { EXPECT_NEAR(q[i], q_from_dcm[i], accuracy); } @@ -291,10 +291,10 @@ TEST(Quaternion, ConvertToDcm) { * @brief Test for ConvertToEuler X rotation */ TEST(Quaternion, ConvertToEulerX) { - libra::Quaternion q(1.0, 0.0, 0.0, 1.0); + s2e::math::Quaternion q(1.0, 0.0, 0.0, 1.0); q.Normalize(); - libra::Vector<3> euler = q.ConvertToEuler(); + s2e::math::Vector<3> euler = q.ConvertToEuler(); // Check nondestructive function EXPECT_DOUBLE_EQ(1.0 / sqrt(2.0), q[0]); @@ -304,12 +304,12 @@ TEST(Quaternion, ConvertToEulerX) { // Check nondestructive function const double accuracy = 1.0e-7; - EXPECT_NEAR(90 * libra::deg_to_rad, euler[0], accuracy); + EXPECT_NEAR(90 * s2e::math::deg_to_rad, euler[0], accuracy); EXPECT_NEAR(0.0, euler[1], accuracy); EXPECT_NEAR(0.0, euler[2], accuracy); // Inverse Conversion - libra::Quaternion q_from_euler = libra::Quaternion::ConvertFromEuler(euler); + s2e::math::Quaternion q_from_euler = s2e::math::Quaternion::ConvertFromEuler(euler); for (size_t i = 0; i < 4; i++) { EXPECT_NEAR(q[i], q_from_euler[i], accuracy); } @@ -319,10 +319,10 @@ TEST(Quaternion, ConvertToEulerX) { * @brief Test for ConvertToEuler */ TEST(Quaternion, ConvertToEuler) { - libra::Quaternion q(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q(0.5, 0.3, 0.1, 1.0); q.Normalize(); - libra::Vector<3> euler = q.ConvertToEuler(); + s2e::math::Vector<3> euler = q.ConvertToEuler(); // Check nondestructive function const double accuracy = 1.0e-7; @@ -331,7 +331,7 @@ TEST(Quaternion, ConvertToEuler) { EXPECT_NEAR(0.41012734, euler[2], accuracy); // Inverse Conversion - libra::Quaternion q_from_euler = libra::Quaternion::ConvertFromEuler(euler); + s2e::math::Quaternion q_from_euler = s2e::math::Quaternion::ConvertFromEuler(euler); for (size_t i = 0; i < 4; i++) { EXPECT_NEAR(q[i], q_from_euler[i], accuracy); } @@ -341,22 +341,22 @@ TEST(Quaternion, ConvertToEuler) { * @brief Test for FrameConversion Z rotation */ TEST(Quaternion, FrameConversionZ) { - libra::Quaternion q(0.0, 0.0, 1.0, 1.0); + s2e::math::Quaternion q(0.0, 0.0, 1.0, 1.0); q.Normalize(); - libra::Vector<3> v; + s2e::math::Vector<3> v; v[0] = 1.0; v[1] = 0.0; v[2] = 0.0; - libra::Vector<3> v_frame_conv = q.FrameConversion(v); + s2e::math::Vector<3> v_frame_conv = q.FrameConversion(v); const double accuracy = 1.0e-7; EXPECT_NEAR(0.0, v_frame_conv[0], accuracy); EXPECT_NEAR(-1.0, v_frame_conv[1], accuracy); EXPECT_NEAR(0.0, v_frame_conv[2], accuracy); - libra::Vector<3> v_frame_conv_inv = q.InverseFrameConversion(v_frame_conv); + s2e::math::Vector<3> v_frame_conv_inv = q.InverseFrameConversion(v_frame_conv); for (size_t i = 0; i < 3; i++) { EXPECT_NEAR(v[i], v_frame_conv_inv[i], accuracy); @@ -367,15 +367,15 @@ TEST(Quaternion, FrameConversionZ) { * @brief Test for FrameConversion */ TEST(Quaternion, FrameConversion) { - libra::Quaternion q(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q(0.5, 0.3, 0.1, 1.0); q.Normalize(); - libra::Vector<3> v; + s2e::math::Vector<3> v; v[0] = 1.0; v[1] = 0.0; v[2] = 0.0; - libra::Vector<3> v_frame_conv = q.FrameConversion(v); - libra::Vector<3> v_frame_conv_inv = q.InverseFrameConversion(v_frame_conv); + s2e::math::Vector<3> v_frame_conv = q.FrameConversion(v); + s2e::math::Vector<3> v_frame_conv_inv = q.InverseFrameConversion(v_frame_conv); const double accuracy = 1.0e-7; for (size_t i = 0; i < 3; i++) { @@ -387,9 +387,9 @@ TEST(Quaternion, FrameConversion) { * @brief Test for ConvertToVector */ TEST(Quaternion, ConvertToVector) { - libra::Quaternion q(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q(0.5, 0.3, 0.1, 1.0); - libra::Vector<4> v = q.ConvertToVector(); + s2e::math::Vector<4> v = q.ConvertToVector(); for (size_t i = 0; i < 4; i++) { EXPECT_DOUBLE_EQ(q[i], v[i]); @@ -400,10 +400,10 @@ TEST(Quaternion, ConvertToVector) { * @brief Test for operator+ */ TEST(Quaternion, OperatorPlus) { - libra::Quaternion q1(0.5, 0.3, 0.1, 1.0); - libra::Quaternion q2(-0.3, 0.1, -1.0, 0.4); + s2e::math::Quaternion q1(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q2(-0.3, 0.1, -1.0, 0.4); - libra::Quaternion result = q1 + q2; + s2e::math::Quaternion result = q1 + q2; EXPECT_DOUBLE_EQ(0.2, result[0]); EXPECT_DOUBLE_EQ(0.4, result[1]); @@ -415,10 +415,10 @@ TEST(Quaternion, OperatorPlus) { * @brief Test for operator- */ TEST(Quaternion, OperatorMinus) { - libra::Quaternion q1(0.5, 0.3, 0.1, 1.0); - libra::Quaternion q2(-0.3, 0.1, -1.0, 0.4); + s2e::math::Quaternion q1(0.5, 0.3, 0.1, 1.0); + s2e::math::Quaternion q2(-0.3, 0.1, -1.0, 0.4); - libra::Quaternion result = q1 - q2; + s2e::math::Quaternion result = q1 - q2; EXPECT_DOUBLE_EQ(0.8, result[0]); EXPECT_DOUBLE_EQ(0.2, result[1]); @@ -430,10 +430,10 @@ TEST(Quaternion, OperatorMinus) { * @brief Test for operator* quaternion */ TEST(Quaternion, OperatorQuaternionMultiply) { - libra::Quaternion q1(0.289271, -0.576012, -0.420972, 0.638212); - libra::Quaternion q2(-0.0821846, 0.501761, 0.721995, -0.469259); + s2e::math::Quaternion q1(0.289271, -0.576012, -0.420972, 0.638212); + s2e::math::Quaternion q2(-0.0821846, 0.501761, 0.721995, -0.469259); - libra::Quaternion result = q1 * q2; + s2e::math::Quaternion result = q1 * q2; const double accuracy = 1.0e-7; EXPECT_NEAR(-0.3928446703722, result[0], accuracy); @@ -446,10 +446,10 @@ TEST(Quaternion, OperatorQuaternionMultiply) { * @brief Test for operator* scalar */ TEST(Quaternion, OperatorScalarMultiply) { - libra::Quaternion q(0.289271, -0.576012, -0.420972, 0.638212); + s2e::math::Quaternion q(0.289271, -0.576012, -0.420972, 0.638212); double scalar = 2.3; - libra::Quaternion result = scalar * q; + s2e::math::Quaternion result = scalar * q; const double accuracy = 1.0e-7; EXPECT_NEAR(q[0] * 2.3, result[0], accuracy); diff --git a/src/library/math/test_s2e_math.cpp b/src/math_physics/math/test_s2e_math.cpp similarity index 54% rename from src/library/math/test_s2e_math.cpp rename to src/math_physics/math/test_s2e_math.cpp index bf5b60fca..7a293b967 100644 --- a/src/library/math/test_s2e_math.cpp +++ b/src/math_physics/math/test_s2e_math.cpp @@ -14,18 +14,18 @@ TEST(S2eMath, WrapTo2Pi) { const double accuracy = 1.0e-7; double input_angle_rad = 0.0; - double wrapped_angle_rad = libra::WrapTo2Pi(input_angle_rad); + double wrapped_angle_rad = s2e::math::WrapTo2Pi(input_angle_rad); EXPECT_NEAR(0.0, wrapped_angle_rad, accuracy); input_angle_rad = -1.0e-5; - wrapped_angle_rad = libra::WrapTo2Pi(input_angle_rad); - EXPECT_NEAR(libra::tau + input_angle_rad, wrapped_angle_rad, accuracy); + wrapped_angle_rad = s2e::math::WrapTo2Pi(input_angle_rad); + EXPECT_NEAR(s2e::math::tau + input_angle_rad, wrapped_angle_rad, accuracy); - input_angle_rad = libra::tau + 1.0e-5; - wrapped_angle_rad = libra::WrapTo2Pi(input_angle_rad); + input_angle_rad = s2e::math::tau + 1.0e-5; + wrapped_angle_rad = s2e::math::WrapTo2Pi(input_angle_rad); EXPECT_NEAR(1.0e-5, wrapped_angle_rad, accuracy); - input_angle_rad = 10 * libra::tau + 1.0e-5; - wrapped_angle_rad = libra::WrapTo2Pi(input_angle_rad); + input_angle_rad = 10 * s2e::math::tau + 1.0e-5; + wrapped_angle_rad = s2e::math::WrapTo2Pi(input_angle_rad); EXPECT_NEAR(1.0e-5, wrapped_angle_rad, accuracy); } diff --git a/src/library/math/test_vector.cpp b/src/math_physics/math/test_vector.cpp similarity index 80% rename from src/library/math/test_vector.cpp rename to src/math_physics/math/test_vector.cpp index 9affb0fba..e920dc0b8 100644 --- a/src/library/math/test_vector.cpp +++ b/src/math_physics/math/test_vector.cpp @@ -13,7 +13,7 @@ TEST(Vector, ConstructorWithNumber) { const size_t N = 6; double initialize_value = 2.0; - libra::Vector v(initialize_value); + s2e::math::Vector v(initialize_value); for (size_t i = 0; i < N; i++) { EXPECT_DOUBLE_EQ(initialize_value, v[i]); @@ -26,7 +26,7 @@ TEST(Vector, ConstructorWithNumber) { */ TEST(Vector, GetLength) { const size_t N = 6; - libra::Vector v; + s2e::math::Vector v; EXPECT_EQ(N, v.GetLength()); } @@ -37,8 +37,8 @@ TEST(Vector, GetLength) { TEST(Vector, OperatorPlusEqual) { const size_t N = 6; double initialize_value = 2.0; - libra::Vector v(initialize_value); - libra::Vector adding; + s2e::math::Vector v(initialize_value); + s2e::math::Vector adding; for (size_t i = 0; i < N; i++) { adding[i] = double(i); @@ -60,8 +60,8 @@ TEST(Vector, OperatorPlusEqual) { TEST(Vector, OperatorMinusEqual) { const size_t N = 6; double initialize_value = 2.0; - libra::Vector v(initialize_value); - libra::Vector subtracting; + s2e::math::Vector v(initialize_value); + s2e::math::Vector subtracting; for (size_t i = 0; i < N; i++) { subtracting[i] = double(i); @@ -82,7 +82,7 @@ TEST(Vector, OperatorMinusEqual) { */ TEST(Vector, OperatorMultiplyEqual) { const size_t N = 6; - libra::Vector v; + s2e::math::Vector v; double multiplying = 2.0; for (size_t i = 0; i < N; i++) { @@ -104,7 +104,7 @@ TEST(Vector, OperatorMultiplyEqual) { */ TEST(Vector, OperatorDivideEqual) { const size_t N = 6; - libra::Vector v; + s2e::math::Vector v; double dividing = 3.0; for (size_t i = 0; i < N; i++) { @@ -126,13 +126,13 @@ TEST(Vector, OperatorDivideEqual) { */ TEST(Vector, OperatorNegative) { const size_t N = 6; - libra::Vector v; + s2e::math::Vector v; for (size_t i = 0; i < N; i++) { v[i] = double(i); } - libra::Vector v_negative = -v; + s2e::math::Vector v_negative = -v; for (size_t i = 0; i < N; i++) { // Check nondestructive @@ -147,7 +147,7 @@ TEST(Vector, OperatorNegative) { */ TEST(Vector, FillUp) { const size_t N = 6; - libra::Vector v; + s2e::math::Vector v; for (size_t i = 0; i < N; i++) { v[i] = double(i); @@ -171,14 +171,14 @@ TEST(Vector, FillUp) { TEST(Vector, OperatorPlus) { const size_t N = 6; double initialize_value = 2.0; - libra::Vector v(initialize_value); - libra::Vector adding; + s2e::math::Vector v(initialize_value); + s2e::math::Vector adding; for (size_t i = 0; i < N; i++) { adding[i] = double(i); } - libra::Vector added = v + adding; + s2e::math::Vector added = v + adding; for (size_t i = 0; i < N; i++) { // Check nondestructive @@ -195,14 +195,14 @@ TEST(Vector, OperatorPlus) { TEST(Vector, OperatorMinus) { const size_t N = 6; double initialize_value = 2.0; - libra::Vector v(initialize_value); - libra::Vector subtracting; + s2e::math::Vector v(initialize_value); + s2e::math::Vector subtracting; for (size_t i = 0; i < N; i++) { subtracting[i] = double(i); } - libra::Vector subtracted = v - subtracting; + s2e::math::Vector subtracted = v - subtracting; for (size_t i = 0; i < N; i++) { // Check nondestructive @@ -218,8 +218,8 @@ TEST(Vector, OperatorMinus) { */ TEST(Vector, InnerProduct) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; for (size_t i = 0; i < N; i++) { a[i] = double(i + 1); @@ -235,8 +235,8 @@ TEST(Vector, InnerProduct) { */ TEST(Vector, InnerProductZero) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 1.0; a[1] = 0.0; @@ -255,8 +255,8 @@ TEST(Vector, InnerProductZero) { */ TEST(Vector, OuterProductZero) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 1.0; a[1] = 0.0; @@ -266,7 +266,7 @@ TEST(Vector, OuterProductZero) { b[1] = 0.0; b[2] = 0.0; - libra::Vector<3> result = OuterProduct(a, b); + s2e::math::Vector<3> result = OuterProduct(a, b); for (size_t i = 0; i < N; i++) { EXPECT_DOUBLE_EQ(0.0, result[i]); @@ -278,8 +278,8 @@ TEST(Vector, OuterProductZero) { */ TEST(Vector, OuterProductX) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 0.0; a[1] = 0.0; @@ -289,7 +289,7 @@ TEST(Vector, OuterProductX) { b[1] = 1.0; b[2] = 0.0; - libra::Vector<3> result = OuterProduct(a, b); + s2e::math::Vector<3> result = OuterProduct(a, b); EXPECT_DOUBLE_EQ(-1.0, result[0]); EXPECT_DOUBLE_EQ(0.0, result[1]); @@ -301,8 +301,8 @@ TEST(Vector, OuterProductX) { */ TEST(Vector, OuterProductY) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 0.0; a[1] = 0.0; @@ -312,7 +312,7 @@ TEST(Vector, OuterProductY) { b[1] = 0.0; b[2] = 0.0; - libra::Vector<3> result = OuterProduct(a, b); + s2e::math::Vector<3> result = OuterProduct(a, b); EXPECT_DOUBLE_EQ(0.0, result[0]); EXPECT_DOUBLE_EQ(1.0, result[1]); @@ -324,8 +324,8 @@ TEST(Vector, OuterProductY) { */ TEST(Vector, OuterProductZ) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 1.0; a[1] = 0.0; @@ -335,7 +335,7 @@ TEST(Vector, OuterProductZ) { b[1] = 1.0; b[2] = 0.0; - libra::Vector<3> result = OuterProduct(a, b); + s2e::math::Vector<3> result = OuterProduct(a, b); EXPECT_DOUBLE_EQ(0.0, result[0]); EXPECT_DOUBLE_EQ(0.0, result[1]); @@ -347,7 +347,7 @@ TEST(Vector, OuterProductZ) { */ TEST(Vector, CalcNorm) { const size_t N = 10; - libra::Vector v(1.0); + s2e::math::Vector v(1.0); double norm = v.CalcNorm(); @@ -364,9 +364,9 @@ TEST(Vector, CalcNorm) { */ TEST(Vector, Normalize) { const size_t N = 5; - libra::Vector v(1.0); + s2e::math::Vector v(1.0); - libra::Vector normalized = v.CalcNormalizedVector(); + s2e::math::Vector normalized = v.CalcNormalizedVector(); for (size_t i = 0; i < N; i++) { // Check nondestructive @@ -381,8 +381,8 @@ TEST(Vector, Normalize) { */ TEST(Vector, CalcAngleTwoVectors90deg) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 1.0; a[1] = 0.0; @@ -394,7 +394,7 @@ TEST(Vector, CalcAngleTwoVectors90deg) { double angle_rad = CalcAngleTwoVectors_rad(a, b); - EXPECT_DOUBLE_EQ(90.0 * libra::deg_to_rad, angle_rad); + EXPECT_DOUBLE_EQ(90.0 * s2e::math::deg_to_rad, angle_rad); } /** @@ -402,7 +402,7 @@ TEST(Vector, CalcAngleTwoVectors90deg) { */ TEST(Vector, CalcAngleTwoVectors0deg) { const size_t N = 3; - libra::Vector a; + s2e::math::Vector a; a[0] = 1.0; a[1] = 0.0; @@ -410,7 +410,7 @@ TEST(Vector, CalcAngleTwoVectors0deg) { double angle_rad = CalcAngleTwoVectors_rad(a, a); - EXPECT_DOUBLE_EQ(0.0 * libra::deg_to_rad, angle_rad); + EXPECT_DOUBLE_EQ(0.0 * s2e::math::deg_to_rad, angle_rad); } /** @@ -418,8 +418,8 @@ TEST(Vector, CalcAngleTwoVectors0deg) { */ TEST(Vector, CalcAngleTwoVectors45deg) { const size_t N = 3; - libra::Vector a; - libra::Vector b; + s2e::math::Vector a; + s2e::math::Vector b; a[0] = 0.0; a[1] = 1.0; @@ -431,7 +431,7 @@ TEST(Vector, CalcAngleTwoVectors45deg) { double angle_rad = CalcAngleTwoVectors_rad(a, b); - EXPECT_DOUBLE_EQ(45.0 * libra::deg_to_rad, angle_rad); + EXPECT_DOUBLE_EQ(45.0 * s2e::math::deg_to_rad, angle_rad); } /** @@ -439,11 +439,11 @@ TEST(Vector, CalcAngleTwoVectors45deg) { */ TEST(Vector, GenerateOrthogonalUnitVector) { const size_t N = 3; - libra::Vector a(1.0); + s2e::math::Vector a(1.0); - libra::Vector b = GenerateOrthogonalUnitVector(a); + s2e::math::Vector b = GenerateOrthogonalUnitVector(a); double angle_rad = CalcAngleTwoVectors_rad(a, b); - EXPECT_DOUBLE_EQ(90.0 * libra::deg_to_rad, angle_rad); + EXPECT_DOUBLE_EQ(90.0 * s2e::math::deg_to_rad, angle_rad); } diff --git a/src/library/math/vector.cpp b/src/math_physics/math/vector.cpp similarity index 97% rename from src/library/math/vector.cpp rename to src/math_physics/math/vector.cpp index bd4f3501f..22a74e119 100644 --- a/src/library/math/vector.cpp +++ b/src/math_physics/math/vector.cpp @@ -7,7 +7,7 @@ #include "constants.hpp" -namespace libra { +namespace s2e::math { Vector<3, double> ConvertFrameOrthogonal2Polar(const Vector<3, double>& orthogonal) { Vector<3, double> polar; // vector on the polar coordinate polar.FillUp(0.0); @@ -51,4 +51,4 @@ Vector<3, double> GenerateOrthogonalUnitVector(const Vector<3, double>& v) { return (orthogonal_vector); } } -} // namespace libra +} // namespace s2e::math diff --git a/src/library/math/vector.hpp b/src/math_physics/math/vector.hpp similarity index 99% rename from src/library/math/vector.hpp rename to src/math_physics/math/vector.hpp index 5901c34c4..b210759e6 100644 --- a/src/library/math/vector.hpp +++ b/src/math_physics/math/vector.hpp @@ -9,10 +9,11 @@ #include // for size_t #include // for ostream, cout +namespace s2e::math { + #define dot InnerProduct #define cross OuterProduct -namespace libra { /** * @class Vector * @brief Class for mathematical vector @@ -237,7 +238,7 @@ Vector<3, double> ConvertFrameOrthogonal2Polar(const Vector<3, double>& orthogon */ Vector<3, double> GenerateOrthogonalUnitVector(const Vector<3, double>& v); -} // namespace libra +} // namespace s2e::math #include "vector_template_functions.hpp" diff --git a/src/library/math/vector_template_functions.hpp b/src/math_physics/math/vector_template_functions.hpp similarity index 98% rename from src/library/math/vector_template_functions.hpp rename to src/math_physics/math/vector_template_functions.hpp index 4706eab2a..9b9900388 100644 --- a/src/library/math/vector_template_functions.hpp +++ b/src/math_physics/math/vector_template_functions.hpp @@ -8,7 +8,7 @@ #include -namespace libra { +namespace s2e::math { template Vector::Vector(const T& n) { @@ -146,6 +146,6 @@ double CalcAngleTwoVectors_rad(const Vector& v1, const Vector { * @param [in] sigma: Sigma value (0 < sigma < 1) for interpolation * @return : interpolated state x(t0 + sigma * h) */ - Vector CalcInterpolationState(const double sigma) const override; + math::Vector CalcInterpolationState(const double sigma) const override; private: - std::vector> coefficients_; //!< Coefficients to calculate interpolation weights + std::vector> coefficients_; //!< Coefficients to calculate interpolation weights /** * @fn CalcInterpolationWeights * @brief Calculate weights for interpolation @@ -46,7 +46,7 @@ class DormandPrince5 : public EmbeddedRungeKutta { std::vector CalcInterpolationWeights(const double sigma) const; }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #include "dormand_prince_5_implementation.hpp" diff --git a/src/library/numerical_integration/dormand_prince_5_implementation.hpp b/src/math_physics/numerical_integration/dormand_prince_5_implementation.hpp similarity index 95% rename from src/library/numerical_integration/dormand_prince_5_implementation.hpp rename to src/math_physics/numerical_integration/dormand_prince_5_implementation.hpp index 28348cceb..8a5bbb55e 100644 --- a/src/library/numerical_integration/dormand_prince_5_implementation.hpp +++ b/src/math_physics/numerical_integration/dormand_prince_5_implementation.hpp @@ -11,7 +11,7 @@ #include "dormand_prince_5.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { template DormandPrince5::DormandPrince5(const double step_width, const InterfaceOde& ode) : EmbeddedRungeKutta(step_width, ode) { @@ -75,7 +75,7 @@ DormandPrince5::DormandPrince5(const double step_width, const InterfaceOde this->rk_matrix_[6][5] = 11.0 / 84.0; // Interpolation coefficients - libra::Vector<5> coefficients_temp; + math::Vector<5> coefficients_temp; coefficients_temp[0] = 11282082432.0; coefficients_temp[1] = -32272833064.0; coefficients_temp[2] = 34969693132.0; @@ -123,10 +123,10 @@ DormandPrince5::DormandPrince5(const double step_width, const InterfaceOde } template -Vector DormandPrince5::CalcInterpolationState(const double sigma) const { +math::Vector DormandPrince5::CalcInterpolationState(const double sigma) const { std::vector interpolation_weights = CalcInterpolationWeights(sigma); - Vector interpolation_state = this->previous_state_; + math::Vector interpolation_state = this->previous_state_; for (size_t i = 0; i < this->number_of_stages_; i++) { interpolation_state = interpolation_state + (sigma * this->step_width_ * interpolation_weights[i]) * this->slope_[i]; } @@ -149,6 +149,6 @@ std::vector DormandPrince5::CalcInterpolationWeights(const double sig return interpolation_weights; } -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_DORMAND_PRINCE_5_IMPLEMENTATION_HPP_ diff --git a/src/library/numerical_integration/embedded_runge_kutta.hpp b/src/math_physics/numerical_integration/embedded_runge_kutta.hpp similarity index 94% rename from src/library/numerical_integration/embedded_runge_kutta.hpp rename to src/math_physics/numerical_integration/embedded_runge_kutta.hpp index dc7fe9dba..c453fc606 100644 --- a/src/library/numerical_integration/embedded_runge_kutta.hpp +++ b/src/math_physics/numerical_integration/embedded_runge_kutta.hpp @@ -8,7 +8,7 @@ #include "runge_kutta.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class EmbeddedRungeKutta @@ -51,7 +51,7 @@ class EmbeddedRungeKutta : public RungeKutta { double local_truncation_error_; //!< Norm of estimated local truncation error }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #include "embedded_runge_kutta_implementation.hpp" diff --git a/src/library/numerical_integration/embedded_runge_kutta_implementation.hpp b/src/math_physics/numerical_integration/embedded_runge_kutta_implementation.hpp similarity index 80% rename from src/library/numerical_integration/embedded_runge_kutta_implementation.hpp rename to src/math_physics/numerical_integration/embedded_runge_kutta_implementation.hpp index be93a83df..f4e794a0f 100644 --- a/src/library/numerical_integration/embedded_runge_kutta_implementation.hpp +++ b/src/math_physics/numerical_integration/embedded_runge_kutta_implementation.hpp @@ -7,22 +7,22 @@ #include "embedded_runge_kutta.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { template void EmbeddedRungeKutta::Integrate() { this->CalcSlope(); this->previous_state_ = this->current_state_; - Vector lower_current_state = this->current_state_; //!< eta in the equation - Vector higher_current_state = this->current_state_; //!< eta_hat in the equation + math::Vector lower_current_state = this->current_state_; //!< eta in the equation + math::Vector higher_current_state = this->current_state_; //!< eta_hat in the equation for (size_t i = 0; i < this->number_of_stages_; i++) { lower_current_state = lower_current_state + this->weights_[i] * this->step_width_ * this->slope_[i]; higher_current_state = higher_current_state + higher_order_weights_[i] * this->step_width_ * this->slope_[i]; } // Error evaluation - Vector truncation_error = lower_current_state - higher_current_state; + math::Vector truncation_error = lower_current_state - higher_current_state; local_truncation_error_ = truncation_error.CalcNorm(); // State update @@ -37,6 +37,6 @@ void EmbeddedRungeKutta::ControlStepWidth(const double error_tolerance) { this->step_width_ = updated_step_width; } -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_EMBEDDED_RUNGE_KUTTA_IMPLEMENTATION_HPP_ diff --git a/src/library/numerical_integration/interface_ode.hpp b/src/math_physics/numerical_integration/interface_ode.hpp similarity index 77% rename from src/library/numerical_integration/interface_ode.hpp rename to src/math_physics/numerical_integration/interface_ode.hpp index ca6f037f6..fada6e5b0 100644 --- a/src/library/numerical_integration/interface_ode.hpp +++ b/src/math_physics/numerical_integration/interface_ode.hpp @@ -8,7 +8,7 @@ #include "../math/vector.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class InterfaceOde @@ -24,9 +24,9 @@ class InterfaceOde { * @param [in] state: State vector * @return Differentiated value of state vector */ - virtual Vector DerivativeFunction(const double independent_variable, const Vector& state) const = 0; + virtual math::Vector DerivativeFunction(const double independent_variable, const math::Vector& state) const = 0; }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_INTERFACE_ODE_HPP_ diff --git a/src/library/numerical_integration/numerical_integrator.hpp b/src/math_physics/numerical_integration/numerical_integrator.hpp similarity index 83% rename from src/library/numerical_integration/numerical_integrator.hpp rename to src/math_physics/numerical_integration/numerical_integrator.hpp index 296a57eaa..461bfa225 100644 --- a/src/library/numerical_integration/numerical_integrator.hpp +++ b/src/math_physics/numerical_integration/numerical_integrator.hpp @@ -11,7 +11,7 @@ #include "../math/vector.hpp" #include "interface_ode.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class NumericalIntegrator @@ -44,7 +44,7 @@ class NumericalIntegrator { * @fn SetState * @brief Set state information */ - inline void SetState(const double independent_variable, const Vector& state) { + inline void SetState(const double independent_variable, const math::Vector& state) { current_independent_variable_ = independent_variable; current_state_ = state; previous_state_ = state; @@ -54,7 +54,7 @@ class NumericalIntegrator { * @fn GetState * @brief Return current state vector */ - inline const Vector& GetState() const { return current_state_; } + inline const math::Vector& GetState() const { return current_state_; } /** * @fn CalcInterpolationState @@ -62,7 +62,7 @@ class NumericalIntegrator { * @param [in] sigma: Sigma value (0 < sigma < 1) for interpolation * @return : interpolated state x(t0 + sigma * h) */ - virtual Vector CalcInterpolationState(const double sigma) const = 0; + virtual math::Vector CalcInterpolationState(const double sigma) const = 0; protected: // Settings @@ -71,10 +71,10 @@ class NumericalIntegrator { // States const InterfaceOde& ode_; //!< Ordinary differential equation double current_independent_variable_; //!< Latest value of independent variable - Vector current_state_; //!< Latest state vector - Vector previous_state_; //!< Previous state vector + math::Vector current_state_; //!< Latest state vector + math::Vector previous_state_; //!< Previous state vector }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_NUMERICAL_INTEGRATOR_HPP_ diff --git a/src/library/numerical_integration/numerical_integrator_manager.hpp b/src/math_physics/numerical_integration/numerical_integrator_manager.hpp similarity index 95% rename from src/library/numerical_integration/numerical_integrator_manager.hpp rename to src/math_physics/numerical_integration/numerical_integrator_manager.hpp index 93e2c3d51..c37d3b375 100644 --- a/src/library/numerical_integration/numerical_integrator_manager.hpp +++ b/src/math_physics/numerical_integration/numerical_integrator_manager.hpp @@ -12,7 +12,7 @@ #include "runge_kutta_4.hpp" #include "runge_kutta_fehlberg.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @enum NumericalIntegrationMethod @@ -62,6 +62,6 @@ class NumericalIntegratorManager { std::shared_ptr> integrator_; }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_NUMERICAL_INTEGRATION_HPP_ diff --git a/src/library/numerical_integration/ode_examples.hpp b/src/math_physics/numerical_integration/ode_examples.hpp similarity index 74% rename from src/library/numerical_integration/ode_examples.hpp rename to src/math_physics/numerical_integration/ode_examples.hpp index fb0fbfdeb..98ee43d63 100644 --- a/src/library/numerical_integration/ode_examples.hpp +++ b/src/math_physics/numerical_integration/ode_examples.hpp @@ -6,18 +6,18 @@ #ifndef S2E_LIBRARY_NUMERICAL_INTEGRATION_EXAMPLE_ODE_HPP_ #define S2E_LIBRARY_NUMERICAL_INTEGRATION_EXAMPLE_ODE_HPP_ -#include "../utilities/macros.hpp" +#include "../../utilities/macros.hpp" #include "interface_ode.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { class ExampleLinearOde : public InterfaceOde<1> { public: - Vector<1> DerivativeFunction(const double time_s, const Vector<1>& state) const { + math::Vector<1> DerivativeFunction(const double time_s, const math::Vector<1>& state) const { UNUSED(time_s); UNUSED(state); - Vector<1> output(1.0); + math::Vector<1> output(1.0); return output; } }; @@ -35,11 +35,11 @@ class ExampleQuadraticOde : public InterfaceOde<1> { * @param [in] state: State vector * @return Differentiated value of state vector */ - virtual Vector<1> DerivativeFunction(const double time_s, const Vector<1>& state) const { + virtual math::Vector<1> DerivativeFunction(const double time_s, const math::Vector<1>& state) const { UNUSED(time_s); UNUSED(state); - Vector<1> output(0.0); + math::Vector<1> output(0.0); output[0] = 2.0 * time_s; return output; } @@ -51,10 +51,10 @@ class ExampleQuadraticOde : public InterfaceOde<1> { */ class Example1dPositionVelocityOde : public InterfaceOde<2> { public: - virtual Vector<2> DerivativeFunction(const double time_s, const Vector<2>& state) const { + virtual math::Vector<2> DerivativeFunction(const double time_s, const math::Vector<2>& state) const { UNUSED(time_s); - Vector<2> output(0.0); + math::Vector<2> output(0.0); output[0] = state[1]; output[1] = 0.0; return output; @@ -67,10 +67,10 @@ class Example1dPositionVelocityOde : public InterfaceOde<2> { */ class Example2dTwoBodyOrbitOde : public InterfaceOde<4> { public: - virtual Vector<4> DerivativeFunction(const double time_s, const Vector<4>& state) const { + virtual math::Vector<4> DerivativeFunction(const double time_s, const math::Vector<4>& state) const { UNUSED(time_s); - Vector<4> output(0.0); + math::Vector<4> output(0.0); output[0] = state[2]; output[1] = state[3]; double denominator = pow(state[0] * state[0] + state[1] * state[1], 3.0 / 2.0); @@ -86,6 +86,6 @@ class Example2dTwoBodyOrbitOde : public InterfaceOde<4> { } }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_EXAMPLE_ODE_HPP_s diff --git a/src/library/numerical_integration/runge_kutta.hpp b/src/math_physics/numerical_integration/runge_kutta.hpp similarity index 92% rename from src/library/numerical_integration/runge_kutta.hpp rename to src/math_physics/numerical_integration/runge_kutta.hpp index af89d2254..d2072d4cb 100644 --- a/src/library/numerical_integration/runge_kutta.hpp +++ b/src/math_physics/numerical_integration/runge_kutta.hpp @@ -9,7 +9,7 @@ #include "numerical_integrator.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class RungeKutta @@ -46,7 +46,7 @@ class RungeKutta : public NumericalIntegrator { std::vector nodes_; //!< Nodes vector for general RK (c vector in the equation) std::vector weights_; //!< Weights vector for general RK (b vector in the equation) std::vector> rk_matrix_; //!< Runge-Kutta matrix for general RK (a matrix in the equation) - std::vector> slope_; //!< Slope vector for general RK (k vector in the equation) + std::vector> slope_; //!< Slope vector for general RK (k vector in the equation) /** * @fn CalcSlope @@ -55,7 +55,7 @@ class RungeKutta : public NumericalIntegrator { void CalcSlope(); }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #include "runge_kutta_template.hpp" diff --git a/src/library/numerical_integration/runge_kutta_4.hpp b/src/math_physics/numerical_integration/runge_kutta_4.hpp similarity index 87% rename from src/library/numerical_integration/runge_kutta_4.hpp rename to src/math_physics/numerical_integration/runge_kutta_4.hpp index 0ac8402af..d8925f51c 100644 --- a/src/library/numerical_integration/runge_kutta_4.hpp +++ b/src/math_physics/numerical_integration/runge_kutta_4.hpp @@ -6,11 +6,11 @@ #ifndef S2E_LIBRARY_NUMERICAL_INTEGRATION_RUNGE_KUTTA_4_HPP_ #define S2E_LIBRARY_NUMERICAL_INTEGRATION_RUNGE_KUTTA_4_HPP_ -#include +#include #include "runge_kutta.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class RungeKutta4 @@ -45,12 +45,12 @@ class RungeKutta4 : public RungeKutta { } // We did not implement the interpolation for RK4 - Vector CalcInterpolationState(const double sigma) const override { + math::Vector CalcInterpolationState(const double sigma) const override { UNUSED(sigma); return this->current_state_; } }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_RUNGE_KUTTA_4_HPP_ diff --git a/src/library/numerical_integration/runge_kutta_fehlberg.hpp b/src/math_physics/numerical_integration/runge_kutta_fehlberg.hpp similarity index 88% rename from src/library/numerical_integration/runge_kutta_fehlberg.hpp rename to src/math_physics/numerical_integration/runge_kutta_fehlberg.hpp index 756088baf..11a4a51ff 100644 --- a/src/library/numerical_integration/runge_kutta_fehlberg.hpp +++ b/src/math_physics/numerical_integration/runge_kutta_fehlberg.hpp @@ -8,7 +8,7 @@ #include "embedded_runge_kutta.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { /** * @class RungeKuttaFehlberg @@ -29,7 +29,7 @@ class RungeKuttaFehlberg : public EmbeddedRungeKutta { * @param [in] sigma: Sigma value (0 < sigma < 1) for interpolation * @return : interpolated state x(t0 + sigma * h) */ - Vector CalcInterpolationState(const double sigma) const override; + math::Vector CalcInterpolationState(const double sigma) const override; private: /** @@ -41,7 +41,7 @@ class RungeKuttaFehlberg : public EmbeddedRungeKutta { std::vector CalcInterpolationWeights(const double sigma) const; }; -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #include "runge_kutta_fehlberg_implementation.hpp" diff --git a/src/library/numerical_integration/runge_kutta_fehlberg_implementation.hpp b/src/math_physics/numerical_integration/runge_kutta_fehlberg_implementation.hpp similarity index 91% rename from src/library/numerical_integration/runge_kutta_fehlberg_implementation.hpp rename to src/math_physics/numerical_integration/runge_kutta_fehlberg_implementation.hpp index d8dd17724..c9887034c 100644 --- a/src/library/numerical_integration/runge_kutta_fehlberg_implementation.hpp +++ b/src/math_physics/numerical_integration/runge_kutta_fehlberg_implementation.hpp @@ -8,7 +8,7 @@ #include "runge_kutta_fehlberg.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { template RungeKuttaFehlberg::RungeKuttaFehlberg(const double step_width, const InterfaceOde& ode) : EmbeddedRungeKutta(step_width, ode) { @@ -64,15 +64,15 @@ RungeKuttaFehlberg::RungeKuttaFehlberg(const double step_width, const Interfa } template -Vector RungeKuttaFehlberg::CalcInterpolationState(const double sigma) const { +math::Vector RungeKuttaFehlberg::CalcInterpolationState(const double sigma) const { // Calc k7 (slope after state update) - Vector state_7 = + math::Vector state_7 = this->previous_state_ + this->step_width_ * (1.0 / 6.0 * this->slope_[0] + 1.0 / 6.0 * this->slope_[4] + 2.0 / 3.0 * this->slope_[5]); - Vector k7 = this->ode_.DerivativeFunction(this->current_independent_variable_, state_7); + math::Vector k7 = this->ode_.DerivativeFunction(this->current_independent_variable_, state_7); std::vector interpolation_weights = CalcInterpolationWeights(sigma); - Vector interpolation_state = this->previous_state_; + math::Vector interpolation_state = this->previous_state_; for (size_t i = 0; i < this->number_of_stages_; i++) { interpolation_state = interpolation_state + (sigma * this->step_width_ * interpolation_weights[i]) * this->slope_[i]; } @@ -96,6 +96,6 @@ std::vector RungeKuttaFehlberg::CalcInterpolationWeights(const double return interpolation_weights; } -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_RUNGE_KUTTA_FEHLBERG_IMPLEMENTATION_HPP_ diff --git a/src/library/numerical_integration/runge_kutta_template.hpp b/src/math_physics/numerical_integration/runge_kutta_template.hpp similarity index 84% rename from src/library/numerical_integration/runge_kutta_template.hpp rename to src/math_physics/numerical_integration/runge_kutta_template.hpp index f1a5edbab..0a34a7485 100644 --- a/src/library/numerical_integration/runge_kutta_template.hpp +++ b/src/math_physics/numerical_integration/runge_kutta_template.hpp @@ -7,7 +7,7 @@ #include "./runge_kutta.hpp" -namespace libra::numerical_integration { +namespace s2e::numerical_integration { template void RungeKutta::Integrate() { @@ -22,10 +22,10 @@ void RungeKutta::Integrate() { template void RungeKutta::CalcSlope() { - slope_.assign(number_of_stages_, Vector(0.0)); + slope_.assign(number_of_stages_, math::Vector(0.0)); for (size_t i = 0; i < number_of_stages_; i++) { - Vector state = this->current_state_; + math::Vector state = this->current_state_; for (size_t j = 0; j < i; j++) { state = state + rk_matrix_[i][j] * this->step_width_ * slope_[j]; } @@ -34,6 +34,6 @@ void RungeKutta::CalcSlope() { } } -} // namespace libra::numerical_integration +} // namespace s2e::numerical_integration #endif // S2E_LIBRARY_NUMERICAL_INTEGRATION_RUNGE_KUTTA_TEMPLATE_HPP_ diff --git a/src/library/numerical_integration/test_runge_kutta.cpp b/src/math_physics/numerical_integration/test_runge_kutta.cpp similarity index 77% rename from src/library/numerical_integration/test_runge_kutta.cpp rename to src/math_physics/numerical_integration/test_runge_kutta.cpp index 9724d2b04..d544caae3 100644 --- a/src/library/numerical_integration/test_runge_kutta.cpp +++ b/src/math_physics/numerical_integration/test_runge_kutta.cpp @@ -15,10 +15,10 @@ * @brief Test for constructor */ TEST(NUMERICAL_INTEGRATION, Constructor) { - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::RungeKutta4<1> linear_ode(0.1, ode); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::RungeKutta4<1> linear_ode(0.1, ode); - libra::Vector<1> state = linear_ode.GetState(); + s2e::math::Vector<1> state = linear_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); } @@ -27,10 +27,10 @@ TEST(NUMERICAL_INTEGRATION, Constructor) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearRk4) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::RungeKutta4<1> rk4_ode(step_width_s, ode); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::RungeKutta4<1> rk4_ode(step_width_s, ode); - libra::Vector<1> state = rk4_ode.GetState(); + s2e::math::Vector<1> state = rk4_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -48,10 +48,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearRk4) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearRkf) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); - libra::Vector<1> state = rkf_ode.GetState(); + s2e::math::Vector<1> state = rkf_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -69,10 +69,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearRkf) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearDp5) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); - libra::Vector<1> state = dp5_ode.GetState(); + s2e::math::Vector<1> state = dp5_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -90,10 +90,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearDp5) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerRk4) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode); - libra::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); + s2e::math::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -111,11 +111,11 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerRk4) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerRkf) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode, - libra::numerical_integration::NumericalIntegrationMethod::kRkf); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode, + s2e::numerical_integration::NumericalIntegrationMethod::kRkf); - libra::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); + s2e::math::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -137,11 +137,11 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerRkf) { */ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerDp5) { double step_width_s = 0.1; - libra::numerical_integration::ExampleLinearOde ode; - libra::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode, - libra::numerical_integration::NumericalIntegrationMethod::kDp5); + s2e::numerical_integration::ExampleLinearOde ode; + s2e::numerical_integration::NumericalIntegratorManager<1> numerical_integrator(step_width_s, ode, + s2e::numerical_integration::NumericalIntegrationMethod::kDp5); - libra::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); + s2e::math::Vector<1> state = numerical_integrator.GetIntegrator()->GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -163,10 +163,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateLinearNumericalIntegratorManagerDp5) { */ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticRk4) { double step_width_s = 0.1; - libra::numerical_integration::ExampleQuadraticOde ode; - libra::numerical_integration::RungeKutta4<1> rk4_ode(step_width_s, ode); + s2e::numerical_integration::ExampleQuadraticOde ode; + s2e::numerical_integration::RungeKutta4<1> rk4_ode(step_width_s, ode); - libra::Vector<1> state = rk4_ode.GetState(); + s2e::math::Vector<1> state = rk4_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -184,10 +184,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticRk4) { */ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticRkf) { double step_width_s = 0.1; - libra::numerical_integration::ExampleQuadraticOde ode; - libra::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); + s2e::numerical_integration::ExampleQuadraticOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); - libra::Vector<1> state = rkf_ode.GetState(); + s2e::math::Vector<1> state = rkf_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -205,10 +205,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticRkf) { */ TEST(NUMERICAL_INTEGRATION, InterpolationQuadraticRkf) { double step_width_s = 10.0; - libra::numerical_integration::ExampleQuadraticOde ode; - libra::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); + s2e::numerical_integration::ExampleQuadraticOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<1> rkf_ode(step_width_s, ode); - libra::Vector<1> state = rkf_ode.GetState(); + s2e::math::Vector<1> state = rkf_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); rkf_ode.Integrate(); @@ -234,10 +234,10 @@ TEST(NUMERICAL_INTEGRATION, InterpolationQuadraticRkf) { */ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticDp5) { double step_width_s = 0.1; - libra::numerical_integration::ExampleQuadraticOde ode; - libra::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); + s2e::numerical_integration::ExampleQuadraticOde ode; + s2e::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); - libra::Vector<1> state = dp5_ode.GetState(); + s2e::math::Vector<1> state = dp5_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); size_t step_num = 10000; @@ -255,10 +255,10 @@ TEST(NUMERICAL_INTEGRATION, IntegrateQuadraticDp5) { */ TEST(NUMERICAL_INTEGRATION, InterpolationQuadraticDp5) { double step_width_s = 10.0; - libra::numerical_integration::ExampleQuadraticOde ode; - libra::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); + s2e::numerical_integration::ExampleQuadraticOde ode; + s2e::numerical_integration::DormandPrince5<1> dp5_ode(step_width_s, ode); - libra::Vector<1> state = dp5_ode.GetState(); + s2e::math::Vector<1> state = dp5_ode.GetState(); EXPECT_DOUBLE_EQ(0.0, state[0]); dp5_ode.Integrate(); @@ -284,15 +284,15 @@ TEST(NUMERICAL_INTEGRATION, InterpolationQuadraticDp5) { */ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRk4) { double step_width_s = 0.1; - libra::numerical_integration::Example1dPositionVelocityOde ode; - libra::numerical_integration::RungeKutta4<2> rk4_ode(step_width_s, ode); + s2e::numerical_integration::Example1dPositionVelocityOde ode; + s2e::numerical_integration::RungeKutta4<2> rk4_ode(step_width_s, ode); - libra::Vector<2> initial_state(0.0); + s2e::math::Vector<2> initial_state(0.0); initial_state[0] = 0.0; initial_state[1] = 0.1; rk4_ode.SetState(0.0, initial_state); - libra::Vector<2> state = rk4_ode.GetState(); + s2e::math::Vector<2> state = rk4_ode.GetState(); EXPECT_DOUBLE_EQ(initial_state[0], state[0]); EXPECT_DOUBLE_EQ(initial_state[1], state[1]); @@ -301,7 +301,7 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRk4) { rk4_ode.Integrate(); } state = rk4_ode.GetState(); - libra::Vector<2> estimated_result(0.0); + s2e::math::Vector<2> estimated_result(0.0); estimated_result[0] = (step_width_s * step_num) * initial_state[1] + initial_state[0]; estimated_result[1] = initial_state[1]; @@ -314,15 +314,15 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRk4) { */ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRkf) { double step_width_s = 0.1; - libra::numerical_integration::Example1dPositionVelocityOde ode; - libra::numerical_integration::RungeKuttaFehlberg<2> rkf_ode(step_width_s, ode); + s2e::numerical_integration::Example1dPositionVelocityOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<2> rkf_ode(step_width_s, ode); - libra::Vector<2> initial_state(0.0); + s2e::math::Vector<2> initial_state(0.0); initial_state[0] = 0.0; initial_state[1] = 0.1; rkf_ode.SetState(0.0, initial_state); - libra::Vector<2> state = rkf_ode.GetState(); + s2e::math::Vector<2> state = rkf_ode.GetState(); EXPECT_DOUBLE_EQ(initial_state[0], state[0]); EXPECT_DOUBLE_EQ(initial_state[1], state[1]); @@ -331,7 +331,7 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRkf) { rkf_ode.Integrate(); } state = rkf_ode.GetState(); - libra::Vector<2> estimated_result(0.0); + s2e::math::Vector<2> estimated_result(0.0); estimated_result[0] = (step_width_s * step_num) * initial_state[1] + initial_state[0]; estimated_result[1] = initial_state[1]; @@ -344,15 +344,15 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityRkf) { */ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityDp5) { double step_width_s = 0.1; - libra::numerical_integration::Example1dPositionVelocityOde ode; - libra::numerical_integration::DormandPrince5<2> dp5_ode(step_width_s, ode); + s2e::numerical_integration::Example1dPositionVelocityOde ode; + s2e::numerical_integration::DormandPrince5<2> dp5_ode(step_width_s, ode); - libra::Vector<2> initial_state(0.0); + s2e::math::Vector<2> initial_state(0.0); initial_state[0] = 0.0; initial_state[1] = 0.1; dp5_ode.SetState(0.0, initial_state); - libra::Vector<2> state = dp5_ode.GetState(); + s2e::math::Vector<2> state = dp5_ode.GetState(); EXPECT_DOUBLE_EQ(initial_state[0], state[0]); EXPECT_DOUBLE_EQ(initial_state[1], state[1]); @@ -361,7 +361,7 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityDp5) { dp5_ode.Integrate(); } state = dp5_ode.GetState(); - libra::Vector<2> estimated_result(0.0); + s2e::math::Vector<2> estimated_result(0.0); estimated_result[0] = (step_width_s * step_num) * initial_state[1] + initial_state[0]; estimated_result[1] = initial_state[1]; @@ -374,12 +374,12 @@ TEST(NUMERICAL_INTEGRATION, Integrate1dPositionVelocityDp5) { */ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitSmallEccentricity) { double step_width_s = 0.1; - libra::numerical_integration::Example2dTwoBodyOrbitOde ode; - libra::numerical_integration::RungeKutta4<4> rk4_ode(step_width_s, ode); - libra::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); - libra::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); + s2e::numerical_integration::Example2dTwoBodyOrbitOde ode; + s2e::numerical_integration::RungeKutta4<4> rk4_ode(step_width_s, ode); + s2e::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); + s2e::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); - libra::Vector<4> initial_state(0.0); + s2e::math::Vector<4> initial_state(0.0); const double eccentricity = 0.1; initial_state[0] = 1.0 - eccentricity; initial_state[1] = 0.0; @@ -389,9 +389,9 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitSmallEccentricity) { rkf_ode.SetState(0.0, initial_state); dp5_ode.SetState(0.0, initial_state); - libra::Vector<4> state_rk4 = rk4_ode.GetState(); - libra::Vector<4> state_rkf = rkf_ode.GetState(); - libra::Vector<4> state_dp5 = dp5_ode.GetState(); + s2e::math::Vector<4> state_rk4 = rk4_ode.GetState(); + s2e::math::Vector<4> state_rkf = rkf_ode.GetState(); + s2e::math::Vector<4> state_dp5 = dp5_ode.GetState(); for (size_t i = 0; i < 4; i++) { EXPECT_DOUBLE_EQ(initial_state[i], state_rk4[i]); EXPECT_DOUBLE_EQ(initial_state[i], state_rkf[i]); @@ -409,15 +409,15 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitSmallEccentricity) { state_dp5 = dp5_ode.GetState(); // Estimation by Kepler Orbit calculation - libra::Vector<3> initial_position(0.0); - libra::Vector<3> initial_velocity(0.0); + s2e::math::Vector<3> initial_position(0.0); + s2e::math::Vector<3> initial_velocity(0.0); initial_position[0] = initial_state[0]; initial_position[1] = initial_state[1]; initial_velocity[0] = initial_state[2]; initial_velocity[1] = initial_state[3]; - OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); - KeplerOrbit kepler(1.0, oe); + s2e::orbit::OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); + s2e::orbit::KeplerOrbit kepler(1.0, oe); kepler.CalcOrbit((double)(step_num * step_width_s) / (24.0 * 60.0 * 60.0)); double error_tolerance = 2e-4; @@ -444,12 +444,12 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitSmallEccentricity) { */ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitLargeEccentricity) { double step_width_s = 0.01; - libra::numerical_integration::Example2dTwoBodyOrbitOde ode; - libra::numerical_integration::RungeKutta4<4> rk4_ode(step_width_s, ode); - libra::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); - libra::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); + s2e::numerical_integration::Example2dTwoBodyOrbitOde ode; + s2e::numerical_integration::RungeKutta4<4> rk4_ode(step_width_s, ode); + s2e::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); + s2e::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); - libra::Vector<4> initial_state(0.0); + s2e::math::Vector<4> initial_state(0.0); const double eccentricity = 0.9; initial_state[0] = 1.0 - eccentricity; initial_state[1] = 0.0; @@ -459,9 +459,9 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitLargeEccentricity) { rkf_ode.SetState(0.0, initial_state); dp5_ode.SetState(0.0, initial_state); - libra::Vector<4> state_rk4 = rk4_ode.GetState(); - libra::Vector<4> state_rkf = rkf_ode.GetState(); - libra::Vector<4> state_dp5 = dp5_ode.GetState(); + s2e::math::Vector<4> state_rk4 = rk4_ode.GetState(); + s2e::math::Vector<4> state_rkf = rkf_ode.GetState(); + s2e::math::Vector<4> state_dp5 = dp5_ode.GetState(); for (size_t i = 0; i < 4; i++) { EXPECT_DOUBLE_EQ(initial_state[i], state_rk4[i]); EXPECT_DOUBLE_EQ(initial_state[i], state_rkf[i]); @@ -479,15 +479,15 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitLargeEccentricity) { state_dp5 = dp5_ode.GetState(); // Estimation by Kepler Orbit calculation - libra::Vector<3> initial_position(0.0); - libra::Vector<3> initial_velocity(0.0); + s2e::math::Vector<3> initial_position(0.0); + s2e::math::Vector<3> initial_velocity(0.0); initial_position[0] = initial_state[0]; initial_position[1] = initial_state[1]; initial_velocity[0] = initial_state[2]; initial_velocity[1] = initial_state[3]; - OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); - KeplerOrbit kepler(1.0, oe); + s2e::orbit::OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); + s2e::orbit::KeplerOrbit kepler(1.0, oe); kepler.CalcOrbit((double)(step_num * step_width_s) / (24.0 * 60.0 * 60.0)); double error_tolerance = 2e-1; @@ -514,11 +514,11 @@ TEST(NUMERICAL_INTEGRATION, Integrate2dTwoBodyOrbitLargeEccentricity) { */ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitSmallEccentricity) { double step_width_s = 1.0; - libra::numerical_integration::Example2dTwoBodyOrbitOde ode; - libra::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); - libra::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); + s2e::numerical_integration::Example2dTwoBodyOrbitOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); + s2e::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); - libra::Vector<4> initial_state(0.0); + s2e::math::Vector<4> initial_state(0.0); const double eccentricity = 0.1; initial_state[0] = 1.0 - eccentricity; initial_state[1] = 0.0; @@ -527,8 +527,8 @@ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitSmallEccentricity) { rkf_ode.SetState(0.0, initial_state); dp5_ode.SetState(0.0, initial_state); - libra::Vector<4> state_rkf = rkf_ode.GetState(); - libra::Vector<4> state_dp5 = dp5_ode.GetState(); + s2e::math::Vector<4> state_rkf = rkf_ode.GetState(); + s2e::math::Vector<4> state_dp5 = dp5_ode.GetState(); for (size_t i = 0; i < 4; i++) { EXPECT_DOUBLE_EQ(initial_state[i], state_rkf[i]); EXPECT_DOUBLE_EQ(initial_state[i], state_dp5[i]); @@ -543,16 +543,16 @@ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitSmallEccentricity) { state_dp5 = dp5_ode.GetState(); // Estimation by Kepler Orbit calculation - libra::Vector<3> initial_position(0.0); - libra::Vector<3> initial_velocity(0.0); + s2e::math::Vector<3> initial_position(0.0); + s2e::math::Vector<3> initial_velocity(0.0); // Final value initial_position[0] = initial_state[0]; initial_position[1] = initial_state[1]; initial_velocity[0] = initial_state[2]; initial_velocity[1] = initial_state[3]; - OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); - KeplerOrbit kepler(1.0, oe); + s2e::orbit::OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); + s2e::orbit::KeplerOrbit kepler(1.0, oe); kepler.CalcOrbit((double)(step_num * step_width_s) / (24.0 * 60.0 * 60.0)); double error_tolerance = 5e-2; @@ -609,11 +609,11 @@ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitSmallEccentricity) { */ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitLargeEccentricity) { double step_width_s = 0.01; - libra::numerical_integration::Example2dTwoBodyOrbitOde ode; - libra::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); - libra::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); + s2e::numerical_integration::Example2dTwoBodyOrbitOde ode; + s2e::numerical_integration::RungeKuttaFehlberg<4> rkf_ode(step_width_s, ode); + s2e::numerical_integration::DormandPrince5<4> dp5_ode(step_width_s, ode); - libra::Vector<4> initial_state(0.0); + s2e::math::Vector<4> initial_state(0.0); const double eccentricity = 0.8; initial_state[0] = 1.0 - eccentricity; initial_state[1] = 0.0; @@ -622,8 +622,8 @@ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitLargeEccentricity) { rkf_ode.SetState(0.0, initial_state); dp5_ode.SetState(0.0, initial_state); - libra::Vector<4> state_rkf = rkf_ode.GetState(); - libra::Vector<4> state_dp5 = dp5_ode.GetState(); + s2e::math::Vector<4> state_rkf = rkf_ode.GetState(); + s2e::math::Vector<4> state_dp5 = dp5_ode.GetState(); for (size_t i = 0; i < 4; i++) { EXPECT_DOUBLE_EQ(initial_state[i], state_rkf[i]); EXPECT_DOUBLE_EQ(initial_state[i], state_dp5[i]); @@ -638,16 +638,16 @@ TEST(NUMERICAL_INTEGRATION, Interpolation2dTwoBodyOrbitLargeEccentricity) { state_dp5 = dp5_ode.GetState(); // Estimation by Kepler Orbit calculation - libra::Vector<3> initial_position(0.0); - libra::Vector<3> initial_velocity(0.0); + s2e::math::Vector<3> initial_position(0.0); + s2e::math::Vector<3> initial_velocity(0.0); // Final value initial_position[0] = initial_state[0]; initial_position[1] = initial_state[1]; initial_velocity[0] = initial_state[2]; initial_velocity[1] = initial_state[3]; - OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); - KeplerOrbit kepler(1.0, oe); + s2e::orbit::OrbitalElements oe(1.0, 0.0, initial_position, initial_velocity); + s2e::orbit::KeplerOrbit kepler(1.0, oe); kepler.CalcOrbit((double)(step_num * step_width_s) / (24.0 * 60.0 * 60.0)); double error_tolerance = 1e-5; diff --git a/src/library/optics/gaussian_beam_base.cpp b/src/math_physics/optics/gaussian_beam_base.cpp similarity index 72% rename from src/library/optics/gaussian_beam_base.cpp rename to src/math_physics/optics/gaussian_beam_base.cpp index 3f181c0b0..10b9745c8 100644 --- a/src/library/optics/gaussian_beam_base.cpp +++ b/src/math_physics/optics/gaussian_beam_base.cpp @@ -6,7 +6,9 @@ #include "gaussian_beam_base.hpp" #include -#include +#include + +namespace s2e::optics { GaussianBeamBase::GaussianBeamBase(double wavelength_m, double radius_beam_waist_m, double total_power_W) : wavelength_m_(wavelength_m), radius_beam_waist_m_(radius_beam_waist_m), total_power_W_(total_power_W) {} @@ -28,23 +30,23 @@ void GaussianBeamBase::SetTotalPower_W(const double total_power_W) { total_power_W_ = total_power_W; } -void GaussianBeamBase::SetPointingVector_i(const libra::Vector<3> pointing_vector_i) { pointing_vector_i_ = pointing_vector_i; } +void GaussianBeamBase::SetPointingVector_i(const math::Vector<3> pointing_vector_i) { pointing_vector_i_ = pointing_vector_i; } -void GaussianBeamBase::SetBeamWaistPosition_i_m(const libra::Vector<3> position_beam_waist_i_m) { - position_beam_waist_i_m_ = position_beam_waist_i_m; -} +void GaussianBeamBase::SetBeamWaistPosition_i_m(const math::Vector<3> position_beam_waist_i_m) { position_beam_waist_i_m_ = position_beam_waist_i_m; } double GaussianBeamBase::CalcBeamWidthRadius_m(double distance_from_beam_waist_m) { - double rayleigh_length_m = libra::pi * radius_beam_waist_m_ * radius_beam_waist_m_ / wavelength_m_; + double rayleigh_length_m = math::pi * radius_beam_waist_m_ * radius_beam_waist_m_ / wavelength_m_; double beam_width_radius_m = radius_beam_waist_m_ * sqrt(1.0 + std::pow((distance_from_beam_waist_m / rayleigh_length_m), 2.0)); return beam_width_radius_m; } double GaussianBeamBase::CalcIntensity_W_m2(double distance_from_beam_waist_m, double deviation_from_optical_axis_m) { double beam_width_radius_m = CalcBeamWidthRadius_m(distance_from_beam_waist_m); - double peak_intensity_W_m2 = (2.0 * total_power_W_) / (libra::pi * beam_width_radius_m * beam_width_radius_m); + double peak_intensity_W_m2 = (2.0 * total_power_W_) / (math::pi * beam_width_radius_m * beam_width_radius_m); double gaussian_dist = std::exp((-2.0 * deviation_from_optical_axis_m * deviation_from_optical_axis_m) / (beam_width_radius_m * beam_width_radius_m)); double intensity_W_m2 = peak_intensity_W_m2 * gaussian_dist; return intensity_W_m2; } + +} // namespace s2e::optics diff --git a/src/library/optics/gaussian_beam_base.hpp b/src/math_physics/optics/gaussian_beam_base.hpp similarity index 76% rename from src/library/optics/gaussian_beam_base.hpp rename to src/math_physics/optics/gaussian_beam_base.hpp index e47e98428..cf79b46e3 100644 --- a/src/library/optics/gaussian_beam_base.hpp +++ b/src/math_physics/optics/gaussian_beam_base.hpp @@ -8,6 +8,8 @@ #include "../math/vector.hpp" +namespace s2e::optics { + /** * @class GaussianBeamBase * @brief Class to express gaussian beam laser @@ -48,12 +50,12 @@ class GaussianBeamBase { * @fn SetPointingVector_i * @brief Set pointing direction vector in the inertial frame */ - void SetPointingVector_i(const libra::Vector<3> pointing_vector_i); + void SetPointingVector_i(const math::Vector<3> pointing_vector_i); /** * @fn SetBeamWaistPosition_i_m * @brief Set position of beam waist in the inertial frame [m] (Not used?) */ - void SetBeamWaistPosition_i_m(const libra::Vector<3> position_beam_waist_i_m); + void SetBeamWaistPosition_i_m(const math::Vector<3> position_beam_waist_i_m); // Getter /** @@ -75,12 +77,12 @@ class GaussianBeamBase { * @fn GetPointingVector_i * @brief Return pointing direction vector in the inertial frame */ - inline const libra::Vector<3> GetPointingVector_i() const { return pointing_vector_i_; } + inline const math::Vector<3> GetPointingVector_i() const { return pointing_vector_i_; } /** * @fn GetBeamWaistPosition_i_m * @brief Return position of beam waist in the inertial frame [m] (Not used?) */ - inline const libra::Vector<3> GetBeamWaistPosition_i_m() const { return position_beam_waist_i_m_; } + inline const math::Vector<3> GetBeamWaistPosition_i_m() const { return position_beam_waist_i_m_; } // Calculate functions /** @@ -100,11 +102,13 @@ class GaussianBeamBase { double CalcIntensity_W_m2(double distance_from_beam_waist_m, double deviation_from_optical_axis_m); private: - double wavelength_m_; //!< Wavelength [m] - double radius_beam_waist_m_; //!< Radius of beam waist [m] - double total_power_W_; //!< Total power [W] - libra::Vector<3> pointing_vector_i_{0.0}; //!< Pointing direction vector in the inertial frame - libra::Vector<3> position_beam_waist_i_m_{0.0}; //!< Position of beam waist in the inertial frame [m] (Not used?) + double wavelength_m_; //!< Wavelength [m] + double radius_beam_waist_m_; //!< Radius of beam waist [m] + double total_power_W_; //!< Total power [W] + math::Vector<3> pointing_vector_i_{0.0}; //!< Pointing direction vector in the inertial frame + math::Vector<3> position_beam_waist_i_m_{0.0}; //!< Position of beam waist in the inertial frame [m] (Not used?) }; +} // namespace s2e::optics + #endif // S2E_LIBRARY_OPTICS_GAUSSIAN_BEAM_BASE_HPP_ diff --git a/src/library/orbit/interpolation_orbit.cpp b/src/math_physics/orbit/interpolation_orbit.cpp similarity index 60% rename from src/library/orbit/interpolation_orbit.cpp rename to src/math_physics/orbit/interpolation_orbit.cpp index eca927e24..aa4874389 100644 --- a/src/library/orbit/interpolation_orbit.cpp +++ b/src/math_physics/orbit/interpolation_orbit.cpp @@ -5,18 +5,20 @@ #include "interpolation_orbit.hpp" +namespace s2e::orbit { + InterpolationOrbit::InterpolationOrbit(const size_t degree) { std::vector time; time.assign(degree, -1.0); std::vector position; position.assign(degree, 0.0); - libra::Interpolation temp(time, position); + math::Interpolation temp(time, position); for (size_t axis = 0; axis < 3; axis++) { interpolation_position_.push_back(temp); } } -bool InterpolationOrbit::PushAndPopData(const double time, const libra::Vector<3> position) { +bool InterpolationOrbit::PushAndPopData(const double time, const math::Vector<3> position) { bool result; for (size_t axis = 0; axis < 3; axis++) { result = interpolation_position_[axis].PushAndPopData(time, position[axis]); @@ -27,10 +29,20 @@ bool InterpolationOrbit::PushAndPopData(const double time, const libra::Vector<3 return true; } -libra::Vector<3> InterpolationOrbit::CalcPositionWithTrigonometric(const double time, const double period) const { - libra::Vector<3> output_position; +math::Vector<3> InterpolationOrbit::CalcPositionWithTrigonometric(const double time, const double period) const { + math::Vector<3> output_position; for (size_t axis = 0; axis < 3; axis++) { output_position[axis] = interpolation_position_[axis].CalcTrigonometric(time, period); } return output_position; } + +math::Vector<3> InterpolationOrbit::CalcPositionWithPolynomial(const double time) const { + math::Vector<3> output_position; + for (size_t axis = 0; axis < 3; axis++) { + output_position[axis] = interpolation_position_[axis].CalcPolynomial(time); + } + return output_position; +} + +} // namespace s2e::orbit diff --git a/src/library/orbit/interpolation_orbit.hpp b/src/math_physics/orbit/interpolation_orbit.hpp similarity index 72% rename from src/library/orbit/interpolation_orbit.hpp rename to src/math_physics/orbit/interpolation_orbit.hpp index 8a4d628e8..83913573b 100644 --- a/src/library/orbit/interpolation_orbit.hpp +++ b/src/math_physics/orbit/interpolation_orbit.hpp @@ -6,10 +6,12 @@ #ifndef S2E_LIBRARY_ORBIT_INTERPOLATION_ORBIT_HPP_ #define S2E_LIBRARY_ORBIT_INTERPOLATION_ORBIT_HPP_ -#include -#include +#include +#include #include +namespace s2e::orbit { + /** * @class InterpolationOrbit * @brief Orbit calculation with mathematical interpolation @@ -30,7 +32,7 @@ class InterpolationOrbit { * @param [in] time: time of the new data * @param [in] position: Satellite position of the new data */ - bool PushAndPopData(const double time, const libra::Vector<3> position); + bool PushAndPopData(const double time, const math::Vector<3> position); /** * @fn CalcPositionWithTrigonometric @@ -39,7 +41,15 @@ class InterpolationOrbit { * @param [in] period: Characteristic period * @return Calculated position */ - libra::Vector<3> CalcPositionWithTrigonometric(const double time, const double period = 0.0) const; + math::Vector<3> CalcPositionWithTrigonometric(const double time, const double period = 0.0) const; + + /** + * @fn CalcPositionWithPolynomial + * @brief Calculate interpolated position with polynomial method + * @param [in] time: time + * @return Calculated position + */ + math::Vector<3> CalcPositionWithPolynomial(const double time) const; // Getters /** @@ -66,7 +76,9 @@ class InterpolationOrbit { } private: - std::vector interpolation_position_; // 3D vector of interpolation + std::vector interpolation_position_; // 3D vector of interpolation }; -#endif // S2E_LIBRARY_ORBIT_INTERPOLATION_ORBIT_HPP_ +} // namespace s2e::orbit + +#endif // S2E_LIBRARY_ORBIT_INTERPOLATION_ORBIT_HPP_ \ No newline at end of file diff --git a/src/library/orbit/kepler_orbit.cpp b/src/math_physics/orbit/kepler_orbit.cpp similarity index 83% rename from src/library/orbit/kepler_orbit.cpp rename to src/math_physics/orbit/kepler_orbit.cpp index 4c2714925..2f49fd5db 100644 --- a/src/library/orbit/kepler_orbit.cpp +++ b/src/math_physics/orbit/kepler_orbit.cpp @@ -7,6 +7,8 @@ #include "../math/matrix_vector.hpp" #include "../math/s2e_math.hpp" +namespace s2e::orbit { + KeplerOrbit::KeplerOrbit() {} // Initialize with orbital elements KeplerOrbit::KeplerOrbit(const double gravity_constant_m3_s2, const OrbitalElements oe) : gravity_constant_m3_s2_(gravity_constant_m3_s2), oe_(oe) { @@ -22,10 +24,10 @@ void KeplerOrbit::CalcConstKeplerMotion() { mean_motion_rad_s_ = sqrt(gravity_constant_m3_s2_ / a_m3); // DCM - libra::Matrix<3, 3> dcm_arg_perigee = libra::MakeRotationMatrixZ(-1.0 * oe_.GetArgPerigee_rad()); - libra::Matrix<3, 3> dcm_inclination = libra::MakeRotationMatrixX(-1.0 * oe_.GetInclination_rad()); - libra::Matrix<3, 3> dcm_raan = libra::MakeRotationMatrixZ(-1.0 * oe_.GetRaan_rad()); - libra::Matrix<3, 3> dcm_inc_arg = dcm_inclination * dcm_arg_perigee; + math::Matrix<3, 3> dcm_arg_perigee = math::MakeRotationMatrixZ(-1.0 * oe_.GetArgPerigee_rad()); + math::Matrix<3, 3> dcm_inclination = math::MakeRotationMatrixX(-1.0 * oe_.GetInclination_rad()); + math::Matrix<3, 3> dcm_raan = math::MakeRotationMatrixZ(-1.0 * oe_.GetRaan_rad()); + math::Matrix<3, 3> dcm_inc_arg = dcm_inclination * dcm_arg_perigee; dcm_inplane_to_i_ = dcm_raan * dcm_inc_arg; } @@ -37,12 +39,12 @@ void KeplerOrbit::CalcOrbit(double time_jday) { double dt_s = (time_jday - oe_.GetEpoch_jday()) * (24.0 * 60.0 * 60.0); double mean_anomaly_rad = mean_motion_rad_s_ * dt_s; - double l_rad = libra::WrapTo2Pi(mean_anomaly_rad); + double l_rad = math::WrapTo2Pi(mean_anomaly_rad); // Solve Kepler Equation double eccentric_anomaly_rad; eccentric_anomaly_rad = SolveKeplerNewtonMethod(e, l_rad, 1.0e-5, 10); - double u_rad = libra::WrapTo2Pi(eccentric_anomaly_rad); + double u_rad = math::WrapTo2Pi(eccentric_anomaly_rad); // Calc position and velocity in the plane double cos_u = cos(u_rad); @@ -50,12 +52,12 @@ void KeplerOrbit::CalcOrbit(double time_jday) { double a_sqrt_e_m = a_m * sqrt(1.0 - e * e); double e_cos_u = 1.0 - e * cos_u; - libra::Vector<3> pos_inplane_m; + math::Vector<3> pos_inplane_m; pos_inplane_m[0] = a_m * (cos_u - e); pos_inplane_m[1] = a_sqrt_e_m * sin_u; pos_inplane_m[2] = 0.0; - libra::Vector<3> vel_inplane_m_s; + math::Vector<3> vel_inplane_m_s; vel_inplane_m_s[0] = -1.0 * a_m * n_rad_s * sin_u / e_cos_u; vel_inplane_m_s[1] = n_rad_s * a_sqrt_e_m * cos_u / e_cos_u; vel_inplane_m_s[2] = 0.0; @@ -97,3 +99,5 @@ double KeplerOrbit::SolveKeplerNewtonMethod(const double eccentricity, const dou } return u_rad; } + +} // namespace s2e::orbit diff --git a/src/library/orbit/kepler_orbit.hpp b/src/math_physics/orbit/kepler_orbit.hpp similarity index 76% rename from src/library/orbit/kepler_orbit.hpp rename to src/math_physics/orbit/kepler_orbit.hpp index 0d83142eb..efe4e7f5c 100644 --- a/src/library/orbit/kepler_orbit.hpp +++ b/src/math_physics/orbit/kepler_orbit.hpp @@ -10,6 +10,8 @@ #include "../math/vector.hpp" #include "./orbital_elements.hpp" +namespace s2e::orbit { + /** * @class KeplerOrbit * @brief Class to calculate Kepler orbit calculation @@ -45,22 +47,22 @@ class KeplerOrbit { * @fn GetPosition_i_m * @brief Return position vector in the inertial frame [m] */ - inline const libra::Vector<3> GetPosition_i_m() const { return position_i_m_; } + inline const math::Vector<3> GetPosition_i_m() const { return position_i_m_; } /** * @fn GetVelocity_i_m_s * @brief Return velocity vector in the inertial frame [m/s] */ - inline const libra::Vector<3> GetVelocity_i_m_s() const { return velocity_i_m_s_; } + inline const math::Vector<3> GetVelocity_i_m_s() const { return velocity_i_m_s_; } protected: - libra::Vector<3> position_i_m_; //!< Position vector in the inertial frame [m] - libra::Vector<3> velocity_i_m_s_; //!< Velocity vector in the inertial frame [m/s] + math::Vector<3> position_i_m_; //!< Position vector in the inertial frame [m] + math::Vector<3> velocity_i_m_s_; //!< Velocity vector in the inertial frame [m/s] private: - double gravity_constant_m3_s2_; //!< Gravity constant of the center body [m3/s2] - OrbitalElements oe_; //!< Orbital elements - double mean_motion_rad_s_; //!< Mean motion of the orbit [rad/s] - libra::Matrix<3, 3> dcm_inplane_to_i_; //!< Direction cosine matrix from the in-plane frame to the inertial frame + double gravity_constant_m3_s2_; //!< Gravity constant of the center body [m3/s2] + OrbitalElements oe_; //!< Orbital elements + double mean_motion_rad_s_; //!< Mean motion of the orbit [rad/s] + math::Matrix<3, 3> dcm_inplane_to_i_; //!< Direction cosine matrix from the in-plane frame to the inertial frame /** * @fn CalcConstKeplerMotion @@ -87,4 +89,6 @@ class KeplerOrbit { double SolveKeplerNewtonMethod(const double eccentricity, const double mean_anomaly_rad, const double angle_limit_rad, const int iteration_limit); }; +} // namespace s2e::orbit + #endif // S2E_LIBRARY_ORBIT_KEPLER_ORBIT_HPP_ diff --git a/src/library/orbit/orbital_elements.cpp b/src/math_physics/orbit/orbital_elements.cpp similarity index 85% rename from src/library/orbit/orbital_elements.cpp rename to src/math_physics/orbit/orbital_elements.cpp index db7bd24a3..d02a324e2 100644 --- a/src/library/orbit/orbital_elements.cpp +++ b/src/math_physics/orbit/orbital_elements.cpp @@ -9,6 +9,8 @@ #include "../math/s2e_math.hpp" +namespace s2e::orbit { + OrbitalElements::OrbitalElements() {} // initialize with OE @@ -22,20 +24,20 @@ OrbitalElements::OrbitalElements(const double epoch_jday, const double semi_majo epoch_jday_(epoch_jday) {} // initialize with position and velocity -OrbitalElements::OrbitalElements(const double gravity_constant_m3_s2, const double time_jday, const libra::Vector<3> position_i_m, - const libra::Vector<3> velocity_i_m_s) { +OrbitalElements::OrbitalElements(const double gravity_constant_m3_s2, const double time_jday, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s) { CalcOeFromPosVel(gravity_constant_m3_s2, time_jday, position_i_m, velocity_i_m_s); } OrbitalElements::~OrbitalElements() {} // Private Function -void OrbitalElements::CalcOeFromPosVel(const double gravity_constant_m3_s2, const double time_jday, const libra::Vector<3> position_i_m, - const libra::Vector<3> velocity_i_m_s) { +void OrbitalElements::CalcOeFromPosVel(const double gravity_constant_m3_s2, const double time_jday, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s) { // common variables double r_m = position_i_m.CalcNorm(); double v2_m2_s2 = InnerProduct(velocity_i_m_s, velocity_i_m_s); - libra::Vector<3> h; //!< angular momentum vector + math::Vector<3> h; //!< angular momentum vector h = OuterProduct(position_i_m, velocity_i_m_s); double h_norm = h.CalcNorm(); @@ -43,7 +45,7 @@ void OrbitalElements::CalcOeFromPosVel(const double gravity_constant_m3_s2, cons semi_major_axis_m_ = gravity_constant_m3_s2 / (2.0 * gravity_constant_m3_s2 / r_m - v2_m2_s2); // inclination - libra::Vector<3> h_direction = h.CalcNormalizedVector(); + math::Vector<3> h_direction = h.CalcNormalizedVector(); inclination_rad_ = acos(h_direction[2]); // RAAN @@ -75,13 +77,15 @@ void OrbitalElements::CalcOeFromPosVel(const double gravity_constant_m3_s2, cons // true anomaly f_rad and eccentric anomaly u_rad double phi_rad = atan2(y_p_m, x_p_m); double f_rad = phi_rad - arg_perigee_rad_; - f_rad = libra::WrapTo2Pi(f_rad); + f_rad = math::WrapTo2Pi(f_rad); double u_rad = atan2(r_m * sin(f_rad) / sqrt(1.0 - eccentricity_ * eccentricity_), r_m * cos(f_rad) + semi_major_axis_m_ * eccentricity_); - u_rad = libra::WrapTo2Pi(u_rad); + u_rad = math::WrapTo2Pi(u_rad); // epoch t0 double n_rad_s = sqrt(gravity_constant_m3_s2 / pow(semi_major_axis_m_, 3.0)); double dt_s = (u_rad - eccentricity_ * sin(u_rad)) / n_rad_s; epoch_jday_ = time_jday - dt_s / (24.0 * 60.0 * 60.0); } + +} // namespace s2e::orbit diff --git a/src/library/orbit/orbital_elements.hpp b/src/math_physics/orbit/orbital_elements.hpp similarity index 92% rename from src/library/orbit/orbital_elements.hpp rename to src/math_physics/orbit/orbital_elements.hpp index ca38435a1..4b4e3f04f 100644 --- a/src/library/orbit/orbital_elements.hpp +++ b/src/math_physics/orbit/orbital_elements.hpp @@ -8,6 +8,8 @@ #include "../math/vector.hpp" +namespace s2e::orbit { + /** * @class OrbitalElements * @brief Class for classical orbital elements @@ -39,8 +41,8 @@ class OrbitalElements { * @param[in] position_i_m: Position vector in the inertial frame [m] * @param[in] velocity_i_m_s: Velocity vector in the inertial frame [m/s] */ - OrbitalElements(const double gravity_constant_m3_s2, const double time_jday, const libra::Vector<3> position_i_m, - const libra::Vector<3> velocity_i_m_s); + OrbitalElements(const double gravity_constant_m3_s2, const double time_jday, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s); /** * @fn ~OrbitalElements * @brief Destructor @@ -100,8 +102,10 @@ class OrbitalElements { * @param[in] position_i_m: Position vector in the inertial frame [m] * @param[in] velocity_i_m_s: Velocity vector in the inertial frame [m/s] */ - void CalcOeFromPosVel(const double gravity_constant_m3_s2, const double time_jday, const libra::Vector<3> position_i_m, - const libra::Vector<3> velocity_i_m_s); + void CalcOeFromPosVel(const double gravity_constant_m3_s2, const double time_jday, const math::Vector<3> position_i_m, + const math::Vector<3> velocity_i_m_s); }; +} // namespace s2e::orbit + #endif // S2E_LIBRARY_ORBIT_ORBITAL_ELEMENTS_HPP_ diff --git a/src/library/orbit/relative_orbit_models.cpp b/src/math_physics/orbit/relative_orbit_models.cpp similarity index 88% rename from src/library/orbit/relative_orbit_models.cpp rename to src/math_physics/orbit/relative_orbit_models.cpp index 95263cd93..0ec2ebfff 100644 --- a/src/library/orbit/relative_orbit_models.cpp +++ b/src/math_physics/orbit/relative_orbit_models.cpp @@ -4,8 +4,10 @@ */ #include "relative_orbit_models.hpp" -libra::Matrix<6, 6> CalcHillSystemMatrix(double orbit_radius_m, double gravity_constant_m3_s2) { - libra::Matrix<6, 6> system_matrix; +namespace s2e::orbit { + +math::Matrix<6, 6> CalcHillSystemMatrix(double orbit_radius_m, double gravity_constant_m3_s2) { + math::Matrix<6, 6> system_matrix; double n = sqrt(gravity_constant_m3_s2 / pow(orbit_radius_m, 3)); system_matrix[0][0] = 0.0; @@ -48,8 +50,8 @@ libra::Matrix<6, 6> CalcHillSystemMatrix(double orbit_radius_m, double gravity_c return system_matrix; } -libra::Matrix<6, 6> CalcHcwStm(double orbit_radius_m, double gravity_constant_m3_s2, double elapsed_time_s) { - libra::Matrix<6, 6> stm; +math::Matrix<6, 6> CalcHcwStm(double orbit_radius_m, double gravity_constant_m3_s2, double elapsed_time_s) { + math::Matrix<6, 6> stm; double n = sqrt(gravity_constant_m3_s2 / pow(orbit_radius_m, 3)); double t = elapsed_time_s; @@ -91,3 +93,5 @@ libra::Matrix<6, 6> CalcHcwStm(double orbit_radius_m, double gravity_constant_m3 stm[5][5] = cos(n * t); return stm; } + +} // namespace s2e::orbit diff --git a/src/library/orbit/relative_orbit_models.hpp b/src/math_physics/orbit/relative_orbit_models.hpp similarity index 79% rename from src/library/orbit/relative_orbit_models.hpp rename to src/math_physics/orbit/relative_orbit_models.hpp index a77fb5d45..eb5c42a45 100644 --- a/src/library/orbit/relative_orbit_models.hpp +++ b/src/math_physics/orbit/relative_orbit_models.hpp @@ -9,6 +9,8 @@ #include "../math/matrix.hpp" #include "../math/vector.hpp" +namespace s2e::orbit { + /** * @enum RelativeOrbitModel * @brief Relative orbit model @@ -29,7 +31,7 @@ enum class StmModel { kHcw = 0 }; * @param [in] gravity_constant_m3_s2: Gravity constant of the center body [m3/s2] * @return System matrix */ -libra::Matrix<6, 6> CalcHillSystemMatrix(const double orbit_radius_m, const double gravity_constant_m3_s2); +math::Matrix<6, 6> CalcHillSystemMatrix(const double orbit_radius_m, const double gravity_constant_m3_s2); // STMs /** @@ -40,6 +42,8 @@ libra::Matrix<6, 6> CalcHillSystemMatrix(const double orbit_radius_m, const doub * @param [in] elapsed_time_s: Elapsed time [s] * @return State Transition Matrix */ -libra::Matrix<6, 6> CalcHcwStm(const double orbit_radius_m, const double gravity_constant_m3_s2, const double elapsed_time_s); +math::Matrix<6, 6> CalcHcwStm(const double orbit_radius_m, const double gravity_constant_m3_s2, const double elapsed_time_s); + +} // namespace s2e::orbit #endif // S2E_LIBRARY_ORBIT_RELATIVE_ORBIT_MODEL_HPP_ diff --git a/src/library/external/sgp4/sgp4ext.cpp b/src/math_physics/orbit/sgp4/sgp4ext.cpp similarity index 100% rename from src/library/external/sgp4/sgp4ext.cpp rename to src/math_physics/orbit/sgp4/sgp4ext.cpp diff --git a/src/library/external/sgp4/sgp4ext.h b/src/math_physics/orbit/sgp4/sgp4ext.h similarity index 100% rename from src/library/external/sgp4/sgp4ext.h rename to src/math_physics/orbit/sgp4/sgp4ext.h diff --git a/src/library/external/sgp4/sgp4io.cpp b/src/math_physics/orbit/sgp4/sgp4io.cpp similarity index 100% rename from src/library/external/sgp4/sgp4io.cpp rename to src/math_physics/orbit/sgp4/sgp4io.cpp diff --git a/src/library/external/sgp4/sgp4io.h b/src/math_physics/orbit/sgp4/sgp4io.h similarity index 100% rename from src/library/external/sgp4/sgp4io.h rename to src/math_physics/orbit/sgp4/sgp4io.h diff --git a/src/library/external/sgp4/sgp4unit.cpp b/src/math_physics/orbit/sgp4/sgp4unit.cpp similarity index 99% rename from src/library/external/sgp4/sgp4unit.cpp rename to src/math_physics/orbit/sgp4/sgp4unit.cpp index 750a711ba..55e8f25c9 100644 --- a/src/library/external/sgp4/sgp4unit.cpp +++ b/src/math_physics/orbit/sgp4/sgp4unit.cpp @@ -37,7 +37,7 @@ #include "sgp4unit.h" #include -#include +#include // const char help = 'n'; // Remove to avoid unused warinings FILE* dbgfile; diff --git a/src/library/external/sgp4/sgp4unit.h b/src/math_physics/orbit/sgp4/sgp4unit.h similarity index 100% rename from src/library/external/sgp4/sgp4unit.h rename to src/math_physics/orbit/sgp4/sgp4unit.h diff --git a/src/library/orbit/test_interpolation_orbit.cpp b/src/math_physics/orbit/test_interpolation_orbit.cpp similarity index 91% rename from src/library/orbit/test_interpolation_orbit.cpp rename to src/math_physics/orbit/test_interpolation_orbit.cpp index 5f5b7ade3..f83a3f0cf 100644 --- a/src/library/orbit/test_interpolation_orbit.cpp +++ b/src/math_physics/orbit/test_interpolation_orbit.cpp @@ -8,6 +8,8 @@ #include "interpolation_orbit.hpp" +using namespace s2e::orbit; + /** * @brief Test for Constructor function */ @@ -31,7 +33,7 @@ TEST(InterpolationOrbit, PushAndPop) { EXPECT_EQ(degree, interpolation_orbit.GetDegree()); for (size_t i = 0; i < degree; i++) { double time = (double)i; - libra::Vector<3> position{i * 2.0}; + s2e::math::Vector<3> position{i * 2.0}; bool ret = interpolation_orbit.PushAndPopData(time, position); EXPECT_TRUE(ret); } @@ -44,7 +46,7 @@ TEST(InterpolationOrbit, PushAndPop) { // False test double time = 2.0; - libra::Vector<3> position{-100.0}; + s2e::math::Vector<3> position{-100.0}; bool ret = interpolation_orbit.PushAndPopData(time, position); EXPECT_FALSE(ret); } diff --git a/src/math_physics/planet_rotation/moon_rotation_utilities.cpp b/src/math_physics/planet_rotation/moon_rotation_utilities.cpp new file mode 100644 index 000000000..370e5ba63 --- /dev/null +++ b/src/math_physics/planet_rotation/moon_rotation_utilities.cpp @@ -0,0 +1,52 @@ +/** + * @file moon_rotation_utilities.cpp + * @brief Functions to calculate the moon rotation frame conversion + * @note Ref: A Standardized Lunar Coordinate System for the Lunar Reconnaissance Orbiter and Lunar Datasets + * https://lunar.gsfc.nasa.gov/library/LunCoordWhitePaper-10-08.pdf + * https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/de430_moon_coord.pdf + */ + +#include "moon_rotation_utilities.hpp" + +#include + +namespace s2e::planet_rotation { + +math::Matrix<3, 3> CalcDcmEciToPrincipalAxis(const math::Vector<3> moon_position_eci_m, const math::Vector<3> moon_velocity_eci_m_s) { + math::Matrix<3, 3> dcm_eci2me = CalcDcmEciToMeanEarth(moon_position_eci_m, moon_velocity_eci_m_s); + math::Matrix<3, 3> dcm_me2pa = CalcDcmMeanEarthToPrincipalAxis(); + + return dcm_me2pa * dcm_eci2me; +} + +math::Matrix<3, 3> CalcDcmEciToMeanEarth(const math::Vector<3> moon_position_eci_m, const math::Vector<3> moon_velocity_eci_m_s) { + math::Vector<3> me_ex_eci = -1.0 * moon_position_eci_m.CalcNormalizedVector(); + + math::Vector<3> moon_orbit_norm = math::OuterProduct(moon_position_eci_m, moon_velocity_eci_m_s); + math::Vector<3> me_ez_eci = moon_orbit_norm.CalcNormalizedVector(); + + math::Vector<3> me_ey_eci = math::OuterProduct(me_ez_eci, me_ex_eci); + + math::Matrix<3, 3> dcm_eci_to_me; + for (size_t i = 0; i < 3; i++) { + dcm_eci_to_me[0][i] = me_ex_eci[i]; + dcm_eci_to_me[1][i] = me_ey_eci[i]; + dcm_eci_to_me[2][i] = me_ez_eci[i]; + } + + return dcm_eci_to_me; +} + +math::Matrix<3, 3> CalcDcmMeanEarthToPrincipalAxis() { + // The correction values between DE430 Principal Axis and Mean Earth frame + const double theta_x_rad = 0.285 * math::arcsec_to_rad; + const double theta_y_rad = 78.580 * math::arcsec_to_rad; + const double theta_z_rad = 67.573 * math::arcsec_to_rad; + + math::Matrix<3, 3> dcm_me_pa = + math::MakeRotationMatrixZ(theta_z_rad) * math::MakeRotationMatrixY(theta_y_rad) * math::MakeRotationMatrixX(theta_x_rad); + + return dcm_me_pa; +} + +} // namespace s2e::planet_rotation diff --git a/src/library/planet_rotation/moon_rotation_utilities.hpp b/src/math_physics/planet_rotation/moon_rotation_utilities.hpp similarity index 73% rename from src/library/planet_rotation/moon_rotation_utilities.hpp rename to src/math_physics/planet_rotation/moon_rotation_utilities.hpp index 08e208704..b46dbd7e1 100644 --- a/src/library/planet_rotation/moon_rotation_utilities.hpp +++ b/src/math_physics/planet_rotation/moon_rotation_utilities.hpp @@ -9,8 +9,10 @@ #ifndef S2E_LIBRARY_PLANET_ROTATION_MOON_MEAN_EARTH_PRINCIPAL_AXIS_FRAME_HPP_ #define S2E_LIBRARY_PLANET_ROTATION_MOON_MEAN_EARTH_PRINCIPAL_AXIS_FRAME_HPP_ -#include "library/math/matrix.hpp" -#include "library/math/vector.hpp" +#include "math_physics/math/matrix.hpp" +#include "math_physics/math/vector.hpp" + +namespace s2e::planet_rotation { /** * @fn CalcDcmEciToPrincipalAxis @@ -18,7 +20,7 @@ * @param[in] moon_position_eci_m: Moon position vector @ ECI frame [m] * @param[in] moon_velocity_eci_m_s: Moon velocity vector @ ECI frame [m/s] */ -libra::Matrix<3, 3> CalcDcmEciToPrincipalAxis(const libra::Vector<3> moon_position_eci_m, const libra::Vector<3> moon_velocity_eci_m_s); +math::Matrix<3, 3> CalcDcmEciToPrincipalAxis(const math::Vector<3> moon_position_eci_m, const math::Vector<3> moon_velocity_eci_m_s); /** * @fn CalcDcmEciToMeanEarth @@ -26,12 +28,14 @@ libra::Matrix<3, 3> CalcDcmEciToPrincipalAxis(const libra::Vector<3> moon_positi * @param[in] moon_position_eci_m: Moon position vector @ ECI frame [m] * @param[in] moon_velocity_eci_m_s: Moon velocity vector @ ECI frame [m/s] */ -libra::Matrix<3, 3> CalcDcmEciToMeanEarth(const libra::Vector<3> moon_position_eci_m, const libra::Vector<3> moon_velocity_eci_m_s); +math::Matrix<3, 3> CalcDcmEciToMeanEarth(const math::Vector<3> moon_position_eci_m, const math::Vector<3> moon_velocity_eci_m_s); /** * @fn CalcDcmMeToPrincipalAxis * @brief Calculate DCM from ME (Mean Earth) moon fixed frame to PA (Principal Axis) moon fixed frame */ -libra::Matrix<3, 3> CalcDcmMeanEarthToPrincipalAxis(); +math::Matrix<3, 3> CalcDcmMeanEarthToPrincipalAxis(); + +} // namespace s2e::planet_rotation #endif // S2E_LIBRARY_PLANET_ROTATION_MOON_MEAN_EARTH_PRINCIPAL_AXIS_FRAME_HPP_ diff --git a/src/library/randomization/global_randomization.cpp b/src/math_physics/randomization/global_randomization.cpp similarity index 88% rename from src/library/randomization/global_randomization.cpp rename to src/math_physics/randomization/global_randomization.cpp index 7a7282902..5c1bdef1a 100644 --- a/src/library/randomization/global_randomization.cpp +++ b/src/math_physics/randomization/global_randomization.cpp @@ -5,6 +5,8 @@ #include "global_randomization.hpp" +namespace s2e::randomization { + GlobalRandomization global_randomization; GlobalRandomization::GlobalRandomization() { seed_ = 0xdeadbeef; } @@ -21,4 +23,6 @@ long GlobalRandomization::MakeSeed() { seed = 0xdeadbeef; } return seed; -} \ No newline at end of file +} + +} // namespace s2e::randomization diff --git a/src/library/randomization/global_randomization.hpp b/src/math_physics/randomization/global_randomization.hpp similarity index 89% rename from src/library/randomization/global_randomization.hpp rename to src/math_physics/randomization/global_randomization.hpp index f63b63e82..5220420cf 100644 --- a/src/library/randomization/global_randomization.hpp +++ b/src/math_physics/randomization/global_randomization.hpp @@ -8,6 +8,8 @@ #include "./minimal_standard_linear_congruential_generator.hpp" +namespace s2e::randomization { + /** * @class global_randomization.hpp * @brief Class to manage global randomization @@ -33,10 +35,12 @@ class GlobalRandomization { private: static const unsigned int kMaxSeed = 0xffffffff; //!< Maximum value of seed - libra::MinimalStandardLcg base_randomizer_; //!< Base of global randomization + MinimalStandardLcg base_randomizer_; //!< Base of global randomization long seed_; //!< Seed of global randomization }; extern GlobalRandomization global_randomization; //!< Global randomization +} // namespace s2e::randomization + #endif // S2E_LIBRARY_RANDOMIZATION_GLOBAL_RANDOMIZATION_HPP_ diff --git a/src/library/randomization/minimal_standard_linear_congruential_generator.cpp b/src/math_physics/randomization/minimal_standard_linear_congruential_generator.cpp similarity index 95% rename from src/library/randomization/minimal_standard_linear_congruential_generator.cpp rename to src/math_physics/randomization/minimal_standard_linear_congruential_generator.cpp index 395a8943e..c1821e93b 100644 --- a/src/library/randomization/minimal_standard_linear_congruential_generator.cpp +++ b/src/math_physics/randomization/minimal_standard_linear_congruential_generator.cpp @@ -5,7 +5,7 @@ */ #include "minimal_standard_linear_congruential_generator.hpp" -using libra::MinimalStandardLcg; +using s2e::randomization::MinimalStandardLcg; #include diff --git a/src/library/randomization/minimal_standard_linear_congruential_generator.hpp b/src/math_physics/randomization/minimal_standard_linear_congruential_generator.hpp similarity index 96% rename from src/library/randomization/minimal_standard_linear_congruential_generator.hpp rename to src/math_physics/randomization/minimal_standard_linear_congruential_generator.hpp index 70b97a695..01ff61947 100644 --- a/src/library/randomization/minimal_standard_linear_congruential_generator.hpp +++ b/src/math_physics/randomization/minimal_standard_linear_congruential_generator.hpp @@ -7,7 +7,7 @@ #ifndef S2E_LIBRARY_RANDOMIZATION_MINIMAL_STANDARD_LINEAR_CONGRUENTIAL_GENERATOR_HPP_ #define S2E_LIBRARY_RANDOMIZATION_MINIMAL_STANDARD_LINEAR_CONGRUENTIAL_GENERATOR_HPP_ -namespace libra { +namespace s2e::randomization { /** * @class MinimalStandardLcg @@ -52,6 +52,6 @@ class MinimalStandardLcg { long seed_; //!< Seed of randomization }; -} // namespace libra +} // namespace s2e::randomization #endif // S2E_LIBRARY_RANDOMIZATION_MINIMAL_STANDARD_LINEAR_CONGRUENTIAL_GENERATOR_HPP_ diff --git a/src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp b/src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp similarity index 95% rename from src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp rename to src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp index 95fbc7075..3bdd51de9 100644 --- a/src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp +++ b/src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.cpp @@ -5,7 +5,7 @@ */ #include "minimal_standard_linear_congruential_generator_with_shuffle.hpp" -using libra::MinimalStandardLcgWithShuffle; +using s2e::randomization::MinimalStandardLcgWithShuffle; MinimalStandardLcgWithShuffle::MinimalStandardLcgWithShuffle() : table_position_(0) { Initialize(); } diff --git a/src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp b/src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp similarity index 96% rename from src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp rename to src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp index 6c42dddba..3d5913bb7 100644 --- a/src/library/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp +++ b/src/math_physics/randomization/minimal_standard_linear_congruential_generator_with_shuffle.hpp @@ -11,7 +11,7 @@ #include "minimal_standard_linear_congruential_generator.hpp" -namespace libra { +namespace s2e::randomization { /** * @class MinimalStandardLcgWithShuffle @@ -58,6 +58,6 @@ class MinimalStandardLcgWithShuffle { double mixing_table_[kTableSize]; //!< Mixing table }; -} // namespace libra +} // namespace s2e::randomization #endif // S2E_LIBRARY_RANDOMIZATION_MINIMAL_STANDARD_LINEAR_CONGRUENTIAL_GENERATOR_WITH_SHUFFLE_HPP_ diff --git a/src/library/randomization/normal_randomization.cpp b/src/math_physics/randomization/normal_randomization.cpp similarity index 97% rename from src/library/randomization/normal_randomization.cpp rename to src/math_physics/randomization/normal_randomization.cpp index 02eb484b7..b136700cb 100644 --- a/src/library/randomization/normal_randomization.cpp +++ b/src/math_physics/randomization/normal_randomization.cpp @@ -4,7 +4,7 @@ * @note Ref: NUMERICAL RECIPES in C, p.216-p.217 */ #include "normal_randomization.hpp" -using libra::NormalRand; +using s2e::randomization::NormalRand; #include //DBL_EPSILON #include //sqrt, log; diff --git a/src/library/randomization/normal_randomization.hpp b/src/math_physics/randomization/normal_randomization.hpp similarity index 96% rename from src/library/randomization/normal_randomization.hpp rename to src/math_physics/randomization/normal_randomization.hpp index 962126a0c..b230680a3 100644 --- a/src/library/randomization/normal_randomization.hpp +++ b/src/math_physics/randomization/normal_randomization.hpp @@ -8,9 +8,9 @@ #define S2E_LIBRARY_RANDOMIZATION_NORMAL_RANDOMIZATION_HPP_ #include "minimal_standard_linear_congruential_generator_with_shuffle.hpp" -using libra::MinimalStandardLcgWithShuffle; +using s2e::randomization::MinimalStandardLcgWithShuffle; -namespace libra { +namespace s2e::randomization { /** * @class NormalRand @@ -106,6 +106,6 @@ class NormalRand { bool is_empty_; //!< Flag to show the holder_ has available value }; -} // namespace libra +} // namespace s2e::randomization #endif // S2E_LIBRARY_RANDOMIZATION_NORMAL_RANDOMIZATION_HPP_ diff --git a/src/library/randomization/random_walk.hpp b/src/math_physics/randomization/random_walk.hpp similarity index 69% rename from src/library/randomization/random_walk.hpp rename to src/math_physics/randomization/random_walk.hpp index 306888d4b..aed70512b 100644 --- a/src/library/randomization/random_walk.hpp +++ b/src/math_physics/randomization/random_walk.hpp @@ -10,12 +10,14 @@ #include "../math/vector.hpp" #include "./normal_randomization.hpp" +namespace s2e::randomization { + /** * @class RandomWalk * @brief Class to calculate random wark value */ template -class RandomWalk : public libra::OrdinaryDifferentialEquation { +class RandomWalk : public math::OrdinaryDifferentialEquation { public: /** * @fn RandomWalk @@ -24,7 +26,7 @@ class RandomWalk : public libra::OrdinaryDifferentialEquation { * @param standard_deviation: Standard deviation of random walk excitation noise * @param limit: Limit of random walk */ - RandomWalk(double step_width_s, const libra::Vector& standard_deviation, const libra::Vector& limit); + RandomWalk(double step_width_s, const math::Vector& standard_deviation, const math::Vector& limit); /** * @fn DerivativeFunction @@ -33,13 +35,15 @@ class RandomWalk : public libra::OrdinaryDifferentialEquation { * @param [in] state: State vector * @param [out] rhs: Differentiated value of state vector */ - virtual void DerivativeFunction(double x, const libra::Vector& state, libra::Vector& rhs); + virtual void DerivativeFunction(double x, const math::Vector& state, math::Vector& rhs); private: - libra::Vector limit_; //!< Limit of random walk - libra::NormalRand normal_randomizer_[N]; //!< Random walk excitation noise + math::Vector limit_; //!< Limit of random walk + NormalRand normal_randomizer_[N]; //!< Random walk excitation noise }; +} // namespace s2e::randomization + #include "random_walk_template_functions.hpp" // template function definisions. #endif // S2E_LIBRARY_RANDOMIZATION_RANDOM_WALK_HPP_ \ No newline at end of file diff --git a/src/library/randomization/random_walk_template_functions.hpp b/src/math_physics/randomization/random_walk_template_functions.hpp similarity index 61% rename from src/library/randomization/random_walk_template_functions.hpp rename to src/math_physics/randomization/random_walk_template_functions.hpp index 3221d7228..1f782b7cb 100644 --- a/src/library/randomization/random_walk_template_functions.hpp +++ b/src/math_physics/randomization/random_walk_template_functions.hpp @@ -6,20 +6,22 @@ #ifndef S2E_LIBRARY_RANDOMIZATION_RANDOM_WALK_TEMPLATE_FUNCTIONS_HPP_ #define S2E_LIBRARY_RANDOMIZATION_RANDOM_WALK_TEMPLATE_FUNCTIONS_HPP_ -#include -#include +#include +#include + +namespace s2e::randomization { template -RandomWalk::RandomWalk(double step_width_s, const libra::Vector& standard_deviation, const libra::Vector& limit) - : libra::OrdinaryDifferentialEquation(step_width_s), limit_(limit) { +RandomWalk::RandomWalk(double step_width_s, const math::Vector& standard_deviation, const math::Vector& limit) + : math::OrdinaryDifferentialEquation(step_width_s), limit_(limit) { // Set standard deviation for (size_t i = 0; i < N; ++i) { - normal_randomizer_[i].SetParameters(0.0, standard_deviation[i], global_randomization.MakeSeed()); + normal_randomizer_[i].SetParameters(0.0, standard_deviation[i], s2e::randomization::global_randomization.MakeSeed()); } } template -void RandomWalk::DerivativeFunction(double x, const libra::Vector& state, libra::Vector& rhs) { +void RandomWalk::DerivativeFunction(double x, const math::Vector& state, math::Vector& rhs) { UNUSED(x); // TODO: consider the x is really need for this function for (size_t i = 0; i < N; ++i) { @@ -32,4 +34,6 @@ void RandomWalk::DerivativeFunction(double x, const libra::Vector& state, } } +} // namespace s2e::randomization + #endif // S2E_LIBRARY_RANDOMIZATION_RANDOM_WALK_TEMPLATE_FUNCTIONS_HPP_ diff --git a/src/library/time_system/date_time_format.cpp b/src/math_physics/time_system/date_time_format.cpp similarity index 96% rename from src/library/time_system/date_time_format.cpp rename to src/math_physics/time_system/date_time_format.cpp index d3efc41ca..d470bfef5 100644 --- a/src/library/time_system/date_time_format.cpp +++ b/src/math_physics/time_system/date_time_format.cpp @@ -11,6 +11,8 @@ #include #include +namespace s2e::time_system { + DateTime::DateTime(const std::string date_time) { sscanf(date_time.c_str(), "%zu/%zu/%zu %zu:%zu:%lf", &year_, &month_, &day_, &hour_, &minute_, &second_); } @@ -52,3 +54,5 @@ std::string DateTime::GetAsString() const { std::string output = stream.str(); return output; } + +} // namespace s2e::time_system diff --git a/src/library/time_system/date_time_format.hpp b/src/math_physics/time_system/date_time_format.hpp similarity index 96% rename from src/library/time_system/date_time_format.hpp rename to src/math_physics/time_system/date_time_format.hpp index 1e7d69d59..540c6fefa 100644 --- a/src/library/time_system/date_time_format.hpp +++ b/src/math_physics/time_system/date_time_format.hpp @@ -10,6 +10,8 @@ #include "epoch_time.hpp" +namespace s2e::time_system { + class EpochTime; /** @@ -60,4 +62,6 @@ class DateTime { double second_; //!< Second [0.0, 60.0) }; +} // namespace s2e::time_system + #endif // S2E_LIBRARY_TIME_SYSTEM_DATE_TIME_FORMAT_HPP_ diff --git a/src/library/time_system/epoch_time.cpp b/src/math_physics/time_system/epoch_time.cpp similarity index 97% rename from src/library/time_system/epoch_time.cpp rename to src/math_physics/time_system/epoch_time.cpp index b0bcda350..cee1a4068 100644 --- a/src/library/time_system/epoch_time.cpp +++ b/src/math_physics/time_system/epoch_time.cpp @@ -7,6 +7,8 @@ #include +namespace s2e::time_system { + EpochTime::EpochTime(const DateTime date_time) { // No leap second calculation const int doy[] = {1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; //!< Day of Year for the 1st day of each month @@ -73,3 +75,5 @@ EpochTime EpochTime::operator-(const EpochTime& right_side) const { EpochTime result(time_s, fraction_s); return result; } + +} // namespace s2e::time_system diff --git a/src/library/time_system/epoch_time.hpp b/src/math_physics/time_system/epoch_time.hpp similarity index 96% rename from src/library/time_system/epoch_time.hpp rename to src/math_physics/time_system/epoch_time.hpp index b783c674c..72723c066 100644 --- a/src/library/time_system/epoch_time.hpp +++ b/src/math_physics/time_system/epoch_time.hpp @@ -10,6 +10,8 @@ #include "date_time_format.hpp" +namespace s2e::time_system { + class DateTime; /** @@ -67,4 +69,6 @@ class EpochTime { double fraction_s_; //!< Fraction of second under 1 sec [0, 1) }; +} // namespace s2e::time_system + #endif // S2E_LIBRARY_TIME_SYSTEM_EPOCH_TIME_HPP_ diff --git a/src/library/time_system/gps_time.cpp b/src/math_physics/time_system/gps_time.cpp similarity index 94% rename from src/library/time_system/gps_time.cpp rename to src/math_physics/time_system/gps_time.cpp index a9ceabeb8..5bed94290 100644 --- a/src/library/time_system/gps_time.cpp +++ b/src/math_physics/time_system/gps_time.cpp @@ -5,6 +5,8 @@ #include "gps_time.hpp" +namespace s2e::time_system { + const DateTime GpsTime::kEpochOfGpsTimeInDateTime_ = DateTime("1980/1/6 00:00:00.0"); const EpochTime GpsTime::kEpochOfGpsTimeInEpochTime_ = EpochTime(kEpochOfGpsTimeInDateTime_); const EpochTime GpsTime::kLeapSecondAheadFromUtc_ = EpochTime(18, 0); //!< Leap second ahead from UTC @ May 2023 @@ -23,3 +25,5 @@ void GpsTime::CalcEpochTime() { epoch_time_ = kEpochOfGpsTimeInEpochTime_ + time_diff; } + +} // namespace s2e::time_system diff --git a/src/library/time_system/gps_time.hpp b/src/math_physics/time_system/gps_time.hpp similarity index 97% rename from src/library/time_system/gps_time.hpp rename to src/math_physics/time_system/gps_time.hpp index 2a2f657ee..fdc42d5a8 100644 --- a/src/library/time_system/gps_time.hpp +++ b/src/math_physics/time_system/gps_time.hpp @@ -11,6 +11,8 @@ #include "date_time_format.hpp" #include "epoch_time.hpp" +namespace s2e::time_system { + /** * @class GpsTime * @brief A class to define GPS time expression @@ -95,4 +97,6 @@ class GpsTime { void CalcEpochTime(); }; +} // namespace s2e::time_system + #endif // S2E_LIBRARY_TIME_SYSTEM_GPS_TIME_HPP_ diff --git a/src/library/time_system/test_date_time_format.cpp b/src/math_physics/time_system/test_date_time_format.cpp similarity index 98% rename from src/library/time_system/test_date_time_format.cpp rename to src/math_physics/time_system/test_date_time_format.cpp index 8ac7a60cd..935e92776 100644 --- a/src/library/time_system/test_date_time_format.cpp +++ b/src/math_physics/time_system/test_date_time_format.cpp @@ -2,6 +2,8 @@ #include "date_time_format.hpp" +using namespace s2e::time_system; + /** * @brief Test Constructor with value */ diff --git a/src/library/time_system/test_epoch_time.cpp b/src/math_physics/time_system/test_epoch_time.cpp similarity index 98% rename from src/library/time_system/test_epoch_time.cpp rename to src/math_physics/time_system/test_epoch_time.cpp index 6ade9cad2..e1281ca11 100644 --- a/src/library/time_system/test_epoch_time.cpp +++ b/src/math_physics/time_system/test_epoch_time.cpp @@ -3,6 +3,8 @@ #include "date_time_format.hpp" #include "epoch_time.hpp" +using namespace s2e::time_system; + TEST(EpochTime, ConstructorNominal) { EpochTime time(1000000000, 0.250); diff --git a/src/library/time_system/test_gps_time.cpp b/src/math_physics/time_system/test_gps_time.cpp similarity index 98% rename from src/library/time_system/test_gps_time.cpp rename to src/math_physics/time_system/test_gps_time.cpp index c3aeabe24..737d2f7c6 100644 --- a/src/library/time_system/test_gps_time.cpp +++ b/src/math_physics/time_system/test_gps_time.cpp @@ -2,6 +2,8 @@ #include "gps_time.hpp" +using namespace s2e::time_system; + /** * @brief Test Constructor */ diff --git a/src/s2e.cpp b/src/s2e.cpp index ed446ee20..f0d19356e 100644 --- a/src/s2e.cpp +++ b/src/s2e.cpp @@ -15,7 +15,7 @@ #include // Simulator includes -#include "library/logger/logger.hpp" +#include "logger/logger.hpp" // Add custom include files #include "simulation_sample/case/sample_case.hpp" @@ -46,8 +46,8 @@ int main(int argc, char *argv[]) system_clock::time_point start, end; start = system_clock::now(); - std::string data_path = "../../data/"; - std::string ini_path = INI_FILE_DIR_FROM_EXE; + std::string data_path = "../../"; + std::string ini_path = SETTINGS_DIR_FROM_EXE; std::string ini_file = ini_path + "/sample_simulation_base.ini"; // Parsing arguments: SatAttSim [ini_file] @@ -69,7 +69,7 @@ int main(int argc, char *argv[]) std::cout << "\tIni file: "; print_path(ini_file); - auto simulation_case = SampleCase(ini_file); + auto simulation_case = s2e::sample::SampleCase(ini_file); simulation_case.Initialize(); simulation_case.Main(); diff --git a/src/setting_file_reader/CMakeLists.txt b/src/setting_file_reader/CMakeLists.txt new file mode 100644 index 000000000..898d3e0fa --- /dev/null +++ b/src/setting_file_reader/CMakeLists.txt @@ -0,0 +1,10 @@ +project(SETTING_FILE_READER) +cmake_minimum_required(VERSION 3.13) + +add_library(${PROJECT_NAME} STATIC + initialize_file_access.cpp + c2a_command_database.cpp + wings_operation_file.cpp +) + +include(../../common.cmake) diff --git a/src/library/initialize/c2a_command_database.cpp b/src/setting_file_reader/c2a_command_database.cpp similarity index 85% rename from src/library/initialize/c2a_command_database.cpp rename to src/setting_file_reader/c2a_command_database.cpp index b31655166..7811b36ee 100644 --- a/src/library/initialize/c2a_command_database.cpp +++ b/src/setting_file_reader/c2a_command_database.cpp @@ -7,9 +7,11 @@ #include #include -#include -#include #include +#include +#include + +namespace s2e::setting_file_reader { C2aCommandInformation::C2aCommandInformation(const std::string cmd_db_line) { if (cmd_db_line.find("*") == 0) return; @@ -93,61 +95,61 @@ void DecodeC2aCommandArgument(const C2aArgumentType type, const std::string argu case C2aArgumentType::kUint8t: { size_param = 1; uint8_t argument = (uint8_t)std::stoul(argument_string); // TODO: 範囲外処理 - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kUint16t: { size_param = 2; uint16_t argument = (uint16_t)std::stoul(argument_string); // TODO: 範囲外処理 - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kUint32t: { size_param = 4; uint32_t argument = (uint32_t)std::stoul(argument_string); // TODO: 範囲外処理 - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kUint64t: { size_param = 8; uint64_t argument = std::stoul(argument_string); - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kInt8t: { size_param = 1; int8_t argument = (int8_t)std::stoi(argument_string); // TODO: 範囲外処理 - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kInt16t: { size_param = 2; int16_t argument = (int16_t)std::stoi(argument_string); // TODO: 範囲外処理 - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kInt32t: { size_param = 4; int32_t argument = std::stoi(argument_string); - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kInt64t: { size_param = 8; int64_t argument = std::stol(argument_string); - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kFloat: { size_param = 4; float argument = std::stof(argument_string); - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kDouble: { size_param = 8; double argument = std::stod(argument_string); - endian_memcpy(param, &argument, size_param); + utilities::endian_memcpy(param, &argument, size_param); break; } case C2aArgumentType::kRaw: { @@ -158,3 +160,5 @@ void DecodeC2aCommandArgument(const C2aArgumentType type, const std::string argu break; } } + +} // namespace s2e::setting_file_reader diff --git a/src/library/initialize/c2a_command_database.hpp b/src/setting_file_reader/c2a_command_database.hpp similarity index 97% rename from src/library/initialize/c2a_command_database.hpp rename to src/setting_file_reader/c2a_command_database.hpp index 9fd2e9125..f8905f49a 100644 --- a/src/library/initialize/c2a_command_database.hpp +++ b/src/setting_file_reader/c2a_command_database.hpp @@ -12,6 +12,8 @@ #include #include +namespace s2e::setting_file_reader { + /** * @enum C2aArgumentType * @brief Argument type used in C2A command @@ -115,4 +117,6 @@ class C2aCommandDatabase { */ void DecodeC2aCommandArgument(const C2aArgumentType type, const std::string argument_string, uint8_t* param, size_t& size_param); +} // namespace s2e::setting_file_reader + #endif // S2E_LIBRARY_INITIALIZE_C2A_COMMAND_DATABASE_HPP_ diff --git a/src/library/initialize/initialize_file_access.cpp b/src/setting_file_reader/initialize_file_access.cpp similarity index 97% rename from src/library/initialize/initialize_file_access.cpp rename to src/setting_file_reader/initialize_file_access.cpp index b05e31e98..187b55998 100644 --- a/src/library/initialize/initialize_file_access.cpp +++ b/src/setting_file_reader/initialize_file_access.cpp @@ -14,6 +14,8 @@ #include "../utilities/macros.hpp" +namespace s2e::setting_file_reader { + #ifdef WIN32 IniAccess::IniAccess(const std::string file_path) : file_path_(file_path) { // strcpy_s(file_path_char_, (size_t)_countof(file_path_char_), file_path_.c_str()); @@ -118,8 +120,8 @@ std::vector IniAccess::ReadVectorDouble(const char* section_name, const return data; } -void IniAccess::ReadQuaternion(const char* section_name, const char* key_name, libra::Quaternion& data) { - libra::Quaternion temp; +void IniAccess::ReadQuaternion(const char* section_name, const char* key_name, math::Quaternion& data) { + math::Quaternion temp; double norm = 0.0; for (int i = 0; i < 4; i++) { // Read Quaternion as new format @@ -165,8 +167,8 @@ std::string IniAccess::ReadString(const char* section_name, const char* key_name std::regex inline_comment_pattern("\\s*//.*"); value = std::regex_replace(value, inline_comment_pattern, ""); // INI_FILE_DIR - std::string ini_path = INI_FILE_DIR_FROM_EXE; - value = std::regex_replace(value, std::regex("INI_FILE_DIR_FROM_EXE"), ini_path); + std::string ini_path = SETTINGS_DIR_FROM_EXE; + value = std::regex_replace(value, std::regex("SETTINGS_DIR_FROM_EXE"), ini_path); // EXT_LIB_DIR std::string ext_lib_path = EXT_LIB_DIR_FROM_EXE; value = std::regex_replace(value, std::regex("EXT_LIB_DIR_FROM_EXE"), ext_lib_path); @@ -283,3 +285,5 @@ void IniAccess::ReadCsvString(std::vector>& output_valu output_value.push_back(temp); } } + +} // namespace s2e::setting_file_reader diff --git a/src/library/initialize/initialize_file_access.hpp b/src/setting_file_reader/initialize_file_access.hpp similarity index 95% rename from src/library/initialize/initialize_file_access.hpp rename to src/setting_file_reader/initialize_file_access.hpp index 3d537b2ee..e63cd424f 100644 --- a/src/library/initialize/initialize_file_access.hpp +++ b/src/setting_file_reader/initialize_file_access.hpp @@ -17,16 +17,18 @@ #define NOMINMAX #include #else -#include +#include "../../ExtLibraries/inih/cpp/INIReader.h" #endif #include -#include -#include +#include +#include #include #include #include +namespace s2e::setting_file_reader { + /** * @class IniAccess * @brief Class to read and get parameters for the `ini` format file @@ -110,7 +112,7 @@ class IniAccess { * @param[out] data: Read vector type data */ template - void ReadVector(const char* section_name, const char* key_name, libra::Vector& data); + void ReadVector(const char* section_name, const char* key_name, math::Vector& data); /** * @fn ReadStrVector * @brief Read list of string type @@ -126,7 +128,7 @@ class IniAccess { * @param[in] key_name: Key name * @param[out] data: Read quaternion data */ - void ReadQuaternion(const char* section_name, const char* key_name, libra::Quaternion& data); + void ReadQuaternion(const char* section_name, const char* key_name, math::Quaternion& data); /** * @fn ReadChar * @brief Read characters data @@ -208,7 +210,7 @@ class IniAccess { }; template -void IniAccess::ReadVector(const char* section_name, const char* key_name, libra::Vector& data) { +void IniAccess::ReadVector(const char* section_name, const char* key_name, math::Vector& data) { for (size_t i = 0; i < NumElement; i++) { std::stringstream c_name; c_name << key_name << "(" << i << ")"; @@ -216,4 +218,6 @@ void IniAccess::ReadVector(const char* section_name, const char* key_name, libra } } +} // namespace s2e::setting_file_reader + #endif // S2E_LIBRARY_INITIALIZE_INITIALIZE_FILE_ACCESS_HPP_ diff --git a/src/library/initialize/wings_operation_file.cpp b/src/setting_file_reader/wings_operation_file.cpp similarity index 93% rename from src/library/initialize/wings_operation_file.cpp rename to src/setting_file_reader/wings_operation_file.cpp index 628c22fcf..78efa4d9d 100644 --- a/src/library/initialize/wings_operation_file.cpp +++ b/src/setting_file_reader/wings_operation_file.cpp @@ -7,6 +7,8 @@ #include +namespace s2e::setting_file_reader { + WingsOperationFile::WingsOperationFile(const std::string file_path) { // File open std::ifstream file(file_path); @@ -45,3 +47,5 @@ std::string WingsOperationFile::GetLatestLine() { return line; } + +} // namespace s2e::setting_file_reader diff --git a/src/library/initialize/wings_operation_file.hpp b/src/setting_file_reader/wings_operation_file.hpp similarity index 92% rename from src/library/initialize/wings_operation_file.hpp rename to src/setting_file_reader/wings_operation_file.hpp index 11cb2a9b0..51ed0d1d5 100644 --- a/src/library/initialize/wings_operation_file.hpp +++ b/src/setting_file_reader/wings_operation_file.hpp @@ -11,6 +11,8 @@ #include "c2a_command_database.hpp" +namespace s2e::setting_file_reader { + /** * @class WingsOperationFile * @brief A class to handle WINGS operation file @@ -35,4 +37,6 @@ class WingsOperationFile { size_t line_pointer_ = 0; //!< Line pointer }; +} // namespace s2e::setting_file_reader + #endif // S2E_LIBRARY_INITIALIZE_WINGS_OPERATION_FILE_HPP_ diff --git a/src/simulation/case/simulation_case.cpp b/src/simulation/case/simulation_case.cpp index 334514a94..e8cfb56e6 100644 --- a/src/simulation/case/simulation_case.cpp +++ b/src/simulation/case/simulation_case.cpp @@ -5,13 +5,15 @@ #include "simulation_case.hpp" -#include -#include +#include +#include #include +namespace s2e::simulation { + SimulationCase::SimulationCase(const std::string initialize_base_file) { // Initialize Log - simulation_configuration_.main_logger_ = InitLog(initialize_base_file); + simulation_configuration_.main_logger_ = logger::InitLog(initialize_base_file); // Initialize Simulation Configuration InitializeSimulationConfiguration(initialize_base_file); @@ -21,16 +23,16 @@ SimulationCase::SimulationCase(const std::string initialize_base_file, const Mon const std::string log_path) { if (monte_carlo_simulator.IsEnabled() == false) { // Monte Carlo simulation is disabled - simulation_configuration_.main_logger_ = InitLog(initialize_base_file); + simulation_configuration_.main_logger_ = logger::InitLog(initialize_base_file); } else { // Monte Carlo Simulation is enabled std::string log_file_name = "default" + std::to_string(monte_carlo_simulator.GetNumberOfExecutionsDone()) + ".csv"; - IniAccess ini_file(initialize_base_file); + setting_file_reader::IniAccess ini_file(initialize_base_file); bool save_ini_files = ini_file.ReadEnable("SIMULATION_SETTINGS", "save_initialize_files"); simulation_configuration_.main_logger_ = - new Logger(log_file_name, log_path, initialize_base_file, save_ini_files, monte_carlo_simulator.GetSaveLogHistoryFlag()); + new logger::Logger(log_file_name, log_path, initialize_base_file, save_ini_files, monte_carlo_simulator.GetSaveLogHistoryFlag()); } // Initialize Simulation Configuration InitializeSimulationConfiguration(initialize_base_file); @@ -85,7 +87,7 @@ std::string SimulationCase::GetLogValue() const { void SimulationCase::InitializeSimulationConfiguration(const std::string initialize_base_file) { // Initialize - IniAccess simulation_base_ini = IniAccess(initialize_base_file); + setting_file_reader::IniAccess simulation_base_ini = setting_file_reader::IniAccess(initialize_base_file); const char* section = "SIMULATION_SETTINGS"; simulation_configuration_.initialize_base_file_name_ = initialize_base_file; @@ -102,6 +104,8 @@ void SimulationCase::InitializeSimulationConfiguration(const std::string initial simulation_configuration_.gnss_file_ = simulation_base_ini.ReadString(section, "gnss_file"); // Global Environment - global_environment_ = new GlobalEnvironment(&simulation_configuration_); + global_environment_ = new environment::GlobalEnvironment(&simulation_configuration_); global_environment_->LogSetup(*(simulation_configuration_.main_logger_)); -} \ No newline at end of file +} + +} // namespace s2e::simulation diff --git a/src/simulation/case/simulation_case.hpp b/src/simulation/case/simulation_case.hpp index b6aeba357..26f012dc4 100644 --- a/src/simulation/case/simulation_case.hpp +++ b/src/simulation/case/simulation_case.hpp @@ -7,17 +7,19 @@ #define S2E_SIMULATION_CASE_SIMULATION_CASE_HPP_ #include -#include +#include #include #include "../simulation_configuration.hpp" class Logger; +namespace s2e::simulation { + /** * @class SimulationCase * @brief Base class to define simulation scenario */ -class SimulationCase : public ILoggable { +class SimulationCase : public logger::ILoggable { public: /** * @fn SimulationCase @@ -72,11 +74,11 @@ class SimulationCase : public ILoggable { * @fn GetGlobalEnvironment * @brief Return global environment */ - inline const GlobalEnvironment& GetGlobalEnvironment() const { return *global_environment_; } + inline const environment::GlobalEnvironment& GetGlobalEnvironment() const { return *global_environment_; } protected: - SimulationConfiguration simulation_configuration_; //!< Simulation setting - GlobalEnvironment* global_environment_; //!< Global Environment + SimulationConfiguration simulation_configuration_; //!< Simulation setting + environment::GlobalEnvironment* global_environment_; //!< Global Environment /** * @fn InitializeSimulationConfiguration @@ -98,4 +100,6 @@ class SimulationCase : public ILoggable { virtual void UpdateTargetObjects() = 0; }; +} // namespace s2e::simulation + #endif // S2E_SIMULATION_CASE_SIMULATION_CASE_HPP_ diff --git a/src/simulation/ground_station/ground_station.cpp b/src/simulation/ground_station/ground_station.cpp index cac7332f2..2c06c7b4c 100644 --- a/src/simulation/ground_station/ground_station.cpp +++ b/src/simulation/ground_station/ground_station.cpp @@ -6,14 +6,16 @@ #include "ground_station.hpp" #include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include +#include -GroundStation::GroundStation(const SimulationConfiguration* configuration, const unsigned int ground_station_id) +namespace s2e::ground_station { + +GroundStation::GroundStation(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id) : ground_station_id_(ground_station_id) { Initialize(configuration, ground_station_id_); number_of_spacecraft_ = configuration->number_of_simulated_spacecraft_; @@ -24,9 +26,9 @@ GroundStation::GroundStation(const SimulationConfiguration* configuration, const GroundStation::~GroundStation() {} -void GroundStation::Initialize(const SimulationConfiguration* configuration, const unsigned int ground_station_id) { +void GroundStation::Initialize(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id) { std::string gs_ini_path = configuration->ground_station_file_list_[0]; - auto conf = IniAccess(gs_ini_path); + auto conf = setting_file_reader::IniAccess(gs_ini_path); const char* section_base = "GROUND_STATION_"; const std::string section_tmp = section_base + std::to_string(static_cast(ground_station_id)); @@ -35,7 +37,7 @@ void GroundStation::Initialize(const SimulationConfiguration* configuration, con double latitude_deg = conf.ReadDouble(Section, "latitude_deg"); double longitude_deg = conf.ReadDouble(Section, "longitude_deg"); double height_m = conf.ReadDouble(Section, "height_m"); - geodetic_position_ = GeodeticPosition(latitude_deg * libra::deg_to_rad, longitude_deg * libra::deg_to_rad, height_m); + geodetic_position_ = geodesy::GeodeticPosition(latitude_deg * math::deg_to_rad, longitude_deg * math::deg_to_rad, height_m); position_ecef_m_ = geodetic_position_.CalcEcefPosition(); elevation_limit_angle_deg_ = conf.ReadDouble(Section, "elevation_limit_angle_deg"); @@ -43,26 +45,26 @@ void GroundStation::Initialize(const SimulationConfiguration* configuration, con configuration->main_logger_->CopyFileToLogDirectory(gs_ini_path); } -void GroundStation::LogSetup(Logger& logger) { logger.AddLogList(this); } +void GroundStation::LogSetup(logger::Logger& logger) { logger.AddLogList(this); } -void GroundStation::Update(const EarthRotation& celestial_rotation, const Spacecraft& spacecraft) { - libra::Matrix<3, 3> dcm_ecef2eci = celestial_rotation.GetDcmJ2000ToEcef().Transpose(); +void GroundStation::Update(const environment::EarthRotation& celestial_rotation, const spacecraft::Spacecraft& spacecraft) { + math::Matrix<3, 3> dcm_ecef2eci = celestial_rotation.GetDcmJ2000ToEcef().Transpose(); position_i_m_ = dcm_ecef2eci * position_ecef_m_; is_visible_[spacecraft.GetSpacecraftId()] = CalcIsVisible(spacecraft.GetDynamics().GetOrbit().GetPosition_ecef_m()); } -bool GroundStation::CalcIsVisible(const libra::Vector<3> spacecraft_position_ecef_m) { - libra::Quaternion q_ecef_to_ltc = geodetic_position_.GetQuaternionXcxfToLtc(); +bool GroundStation::CalcIsVisible(const math::Vector<3> spacecraft_position_ecef_m) { + math::Quaternion q_ecef_to_ltc = geodetic_position_.GetQuaternionXcxfToLtc(); - libra::Vector<3> sc_pos_ltc = q_ecef_to_ltc.FrameConversion(spacecraft_position_ecef_m - position_ecef_m_); // Satellite position in LTC frame [m] + math::Vector<3> sc_pos_ltc = q_ecef_to_ltc.FrameConversion(spacecraft_position_ecef_m - position_ecef_m_); // Satellite position in LTC frame [m] sc_pos_ltc = sc_pos_ltc.CalcNormalizedVector(); - libra::Vector<3> dir_gs_to_zenith = libra::Vector<3>(0); + math::Vector<3> dir_gs_to_zenith = math::Vector<3>(0); dir_gs_to_zenith[2] = 1; // Judge the satellite position angle is over the minimum elevation - if (dot(sc_pos_ltc, dir_gs_to_zenith) > sin(elevation_limit_angle_deg_ * libra::deg_to_rad)) { + if (dot(sc_pos_ltc, dir_gs_to_zenith) > sin(elevation_limit_angle_deg_ * math::deg_to_rad)) { return true; } else { return false; @@ -75,9 +77,9 @@ std::string GroundStation::GetLogHeader() const { std::string head = "ground_station" + std::to_string(ground_station_id_) + "_"; for (unsigned int i = 0; i < number_of_spacecraft_; i++) { std::string legend = head + "sc" + std::to_string(i) + "_visible_flag"; - str_tmp += WriteScalar(legend); + str_tmp += logger::WriteScalar(legend); } - str_tmp += WriteVector("ground_station_position", "eci", "m", 3); + str_tmp += logger::WriteVector("ground_station_position", "eci", "m", 3); return str_tmp; } @@ -85,8 +87,10 @@ std::string GroundStation::GetLogValue() const { std::string str_tmp = ""; for (unsigned int i = 0; i < number_of_spacecraft_; i++) { - str_tmp += WriteScalar(is_visible_.at(i)); + str_tmp += logger::WriteScalar(is_visible_.at(i)); } - str_tmp += WriteVector(position_i_m_); + str_tmp += logger::WriteVector(position_i_m_); return str_tmp; } + +} // namespace s2e::ground_station diff --git a/src/simulation/ground_station/ground_station.hpp b/src/simulation/ground_station/ground_station.hpp index d6a505d03..866b31edf 100644 --- a/src/simulation/ground_station/ground_station.hpp +++ b/src/simulation/ground_station/ground_station.hpp @@ -6,23 +6,25 @@ #ifndef S2E_SIMULATION_GROUND_STATION_GROUND_STATION_HPP_ #define S2E_SIMULATION_GROUND_STATION_GROUND_STATION_HPP_ -#include -#include +#include +#include #include #include "../simulation_configuration.hpp" +namespace s2e::ground_station { + /** * @class GroundStation * @brief Base class of ground station */ -class GroundStation : public ILoggable { +class GroundStation : public logger::ILoggable { public: /** * @fn GroundStation * @brief Constructor */ - GroundStation(const SimulationConfiguration* configuration, const unsigned int ground_station_id_); + GroundStation(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id_); /** * @fn ~GroundStation * @brief Destructor @@ -33,17 +35,17 @@ class GroundStation : public ILoggable { * @fn Initialize * @brief Virtual function to initialize the ground station */ - virtual void Initialize(const SimulationConfiguration* configuration, const unsigned int ground_station_id); + virtual void Initialize(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id); /** * @fn LogSetup * @brief Virtual function to log output setting for ground station related components */ - virtual void LogSetup(Logger& logger); + virtual void LogSetup(logger::Logger& logger); /** * @fn Update * @brief Virtual function of main routine */ - virtual void Update(const EarthRotation& celestial_rotation, const Spacecraft& spacecraft); + virtual void Update(const environment::EarthRotation& celestial_rotation, const spacecraft::Spacecraft& spacecraft); // Override functions for ILoggable /** @@ -67,17 +69,17 @@ class GroundStation : public ILoggable { * @fn GetGeodeticPosition * @brief Return ground station position in the geodetic frame */ - GeodeticPosition GetGeodeticPosition() const { return geodetic_position_; } + geodesy::GeodeticPosition GetGeodeticPosition() const { return geodetic_position_; } /** * @fn GetPosition_ecef_m * @brief Return ground station position in the ECEF frame [m] */ - Vector<3> GetPosition_ecef_m() const { return position_ecef_m_; } + math::Vector<3> GetPosition_ecef_m() const { return position_ecef_m_; } /** * @fn GetPosition_i_m * @brief Return ground station position in the inertial frame [m] */ - Vector<3> GetPosition_i_m() const { return position_i_m_; } + math::Vector<3> GetPosition_i_m() const { return position_i_m_; } /** * @fn GetElevationLimitAngle_deg * @brief Return ground station elevation limit angle [deg] @@ -91,11 +93,11 @@ class GroundStation : public ILoggable { bool IsVisible(const unsigned int spacecraft_id) const { return is_visible_.at(spacecraft_id); } protected: - unsigned int ground_station_id_; //!< Ground station ID - GeodeticPosition geodetic_position_; //!< Ground Station Position in the geodetic frame - Vector<3> position_ecef_m_{0.0}; //!< Ground Station Position in the ECEF frame [m] - Vector<3> position_i_m_{0.0}; //!< Ground Station Position in the inertial frame [m] - double elevation_limit_angle_deg_; //!< Minimum elevation angle to work the ground station [deg] + unsigned int ground_station_id_; //!< Ground station ID + geodesy::GeodeticPosition geodetic_position_; //!< Ground Station Position in the geodetic frame + math::Vector<3> position_ecef_m_{0.0}; //!< Ground Station Position in the ECEF frame [m] + math::Vector<3> position_i_m_{0.0}; //!< Ground Station Position in the inertial frame [m] + double elevation_limit_angle_deg_; //!< Minimum elevation angle to work the ground station [deg] std::map is_visible_; //!< Visible flag for each spacecraft ID (not care antenna) unsigned int number_of_spacecraft_; //!< Number of spacecraft in the simulation @@ -106,7 +108,9 @@ class GroundStation : public ILoggable { * @param [in] spacecraft_position_ecef_m: spacecraft position in ECEF frame [m] * @return True when the satellite is visible from the ground station */ - bool CalcIsVisible(const Vector<3> spacecraft_position_ecef_m); + bool CalcIsVisible(const math::Vector<3> spacecraft_position_ecef_m); }; +} // namespace s2e::ground_station + #endif // S2E_SIMULATION_GROUND_STATION_GROUND_STATION_HPP_ diff --git a/src/simulation/hils/hils_port_manager.cpp b/src/simulation/hils/hils_port_manager.cpp index b794334be..8f68bff4f 100644 --- a/src/simulation/hils/hils_port_manager.cpp +++ b/src/simulation/hils/hils_port_manager.cpp @@ -5,7 +5,9 @@ #include "hils_port_manager.hpp" -#include +#include + +namespace s2e::simulation { // #define HILS_PORT_MANAGER_SHOW_DEBUG_DATA @@ -45,7 +47,7 @@ int HilsPortManager::UartCloseComPort(unsigned int port_id) { } uart_ports_[port_id]->ClosePort(); - HilsUartPort* port = uart_ports_.at(port_id); + components::HilsUartPort* port = uart_ports_.at(port_id); delete port; uart_ports_.erase(port_id); return 0; @@ -58,7 +60,7 @@ int HilsPortManager::UartCloseComPort(unsigned int port_id) { int HilsPortManager::UartReceive(unsigned int port_id, unsigned char* buffer, int offset, int length) { #ifdef USE_HILS - HilsUartPort* port = uart_ports_[port_id]; + components::HilsUartPort* port = uart_ports_[port_id]; if (port == nullptr) return -1; int ret = port->ReadRx(buffer, offset, length); #ifdef HILS_PORT_MANAGER_SHOW_DEBUG_DATA @@ -83,7 +85,7 @@ int HilsPortManager::UartReceive(unsigned int port_id, unsigned char* buffer, in int HilsPortManager::UartSend(unsigned int port_id, const unsigned char* buffer, int offset, int length) { #ifdef USE_HILS - HilsUartPort* port = uart_ports_[port_id]; + components::HilsUartPort* port = uart_ports_[port_id]; if (port == nullptr) return -1; int ret = port->WriteTx(buffer, offset, length); #ifdef HILS_PORT_MANAGER_SHOW_DEBUG_DATA @@ -130,7 +132,7 @@ int HilsPortManager::I2cTargetCloseComPort(unsigned int port_id) { return -1; } i2c_ports_[port_id]->ClosePort(); - HilsI2cTargetPort* port = i2c_ports_.at(port_id); + components::HilsI2cTargetPort* port = i2c_ports_.at(port_id); delete port; i2c_ports_.erase(port_id); return 0; @@ -144,7 +146,7 @@ int HilsPortManager::I2cTargetCloseComPort(unsigned int port_id) { int HilsPortManager::I2cTargetWriteRegister(unsigned int port_id, const unsigned char register_address, const unsigned char* data, const unsigned char length) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; for (unsigned char i = 0; i < length; i++) { port->WriteRegister(register_address + i, data[i]); @@ -163,7 +165,7 @@ int HilsPortManager::I2cTargetWriteRegister(unsigned int port_id, const unsigned int HilsPortManager::I2cTargetReadRegister(unsigned int port_id, const unsigned char register_address, unsigned char* data, const unsigned char length) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; for (unsigned char i = 0; i < length; i++) { data[i] = port->ReadRegister(register_address + i); @@ -181,7 +183,7 @@ int HilsPortManager::I2cTargetReadRegister(unsigned int port_id, const unsigned int HilsPortManager::I2cTargetReadCommand(unsigned int port_id, unsigned char* data, const unsigned char length) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; port->ReadCommand(data, length); return 0; @@ -196,7 +198,7 @@ int HilsPortManager::I2cTargetReadCommand(unsigned int port_id, unsigned char* d int HilsPortManager::I2cTargetReceive(unsigned int port_id) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; int ret = port->Receive(); #ifdef HILS_PORT_MANAGER_SHOW_DEBUG_DATA @@ -214,7 +216,7 @@ int HilsPortManager::I2cTargetReceive(unsigned int port_id) { int HilsPortManager::I2cTargetSend(unsigned int port_id, const unsigned char length) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; int ret = port->Send(length); #ifdef HILS_PORT_MANAGER_SHOW_DEBUG_DATA @@ -233,7 +235,7 @@ int HilsPortManager::I2cTargetSend(unsigned int port_id, const unsigned char len int HilsPortManager::I2cTargetGetStoredFrameCounter(unsigned int port_id) { #ifdef USE_HILS - HilsI2cTargetPort* port = i2c_ports_[port_id]; + components::HilsI2cTargetPort* port = i2c_ports_[port_id]; if (port == nullptr) return -1; return port->GetStoredFrameCounter(); #else @@ -258,3 +260,5 @@ int HilsPortManager::I2cControllerReceive(unsigned int port_id, unsigned char* b int HilsPortManager::I2cControllerSend(unsigned int port_id, const unsigned char* buffer, int offset, int length) { return UartSend(port_id, buffer, offset, length); } + +} // namespace s2e::simulation diff --git a/src/simulation/hils/hils_port_manager.hpp b/src/simulation/hils/hils_port_manager.hpp index d4db5958e..cd04dc173 100644 --- a/src/simulation/hils/hils_port_manager.hpp +++ b/src/simulation/hils/hils_port_manager.hpp @@ -7,11 +7,13 @@ #define S2E_SIMULATION_HILS_HILS_PORT_MANAGER_HPP_ #ifdef USE_HILS -#include "ports/hils_i2c_target_port.hpp" -#include "ports/hils_uart_port.hpp" +#include "../../components/ports/hils_i2c_target_port.hpp" +#include "../../components/ports/hils_uart_port.hpp" #endif #include +namespace s2e::simulation { + /** * @class HilsPortManager * @brief Class to manage COM ports for HILS test @@ -163,9 +165,11 @@ class HilsPortManager { private: #ifdef USE_HILS - std::map uart_ports_; //!< UART ports - std::map i2c_ports_; //!< I2C ports + std::map uart_ports_; //!< UART ports + std::map i2c_ports_; //!< I2C ports #endif }; +} // namespace s2e::simulation + #endif // S2E_SIMULATION_HILS_HILS_PORT_MANAGER_HPP_ diff --git a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.cpp b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.cpp index fe8716e1e..967b92b1d 100644 --- a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.cpp +++ b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.cpp @@ -5,10 +5,12 @@ #include "initialize_monte_carlo_parameters.hpp" -#include +#include using namespace std; +namespace s2e::simulation { + random_device InitializedMonteCarloParameters::randomizer_; mt19937 InitializedMonteCarloParameters::mt_; uniform_real_distribution<>* InitializedMonteCarloParameters::uniform_distribution_; @@ -46,7 +48,7 @@ void InitializedMonteCarloParameters::GetRandomizedScalar(double& destination) c } } -void InitializedMonteCarloParameters::GetRandomizedQuaternion(libra::Quaternion& destination) const { +void InitializedMonteCarloParameters::GetRandomizedQuaternion(math::Quaternion& destination) const { if (randomization_type_ == kNoRandomization) { ; } else if (4 > randomized_value_.size()) { @@ -120,7 +122,7 @@ void InitializedMonteCarloParameters::GenerateCartesianNormal() { } } -void InitializedMonteCarloParameters::CalcCircularNormalUniform(libra::Vector<2>& destination, double r_mean, double r_sigma, double theta_min, +void InitializedMonteCarloParameters::CalcCircularNormalUniform(math::Vector<2>& destination, double r_mean, double r_sigma, double theta_min, double theta_max) { // r follows normal distribution, and θ follows uniform distribution in Circular frame double r = InitializedMonteCarloParameters::Generate1dNormal(r_mean, r_sigma); @@ -134,7 +136,7 @@ void InitializedMonteCarloParameters::GenerateCircularNormalUniform() { if (mean_or_min_.size() < dim || sigma_or_max_.size() < dim) { throw "Config parameters dimension unmatched."; } - libra::Vector temp_vec; + math::Vector temp_vec; CalcCircularNormalUniform(temp_vec, mean_or_min_[0], sigma_or_max_[0], mean_or_min_[1], sigma_or_max_[1]); randomized_value_.clear(); @@ -143,7 +145,7 @@ void InitializedMonteCarloParameters::GenerateCircularNormalUniform() { } } -void InitializedMonteCarloParameters::CalcCircularNormalNormal(libra::Vector<2>& destination, double r_mean, double r_sigma, double theta_mean, +void InitializedMonteCarloParameters::CalcCircularNormalNormal(math::Vector<2>& destination, double r_mean, double r_sigma, double theta_mean, double theta_sigma) { // r and θ follow normal distribution in Circular frame double r = InitializedMonteCarloParameters::Generate1dNormal(r_mean, r_sigma); @@ -157,7 +159,7 @@ void InitializedMonteCarloParameters::GenerateCircularNormalNormal() { if (mean_or_min_.size() < dim || sigma_or_max_.size() < dim) { throw "Config parameters dimension unmatched."; } - libra::Vector temp_vec; + math::Vector temp_vec; CalcCircularNormalNormal(temp_vec, mean_or_min_[0], sigma_or_max_[0], mean_or_min_[1], sigma_or_max_[1]); randomized_value_.clear(); @@ -166,8 +168,8 @@ void InitializedMonteCarloParameters::GenerateCircularNormalNormal() { } } -void InitializedMonteCarloParameters::CalcSphericalNormalUniformUniform(libra::Vector<3>& destination, double r_mean, double r_sigma, - double theta_min, double theta_max, double phi_min, double phi_max) { +void InitializedMonteCarloParameters::CalcSphericalNormalUniformUniform(math::Vector<3>& destination, double r_mean, double r_sigma, double theta_min, + double theta_max, double phi_min, double phi_max) { // r follows normal distribution, and θ and φ follow uniform distribution in Spherical frame double r = InitializedMonteCarloParameters::Generate1dNormal(r_mean, r_sigma); double theta = acos(cos(theta_min) - (cos(theta_min) - cos(theta_max)) * InitializedMonteCarloParameters::Generate1dUniform(0.0, 1.0)); @@ -182,7 +184,7 @@ void InitializedMonteCarloParameters::GenerateSphericalNormalUniformUniform() { if (mean_or_min_.size() < dim || sigma_or_max_.size() < dim) { throw "Config parameters dimension unmatched."; } - libra::Vector temp_vec; + math::Vector temp_vec; CalcSphericalNormalUniformUniform(temp_vec, mean_or_min_[0], sigma_or_max_[0], mean_or_min_[1], sigma_or_max_[1], mean_or_min_[2], sigma_or_max_[2]); @@ -192,29 +194,29 @@ void InitializedMonteCarloParameters::GenerateSphericalNormalUniformUniform() { } } -void InitializedMonteCarloParameters::CalcSphericalNormalNormal(libra::Vector<3>& destination, const libra::Vector<3>& mean_vec) { +void InitializedMonteCarloParameters::CalcSphericalNormalNormal(math::Vector<3>& destination, const math::Vector<3>& mean_vec) { // r and θ follow normal distribution, and mean vector angle φ follows uniform distribution [0,2*pi] - libra::Vector<3> mean_vec_dir; + math::Vector<3> mean_vec_dir; mean_vec_dir = 1.0 / mean_vec.CalcNorm() * mean_vec; // Unit vector of mean vector direction - libra::Vector<3> x_axis(0.0), y_axis(0.0); + math::Vector<3> x_axis(0.0), y_axis(0.0); x_axis[0] = 1.0; y_axis[1] = 1.0; - libra::Vector<3> op_x = OuterProduct(mean_vec_dir, x_axis); - libra::Vector<3> op_y = OuterProduct(mean_vec_dir, y_axis); + math::Vector<3> op_x = OuterProduct(mean_vec_dir, x_axis); + math::Vector<3> op_y = OuterProduct(mean_vec_dir, y_axis); // An unit vector perpendicular with the mean vector // In case of the mean vector is parallel with X or Y axis, selecting the axis depend on the norm of outer product - libra::Vector<3> normal_unit_vec = op_x.CalcNorm() > op_y.CalcNorm() ? op_x = op_x.CalcNormalizedVector() : op_y = op_y.CalcNormalizedVector(); + math::Vector<3> normal_unit_vec = op_x.CalcNorm() > op_y.CalcNorm() ? op_x = op_x.CalcNormalizedVector() : op_y = op_y.CalcNormalizedVector(); - double rotation_angle_of_normal_unit_vec = InitializedMonteCarloParameters::Generate1dUniform(0.0, libra::tau); - libra::Quaternion rotation_of_normal_unit_vec(mean_vec_dir, - -rotation_angle_of_normal_unit_vec); // Use opposite sign to rotate the vector (not the frame) - libra::Vector<3> rotation_axis = rotation_of_normal_unit_vec.FrameConversion(normal_unit_vec); // Axis of mean vector rotation + double rotation_angle_of_normal_unit_vec = InitializedMonteCarloParameters::Generate1dUniform(0.0, math::tau); + math::Quaternion rotation_of_normal_unit_vec(mean_vec_dir, + -rotation_angle_of_normal_unit_vec); // Use opposite sign to rotate the vector (not the frame) + math::Vector<3> rotation_axis = rotation_of_normal_unit_vec.FrameConversion(normal_unit_vec); // Axis of mean vector rotation double rotation_angle_of_mean_vec = InitializedMonteCarloParameters::Generate1dNormal(0.0, sigma_or_max_[1]); - libra::Quaternion rotation_of_mean_vec(rotation_axis, -rotation_angle_of_mean_vec); // Use opposite sign to rotate the vector (not the frame) - libra::Vector<3> ret_vec = rotation_of_mean_vec.FrameConversion(mean_vec_dir); // Complete calculation of the direction + math::Quaternion rotation_of_mean_vec(rotation_axis, -rotation_angle_of_mean_vec); // Use opposite sign to rotate the vector (not the frame) + math::Vector<3> ret_vec = rotation_of_mean_vec.FrameConversion(mean_vec_dir); // Complete calculation of the direction ret_vec = InitializedMonteCarloParameters::Generate1dNormal(mean_vec.CalcNorm(), sigma_or_max_[0]) * ret_vec; // multiply norm @@ -228,7 +230,7 @@ void InitializedMonteCarloParameters::GenerateSphericalNormalNormal() { if (mean_or_min_.size() < dim || sigma_or_max_.size() < 2) { throw "Config parameters dimension unmatched."; } - libra::Vector temp_vec, temp_mean_vec; + math::Vector temp_vec, temp_mean_vec; for (int i = 0; i < dim; i++) { temp_mean_vec[i] = mean_or_min_[i]; } @@ -240,32 +242,32 @@ void InitializedMonteCarloParameters::GenerateSphericalNormalNormal() { } } -void InitializedMonteCarloParameters::CalcQuaternionUniform(libra::Quaternion& destination) { - // Perfectly Randomized libra::Quaternion - libra::Vector<3> x_axis(0.0); +void InitializedMonteCarloParameters::CalcQuaternionUniform(math::Quaternion& destination) { + // Perfectly Randomized math::Quaternion + math::Vector<3> x_axis(0.0); x_axis[0] = 1.0; // A direction vector converted from the X-axis by a quaternion may follows the uniform distribution in full sphere. - libra::Quaternion first_cnv; - libra::Vector<3> x_axis_cnvd; + math::Quaternion first_cnv; + math::Vector<3> x_axis_cnvd; double theta = acos(1 - (1 - (-1)) * InitializedMonteCarloParameters::Generate1dUniform(0.0, 1.0)); - double phi = InitializedMonteCarloParameters::Generate1dUniform(0, libra::tau); + double phi = InitializedMonteCarloParameters::Generate1dUniform(0, math::tau); x_axis_cnvd[0] = sin(theta) * cos(phi); x_axis_cnvd[1] = sin(theta) * sin(phi); x_axis_cnvd[2] = cos(theta); double cos_angle_between = InnerProduct(x_axis, x_axis_cnvd); - libra::Vector<3> op = OuterProduct(x_axis, x_axis_cnvd); + math::Vector<3> op = OuterProduct(x_axis, x_axis_cnvd); for (int i = 0; i < 3; i++) { first_cnv[i] = op[i]; } first_cnv[3] = cos_angle_between; // Generate randomized rotation angle around the X-axis - double rotation_angle = InitializedMonteCarloParameters::Generate1dUniform(0.0, libra::tau); - libra::Quaternion second_cnv(x_axis, rotation_angle); + double rotation_angle = InitializedMonteCarloParameters::Generate1dUniform(0.0, math::tau); + math::Quaternion second_cnv(x_axis, rotation_angle); - libra::Quaternion ret_q = first_cnv * second_cnv; + math::Quaternion ret_q = first_cnv * second_cnv; for (int i = 0; i < 4; i++) { destination[i] = ret_q[i]; @@ -274,7 +276,7 @@ void InitializedMonteCarloParameters::CalcQuaternionUniform(libra::Quaternion& d void InitializedMonteCarloParameters::GenerateQuaternionUniform() { const static int dim = 4; - libra::Quaternion temp_q; + math::Quaternion temp_q; CalcQuaternionUniform(temp_q); randomized_value_.clear(); @@ -283,19 +285,19 @@ void InitializedMonteCarloParameters::GenerateQuaternionUniform() { } } -void InitializedMonteCarloParameters::CalcQuaternionNormal(libra::Quaternion& destination, double theta_sigma) { +void InitializedMonteCarloParameters::CalcQuaternionNormal(math::Quaternion& destination, double theta_sigma) { // Angle from the default quaternion θ follows normal distribution // The rotation axis follows uniform distribution on full sphere - libra::Vector<3> rot_axis; + math::Vector<3> rot_axis; double theta = acos(1 - (1 - (-1)) * InitializedMonteCarloParameters::Generate1dUniform(0.0, 1.0)); - double phi = InitializedMonteCarloParameters::Generate1dUniform(0, libra::tau); + double phi = InitializedMonteCarloParameters::Generate1dUniform(0, math::tau); rot_axis[0] = sin(theta) * cos(phi); rot_axis[1] = sin(theta) * sin(phi); rot_axis[2] = cos(theta); double rotation_angle = InitializedMonteCarloParameters::Generate1dNormal(0.0, theta_sigma); - libra::Quaternion ret_q(rot_axis, rotation_angle); + math::Quaternion ret_q(rot_axis, rotation_angle); for (int i = 0; i < 4; i++) { destination[i] = ret_q[i]; } @@ -307,7 +309,7 @@ void InitializedMonteCarloParameters::GenerateQuaternionNormal() { if (sigma_or_max_.size() < 1) { throw "Config parameters dimension unmatched."; } - libra::Quaternion temp_q; + math::Quaternion temp_q; CalcQuaternionNormal(temp_q, sigma_or_max_[0]); randomized_value_.clear(); @@ -315,3 +317,5 @@ void InitializedMonteCarloParameters::GenerateQuaternionNormal() { randomized_value_.push_back(temp_q[i]); } } + +} // namespace s2e::simulation diff --git a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.hpp b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.hpp index 193a5f6a2..e4bc3469f 100644 --- a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.hpp +++ b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_parameters.hpp @@ -7,12 +7,14 @@ #define S2E_SIMULATION_MONTE_CARLO_SIMULATION_INITIALIZE_MONTE_CARLO_PARAMETERS_HPP_ #include -#include -#include +#include +#include #include #include #include +namespace s2e::simulation { + /** * @class InitializedMonteCarloParameters * @brief Initialized parameters for Monte-Carlo simulation @@ -31,7 +33,7 @@ class InitializedMonteCarloParameters { kCircularNormalNormal, //!< r and θ follow normal distribution in Circular frame kSphericalNormalUniformUniform, //!< r follows normal distribution, and θ and φ follow uniform distribution in Spherical frame kSphericalNormalNormal, //!< r and θ follow normal distribution, and mean vector angle φ follows uniform distribution [0,2*pi] - kQuaternionUniform, //!< Perfectly Randomized libra::Quaternion + kQuaternionUniform, //!< Perfectly Randomized Quaternion kQuaternionNormal, //!< Angle from the default quaternion θ follows normal distribution }; @@ -52,7 +54,7 @@ class InitializedMonteCarloParameters { * @brief Set randomization parameters */ template - void SetRandomConfiguration(const libra::Vector& mean_or_min, const libra::Vector& sigma_or_max, + void SetRandomConfiguration(const math::Vector& mean_or_min, const math::Vector& sigma_or_max, RandomizationType random_type); // Getter @@ -61,12 +63,12 @@ class InitializedMonteCarloParameters { * @brief Get randomized vector value results */ template - void GetRandomizedVector(libra::Vector& destination) const; + void GetRandomizedVector(math::Vector& destination) const; /** * @fn GetRandomizedQuaternion * @brief Get randomized quaternion results */ - void GetRandomizedQuaternion(libra::Quaternion& destination) const; + void GetRandomizedQuaternion(math::Quaternion& destination) const; /** * @fn GetRandomizedScalar * @brief Get randomized value results @@ -175,38 +177,38 @@ class InitializedMonteCarloParameters { * @fn CalcCircularNormalUniform * @brief Calculate randomized value with CircularNormalUniform mode */ - void CalcCircularNormalUniform(libra::Vector<2>& destination, double r_mean, double r_sigma, double theta_min, double theta_max); + void CalcCircularNormalUniform(math::Vector<2>& destination, double r_mean, double r_sigma, double theta_min, double theta_max); /** * @fn CalcCircularNormalNormal * @brief Calculate randomized value with CircularNormalNormal mode */ - void CalcCircularNormalNormal(libra::Vector<2>& destination, double r_mean, double r_sigma, double theta_mean, double theta_sigma); + void CalcCircularNormalNormal(math::Vector<2>& destination, double r_mean, double r_sigma, double theta_mean, double theta_sigma); /** * @fn CalcSphericalNormalUniformUniform * @brief Calculate randomized value with SphericalNormalUniformUniform mode */ - void CalcSphericalNormalUniformUniform(libra::Vector<3>& destination, double r_mean, double r_sigma, double theta_min, double theta_max, + void CalcSphericalNormalUniformUniform(math::Vector<3>& destination, double r_mean, double r_sigma, double theta_min, double theta_max, double phi_min, double phi_max); /** * @fn CalcSphericalNormalNormal * @brief Calculate randomized value with SphericalNormalNormal mode */ - void CalcSphericalNormalNormal(libra::Vector<3>& destination, const libra::Vector<3>& mean_vec); + void CalcSphericalNormalNormal(math::Vector<3>& destination, const math::Vector<3>& mean_vec); /** * @fn CalcQuaternionUniform * @brief Calculate randomized value with QuaternionUniform mode */ - void CalcQuaternionUniform(libra::Quaternion& destination); + void CalcQuaternionUniform(math::Quaternion& destination); /** * @fn CalcQuaternionNormal * @brief Calculate randomized value with QuaternionNormal mode */ - void CalcQuaternionNormal(libra::Quaternion& destination, double theta_sigma); + void CalcQuaternionNormal(math::Quaternion& destination, double theta_sigma); }; template -void InitializedMonteCarloParameters::SetRandomConfiguration(const libra::Vector& mean_or_min, - const libra::Vector& sigma_or_max, +void InitializedMonteCarloParameters::SetRandomConfiguration(const math::Vector& mean_or_min, + const math::Vector& sigma_or_max, InitializedMonteCarloParameters::RandomizationType random_type) { randomization_type_ = random_type; mean_or_min_.clear(); @@ -220,7 +222,7 @@ void InitializedMonteCarloParameters::SetRandomConfiguration(const libra::Vector } template -void InitializedMonteCarloParameters::GetRandomizedVector(libra::Vector& destination) const { +void InitializedMonteCarloParameters::GetRandomizedVector(math::Vector& destination) const { if (randomization_type_ == kNoRandomization) { ; } else if (NumElement > randomized_value_.size()) { @@ -232,4 +234,6 @@ void InitializedMonteCarloParameters::GetRandomizedVector(libra::Vector -#include +#include + +namespace s2e::simulation { #define MAX_CHAR_NUM 256 MonteCarloSimulationExecutor* InitMonteCarloSimulation(std::string file_name) { - IniAccess ini_file(file_name); + setting_file_reader::IniAccess ini_file(file_name); const char* section = "MONTE_CARLO_EXECUTION"; unsigned long long total_num_of_executions = ini_file.ReadInt(section, "number_of_executions"); @@ -79,12 +81,12 @@ MonteCarloSimulationExecutor* InitMonteCarloSimulation(std::string file_name) { // Read mean_or_min vector key_name = so_dot_ip_str + MonteCarloSimulationExecutor::separator_ + "mean_or_min"; - libra::Vector<3> mean_or_min; + math::Vector<3> mean_or_min; ini_file.ReadVector(section, key_name.c_str(), mean_or_min); // Read sigma_or_max vector key_name = so_dot_ip_str + MonteCarloSimulationExecutor::separator_ + "sigma_or_max"; - libra::Vector<3> sigma_or_max; + math::Vector<3> sigma_or_max; ini_file.ReadVector(section, key_name.c_str(), sigma_or_max); // Write randomize setting @@ -93,3 +95,5 @@ MonteCarloSimulationExecutor* InitMonteCarloSimulation(std::string file_name) { return monte_carlo_simulator; } + +} // namespace s2e::simulation diff --git a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_simulation.hpp b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_simulation.hpp index e4dcd60a2..6620467ac 100644 --- a/src/simulation/monte_carlo_simulation/initialize_monte_carlo_simulation.hpp +++ b/src/simulation/monte_carlo_simulation/initialize_monte_carlo_simulation.hpp @@ -9,10 +9,14 @@ #include "initialize_monte_carlo_parameters.hpp" #include "monte_carlo_simulation_executor.hpp" +namespace s2e::simulation { + /** * @fn InitMonteCarloSimulation * @brief Initialize function for Monte-Carlo Simulator */ MonteCarloSimulationExecutor* InitMonteCarloSimulation(std::string file_name); +} // namespace s2e::simulation + #endif // S2E_SIMULATION_MONTE_CARLO_SIMULATION_INITIALIZE_MONTE_CARLO_SIMULATION_HPP_ diff --git a/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.cpp b/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.cpp index bb736a203..6279a3b08 100644 --- a/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.cpp +++ b/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.cpp @@ -7,6 +7,8 @@ using std::string; +namespace s2e::simulation { + MonteCarloSimulationExecutor::MonteCarloSimulationExecutor(unsigned long long total_num_of_executions) : total_number_of_executions_(total_num_of_executions) { number_of_executions_done_ = 0; @@ -47,7 +49,7 @@ void MonteCarloSimulationExecutor::GetInitializedMonteCarloParameterDouble(strin } void MonteCarloSimulationExecutor::GetInitializedMonteCarloParameterQuaternion(string so_name, string init_monte_carlo_parameter_name, - libra::Quaternion& destination) const { + math::Quaternion& destination) const { if (!enabled_) return; { string name = so_name + MonteCarloSimulationExecutor::separator_ + init_monte_carlo_parameter_name; @@ -69,3 +71,5 @@ void MonteCarloSimulationExecutor::RandomizeAllParameters() { void MonteCarloSimulationExecutor::SetSeed(unsigned long seed, bool is_deterministic) { InitializedMonteCarloParameters::SetSeed(seed, is_deterministic); } + +} // namespace s2e::simulation diff --git a/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.hpp b/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.hpp index 83dfcf618..729a11d8e 100644 --- a/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.hpp +++ b/src/simulation/monte_carlo_simulation/monte_carlo_simulation_executor.hpp @@ -6,12 +6,14 @@ #ifndef S2E_SIMULATION_MONTE_CARLO_SIMULATION_MONTE_CARLO_SIMULATION_EXECUTOR_HPP_ #define S2E_SIMULATION_MONTE_CARLO_SIMULATION_MONTE_CARLO_SIMULATION_EXECUTOR_HPP_ -#include #include +#include #include // #include "simulation_object.hpp" #include "initialize_monte_carlo_parameters.hpp" +namespace s2e::simulation { + /** * @class MonteCarloSimulationExecutor * @brief Monte-Carlo Simulation Executor class @@ -86,7 +88,7 @@ class MonteCarloSimulationExecutor { */ template void GetInitializedMonteCarloParameterVector(std::string so_name, std::string init_monte_carlo_parameter_name, - libra::Vector& destination) const; + math::Vector& destination) const; /** * @fn GetInitializedMonteCarloParameterDouble * @brief Get randomized value and store it in dest @@ -97,7 +99,7 @@ class MonteCarloSimulationExecutor { * @brief Get randomized quaternion and store it in dest_quat */ void GetInitializedMonteCarloParameterQuaternion(std::string so_name, std::string init_monte_carlo_parameter_name, - libra::Quaternion& destination) const; + math::Quaternion& destination) const; // Calculation /** @@ -126,7 +128,7 @@ class MonteCarloSimulationExecutor { * @brief Add initialized parameter */ void AddInitializedMonteCarloParameter(std::string so_name, std::string init_monte_carlo_parameter_name, - const libra::Vector& mean_or_min, const libra::Vector& sigma_or_max, + const math::Vector& mean_or_min, const math::Vector& sigma_or_max, InitializedMonteCarloParameters::RandomizationType random_type); /** @@ -138,7 +140,7 @@ class MonteCarloSimulationExecutor { template void MonteCarloSimulationExecutor::GetInitializedMonteCarloParameterVector(std::string so_name, std::string init_monte_carlo_parameter_name, - libra::Vector& destination) const { + math::Vector& destination) const { if (!enabled_) return; std::string name = so_name + MonteCarloSimulationExecutor::separator_ + init_monte_carlo_parameter_name; if (init_parameter_list_.find(name) == init_parameter_list_.end()) { @@ -151,8 +153,8 @@ void MonteCarloSimulationExecutor::GetInitializedMonteCarloParameterVector(std:: template void MonteCarloSimulationExecutor::AddInitializedMonteCarloParameter(std::string so_name, std::string init_monte_carlo_parameter_name, - const libra::Vector& mean_or_min, - const libra::Vector& sigma_or_max, + const math::Vector& mean_or_min, + const math::Vector& sigma_or_max, InitializedMonteCarloParameters::RandomizationType random_type) { std::string name = so_name + MonteCarloSimulationExecutor::separator_ + init_monte_carlo_parameter_name; if (init_parameter_list_.find(name) == init_parameter_list_.end()) { @@ -166,4 +168,6 @@ void MonteCarloSimulationExecutor::AddInitializedMonteCarloParameter(std::string } } +} // namespace s2e::simulation + #endif // S2E_SIMULATION_MONTE_CARLO_SIMULATION_MONTE_CARLO_SIMULATION_EXECUTOR_HPP_ diff --git a/src/simulation/monte_carlo_simulation/simulation_object.cpp b/src/simulation/monte_carlo_simulation/simulation_object.cpp index eb0273eaa..2561ee68f 100644 --- a/src/simulation/monte_carlo_simulation/simulation_object.cpp +++ b/src/simulation/monte_carlo_simulation/simulation_object.cpp @@ -5,6 +5,8 @@ #include "simulation_object.hpp" +namespace s2e::simulation { + std::map SimulationObject::object_list_; SimulationObject::SimulationObject(std::string name) : name_(name) { @@ -38,7 +40,8 @@ void SimulationObject::GetInitializedMonteCarloParameterDouble(const MonteCarloS } void SimulationObject::GetInitializedMonteCarloParameterQuaternion(const MonteCarloSimulationExecutor& monte_carlo_simulator, - std::string init_monte_carlo_parameter_name, - libra::Quaternion& destination) const { + std::string init_monte_carlo_parameter_name, math::Quaternion& destination) const { monte_carlo_simulator.GetInitializedMonteCarloParameterQuaternion(name_, init_monte_carlo_parameter_name, destination); } + +} // namespace s2e::simulation diff --git a/src/simulation/monte_carlo_simulation/simulation_object.hpp b/src/simulation/monte_carlo_simulation/simulation_object.hpp index 9d46d482d..6855011f3 100644 --- a/src/simulation/monte_carlo_simulation/simulation_object.hpp +++ b/src/simulation/monte_carlo_simulation/simulation_object.hpp @@ -7,15 +7,17 @@ #define S2E_SIMULATION_MONTE_CARLO_SIMULATION_SIMULATION_OBJECT_HPP_ #include -#include -#include #include +#include +#include #include #include #include "initialize_monte_carlo_parameters.hpp" #include "monte_carlo_simulation_executor.hpp" +namespace s2e::simulation { + /** * @class SimulationObject * @brief Class to manage randomization of variables for Monte-Carlo simulation @@ -40,7 +42,7 @@ class SimulationObject { */ template void GetInitializedMonteCarloParameterVector(const MonteCarloSimulationExecutor& monte_carlo_simulator, std::string init_monte_carlo_parameter_name, - libra::Vector& destination) const; + math::Vector& destination) const; /** * @fn GetInitializedMonteCarloParameterDouble @@ -54,7 +56,7 @@ class SimulationObject { * @brief Get randomized quaternion and store it in destination */ void GetInitializedMonteCarloParameterQuaternion(const MonteCarloSimulationExecutor& monte_carlo_simulator, - std::string init_monte_carlo_parameter_name, libra::Quaternion& destination) const; + std::string init_monte_carlo_parameter_name, math::Quaternion& destination) const; /** * @fn SetParameters @@ -80,8 +82,10 @@ class SimulationObject { template void SimulationObject::GetInitializedMonteCarloParameterVector(const MonteCarloSimulationExecutor& monte_carlo_simulator, std::string init_monte_carlo_parameter_name, - libra::Vector& destination) const { + math::Vector& destination) const { monte_carlo_simulator.GetInitializedMonteCarloParameterVector(name_, init_monte_carlo_parameter_name, destination); } +} // namespace s2e::simulation + #endif // S2E_SIMULATION_MONTE_CARLO_SIMULATION_SIMULATION_OBJECT_HPP_ diff --git a/src/simulation/multiple_spacecraft/inter_spacecraft_communication.cpp b/src/simulation/multiple_spacecraft/inter_spacecraft_communication.cpp index 6e4678aee..90a1443e3 100644 --- a/src/simulation/multiple_spacecraft/inter_spacecraft_communication.cpp +++ b/src/simulation/multiple_spacecraft/inter_spacecraft_communication.cpp @@ -5,10 +5,14 @@ #include "inter_spacecraft_communication.hpp" -#include +#include + +namespace s2e::simulation { InterSpacecraftCommunication::InterSpacecraftCommunication(const SimulationConfiguration* simulation_configuration) { UNUSED(simulation_configuration); } InterSpacecraftCommunication::~InterSpacecraftCommunication() {} + +} // namespace s2e::simulation diff --git a/src/simulation/multiple_spacecraft/inter_spacecraft_communication.hpp b/src/simulation/multiple_spacecraft/inter_spacecraft_communication.hpp index 11b32008e..bd3940f81 100644 --- a/src/simulation/multiple_spacecraft/inter_spacecraft_communication.hpp +++ b/src/simulation/multiple_spacecraft/inter_spacecraft_communication.hpp @@ -8,6 +8,8 @@ #include "../simulation_configuration.hpp" +namespace s2e::simulation { + /** * @class InterSpacecraftCommunication * @brief Base class of inter satellite communication @@ -28,4 +30,6 @@ class InterSpacecraftCommunication { private: }; +} // namespace s2e::simulation + #endif // S2E_SIMULATION_MULTIPLE_SPACECRAFT_INTER_SPACECRAFT_COMMUNICATION_HPP_ diff --git a/src/simulation/multiple_spacecraft/relative_information.cpp b/src/simulation/multiple_spacecraft/relative_information.cpp index 57f36d9c1..3aed97e77 100644 --- a/src/simulation/multiple_spacecraft/relative_information.cpp +++ b/src/simulation/multiple_spacecraft/relative_information.cpp @@ -5,6 +5,8 @@ #include "relative_information.hpp" +namespace s2e::simulation { + RelativeInformation::RelativeInformation() {} RelativeInformation::~RelativeInformation() {} @@ -13,8 +15,8 @@ void RelativeInformation::Update() { for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < dynamics_database_.size(); reference_spacecraft_id++) { // Position - libra::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); relative_position_list_i_m_[target_spacecraft_id][reference_spacecraft_id] = target_sat_pos_i - reference_sat_pos_i; relative_position_list_rtn_m_[target_spacecraft_id][reference_spacecraft_id] = CalcRelativePosition_rtn_m(target_spacecraft_id, reference_spacecraft_id); @@ -24,8 +26,8 @@ void RelativeInformation::Update() { relative_position_list_i_m_[target_spacecraft_id][reference_spacecraft_id].CalcNorm(); // Velocity - libra::Vector<3> target_sat_vel_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); - libra::Vector<3> reference_sat_vel_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); + math::Vector<3> target_sat_vel_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); + math::Vector<3> reference_sat_vel_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); relative_velocity_list_i_m_s_[target_spacecraft_id][reference_spacecraft_id] = target_sat_vel_i - reference_sat_vel_i; relative_velocity_list_rtn_m_s_[target_spacecraft_id][reference_spacecraft_id] = CalcRelativeVelocity_rtn_m_s(target_spacecraft_id, reference_spacecraft_id); @@ -37,7 +39,7 @@ void RelativeInformation::Update() { } } -void RelativeInformation::RegisterDynamicsInfo(const size_t spacecraft_id, const Dynamics* dynamics) { +void RelativeInformation::RegisterDynamicsInfo(const size_t spacecraft_id, const dynamics::Dynamics* dynamics) { dynamics_database_.emplace(spacecraft_id, dynamics); ResizeLists(); } @@ -51,28 +53,28 @@ std::string RelativeInformation::GetLogHeader() const { std::string str_tmp = ""; for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector( + str_tmp += logger::WriteVector( "satellite" + std::to_string(target_spacecraft_id) + "_position_from_satellite" + std::to_string(reference_spacecraft_id), "i", "m", 3); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector( + str_tmp += logger::WriteVector( "satellite" + std::to_string(target_spacecraft_id) + "_velocity_from_satellite" + std::to_string(reference_spacecraft_id), "i", "m/s", 3); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector( + str_tmp += logger::WriteVector( "satellite" + std::to_string(target_spacecraft_id) + "_position_from_satellite" + std::to_string(reference_spacecraft_id), "rtn", "m", 3); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector( + str_tmp += logger::WriteVector( "satellite" + std::to_string(target_spacecraft_id) + "_velocity_from_satellite" + std::to_string(reference_spacecraft_id), "rtn", "m/s", 3); } } @@ -84,82 +86,84 @@ std::string RelativeInformation::GetLogValue() const { std::string str_tmp = ""; for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector(GetRelativePosition_i_m(target_spacecraft_id, reference_spacecraft_id)); + str_tmp += logger::WriteVector(GetRelativePosition_i_m(target_spacecraft_id, reference_spacecraft_id)); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector(GetRelativeVelocity_i_m_s(target_spacecraft_id, reference_spacecraft_id)); + str_tmp += logger::WriteVector(GetRelativeVelocity_i_m_s(target_spacecraft_id, reference_spacecraft_id)); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector(GetRelativePosition_rtn_m(target_spacecraft_id, reference_spacecraft_id)); + str_tmp += logger::WriteVector(GetRelativePosition_rtn_m(target_spacecraft_id, reference_spacecraft_id)); } } for (size_t target_spacecraft_id = 0; target_spacecraft_id < dynamics_database_.size(); target_spacecraft_id++) { for (size_t reference_spacecraft_id = 0; reference_spacecraft_id < target_spacecraft_id; reference_spacecraft_id++) { - str_tmp += WriteVector(GetRelativeVelocity_rtn_m_s(target_spacecraft_id, reference_spacecraft_id)); + str_tmp += logger::WriteVector(GetRelativeVelocity_rtn_m_s(target_spacecraft_id, reference_spacecraft_id)); } } return str_tmp; } -void RelativeInformation::LogSetup(Logger& logger) { logger.AddLogList(this); } +void RelativeInformation::LogSetup(logger::Logger& logger) { logger.AddLogList(this); } -libra::Quaternion RelativeInformation::CalcRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { +math::Quaternion RelativeInformation::CalcRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { // Observer SC Body frame(obs_sat) -> ECI frame(i) - libra::Quaternion q_reference_i2b = dynamics_database_.at(reference_spacecraft_id)->GetAttitude().GetQuaternion_i2b(); - libra::Quaternion q_reference_b2i = q_reference_i2b.Conjugate(); + math::Quaternion q_reference_i2b = dynamics_database_.at(reference_spacecraft_id)->GetAttitude().GetQuaternion_i2b(); + math::Quaternion q_reference_b2i = q_reference_i2b.Conjugate(); // ECI frame(i) -> Target SC body frame(main_sat) - libra::Quaternion q_target_i2b = dynamics_database_.at(target_spacecraft_id)->GetAttitude().GetQuaternion_i2b(); + math::Quaternion q_target_i2b = dynamics_database_.at(target_spacecraft_id)->GetAttitude().GetQuaternion_i2b(); return q_target_i2b * q_reference_b2i; } -libra::Vector<3> RelativeInformation::CalcRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { - libra::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> relative_pos_i = target_sat_pos_i - reference_sat_pos_i; +math::Vector<3> RelativeInformation::CalcRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { + math::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> relative_pos_i = target_sat_pos_i - reference_sat_pos_i; // RTN frame for the reference satellite - libra::Quaternion q_i2rtn = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().CalcQuaternion_i2lvlh(); + math::Quaternion q_i2rtn = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().CalcQuaternion_i2lvlh(); - libra::Vector<3> relative_pos_rtn = q_i2rtn.FrameConversion(relative_pos_i); + math::Vector<3> relative_pos_rtn = q_i2rtn.FrameConversion(relative_pos_i); return relative_pos_rtn; } -libra::Vector<3> RelativeInformation::CalcRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { - libra::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); - libra::Vector<3> relative_pos_i = target_sat_pos_i - reference_sat_pos_i; +math::Vector<3> RelativeInformation::CalcRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) { + math::Vector<3> target_sat_pos_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> reference_sat_pos_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetPosition_i_m(); + math::Vector<3> relative_pos_i = target_sat_pos_i - reference_sat_pos_i; // RTN frame for the reference satellite - libra::Quaternion q_i2rtn = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().CalcQuaternion_i2lvlh(); + math::Quaternion q_i2rtn = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().CalcQuaternion_i2lvlh(); // Rotation vector of RTN frame - libra::Vector<3> reference_sat_vel_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); - libra::Vector<3> target_sat_vel_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); - libra::Vector<3> rot_vec_rtn_i = cross(reference_sat_pos_i, reference_sat_vel_i); + math::Vector<3> reference_sat_vel_i = dynamics_database_.at(reference_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); + math::Vector<3> target_sat_vel_i = dynamics_database_.at(target_spacecraft_id)->GetOrbit().GetVelocity_i_m_s(); + math::Vector<3> rot_vec_rtn_i = cross(reference_sat_pos_i, reference_sat_vel_i); double r2_ref = reference_sat_pos_i.CalcNorm() * reference_sat_pos_i.CalcNorm(); rot_vec_rtn_i /= r2_ref; - libra::Vector<3> relative_vel_i = target_sat_vel_i - reference_sat_vel_i - cross(rot_vec_rtn_i, relative_pos_i); + math::Vector<3> relative_vel_i = target_sat_vel_i - reference_sat_vel_i - cross(rot_vec_rtn_i, relative_pos_i); - libra::Vector<3> relative_vel_rtn = q_i2rtn.FrameConversion(relative_vel_i); + math::Vector<3> relative_vel_rtn = q_i2rtn.FrameConversion(relative_vel_i); return relative_vel_rtn; } void RelativeInformation::ResizeLists() { size_t size = dynamics_database_.size(); - relative_position_list_i_m_.assign(size, std::vector>(size, libra::Vector<3>(0))); - relative_velocity_list_i_m_s_.assign(size, std::vector>(size, libra::Vector<3>(0))); + relative_position_list_i_m_.assign(size, std::vector>(size, math::Vector<3>(0))); + relative_velocity_list_i_m_s_.assign(size, std::vector>(size, math::Vector<3>(0))); relative_distance_list_m_.assign(size, std::vector(size, 0.0)); - relative_position_list_rtn_m_.assign(size, std::vector>(size, libra::Vector<3>(0))); - relative_velocity_list_rtn_m_s_.assign(size, std::vector>(size, libra::Vector<3>(0))); - relative_attitude_quaternion_list_.assign(size, std::vector(size, libra::Quaternion(0, 0, 0, 1))); + relative_position_list_rtn_m_.assign(size, std::vector>(size, math::Vector<3>(0))); + relative_velocity_list_rtn_m_s_.assign(size, std::vector>(size, math::Vector<3>(0))); + relative_attitude_quaternion_list_.assign(size, std::vector(size, math::Quaternion(0, 0, 0, 1))); } + +} // namespace s2e::simulation diff --git a/src/simulation/multiple_spacecraft/relative_information.hpp b/src/simulation/multiple_spacecraft/relative_information.hpp index 428f426f9..d49f4c74a 100644 --- a/src/simulation/multiple_spacecraft/relative_information.hpp +++ b/src/simulation/multiple_spacecraft/relative_information.hpp @@ -6,17 +6,24 @@ #ifndef S2E_MULTIPLE_SPACECRAFT_RELATIVE_INFORMATION_HPP_ #define S2E_MULTIPLE_SPACECRAFT_RELATIVE_INFORMATION_HPP_ +#include #include #include "../../dynamics/dynamics.hpp" -#include "../../library/logger/loggable.hpp" -#include "../../library/logger/logger.hpp" +#include "../../logger/loggable.hpp" +#include "../../logger/logger.hpp" + +namespace s2e::dynamics { +class Dynamics; +} + +namespace s2e::simulation { /** * @class RelativeInformation * @brief Base class to manage relative information between spacecraft */ -class RelativeInformation : public ILoggable { +class RelativeInformation : public logger::ILoggable { public: /** * @fn RelativeInformation @@ -40,7 +47,7 @@ class RelativeInformation : public ILoggable { * @param [in] spacecraft_id: ID of target spacecraft * @param [in] dynamics: Dynamics information of the target spacecraft */ - void RegisterDynamicsInfo(const size_t spacecraft_id, const Dynamics* dynamics); + void RegisterDynamicsInfo(const size_t spacecraft_id, const dynamics::Dynamics* dynamics); /** * @fn RegisterDynamicsInfo * @brief Remove dynamics information of target spacecraft @@ -64,7 +71,7 @@ class RelativeInformation : public ILoggable { * @fn LogSetup * @brief Logging setup for relative information */ - void LogSetup(Logger& logger); + void LogSetup(logger::Logger& logger); // Getter /** @@ -73,7 +80,7 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of target spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - inline libra::Quaternion GetRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { + inline math::Quaternion GetRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { return relative_attitude_quaternion_list_[target_spacecraft_id][reference_spacecraft_id]; } /** @@ -82,7 +89,7 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of target spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - inline libra::Vector<3> GetRelativePosition_i_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { + inline math::Vector<3> GetRelativePosition_i_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { return relative_position_list_i_m_[target_spacecraft_id][reference_spacecraft_id]; } /** @@ -91,7 +98,7 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of target spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - inline libra::Vector<3> GetRelativeVelocity_i_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { + inline math::Vector<3> GetRelativeVelocity_i_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { return relative_velocity_list_i_m_s_[target_spacecraft_id][reference_spacecraft_id]; } /** @@ -109,7 +116,7 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of target spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - inline libra::Vector<3> GetRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { + inline math::Vector<3> GetRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { return relative_position_list_rtn_m_[target_spacecraft_id][reference_spacecraft_id]; } /** @@ -118,7 +125,7 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of target spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - inline libra::Vector<3> GetRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { + inline math::Vector<3> GetRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id) const { return relative_velocity_list_rtn_m_s_[target_spacecraft_id][reference_spacecraft_id]; } @@ -127,19 +134,19 @@ class RelativeInformation : public ILoggable { * @brief Return the dynamics information of a spacecraft * @param [in] target_spacecraft_id: ID of the spacecraft */ - inline const Dynamics* GetReferenceSatDynamics(const size_t reference_spacecraft_id) const { + inline const dynamics::Dynamics* GetReferenceSatDynamics(const size_t reference_spacecraft_id) const { return dynamics_database_.at(reference_spacecraft_id); }; private: - std::map dynamics_database_; //!< Dynamics database of all spacecraft + std::map dynamics_database_; //!< Dynamics database of all spacecraft - std::vector>> relative_position_list_i_m_; //!< Relative position list in the inertial frame in unit [m] - std::vector>> relative_velocity_list_i_m_s_; //!< Relative velocity list in the inertial frame in unit [m/s] - std::vector>> relative_position_list_rtn_m_; //!< Relative position list in the RTN frame in unit [m] - std::vector>> relative_velocity_list_rtn_m_s_; //!< Relative velocity list in the RTN frame in unit [m/s] - std::vector> relative_distance_list_m_; //!< Relative distance list in unit [m] - std::vector> relative_attitude_quaternion_list_; //!< Relative attitude quaternion list + std::vector>> relative_position_list_i_m_; //!< Relative position list in the inertial frame in unit [m] + std::vector>> relative_velocity_list_i_m_s_; //!< Relative velocity list in the inertial frame in unit [m/s] + std::vector>> relative_position_list_rtn_m_; //!< Relative position list in the RTN frame in unit [m] + std::vector>> relative_velocity_list_rtn_m_s_; //!< Relative velocity list in the RTN frame in unit [m/s] + std::vector> relative_distance_list_m_; //!< Relative distance list in unit [m] + std::vector> relative_attitude_quaternion_list_; //!< Relative attitude quaternion list /** * @fn CalcRelativeAttitudeQuaternion @@ -147,21 +154,21 @@ class RelativeInformation : public ILoggable { * @param [in] target_spacecraft_id: ID of the spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - libra::Quaternion CalcRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); + math::Quaternion CalcRelativeAttitudeQuaternion(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); /** * @fn CalcRelativePosition_rtn_m * @brief Calculate and return the relative position in RTN frame * @param [in] target_spacecraft_id: ID of the spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - libra::Vector<3> CalcRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); + math::Vector<3> CalcRelativePosition_rtn_m(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); /** * @fn CalcRelativeVelocity_rtn_m_s * @brief Calculate and return the relative velocity in RTN frame * @param [in] target_spacecraft_id: ID of the spacecraft * @param [in] reference_spacecraft_id: ID of reference spacecraft */ - libra::Vector<3> CalcRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); + math::Vector<3> CalcRelativeVelocity_rtn_m_s(const size_t target_spacecraft_id, const size_t reference_spacecraft_id); /** * @fn ResizeLists @@ -170,4 +177,6 @@ class RelativeInformation : public ILoggable { void ResizeLists(); }; +} // namespace s2e::simulation + #endif // S2E_MULTIPLE_SPACECRAFT_RELATIVE_INFORMATION_HPP_ diff --git a/src/simulation/simulation_configuration.hpp b/src/simulation/simulation_configuration.hpp index 25bde1245..e3adeb87d 100644 --- a/src/simulation/simulation_configuration.hpp +++ b/src/simulation/simulation_configuration.hpp @@ -9,7 +9,9 @@ #include #include -#include "../library/logger/logger.hpp" +#include "../logger/logger.hpp" + +namespace s2e::simulation { /** * @struct SimulationConfiguration @@ -17,7 +19,7 @@ */ struct SimulationConfiguration { std::string initialize_base_file_name_; //!< Base file name for initialization - Logger* main_logger_; //!< Main logger + logger::Logger* main_logger_; //!< Main logger unsigned int number_of_simulated_spacecraft_; //!< Number of simulated spacecraft std::vector spacecraft_file_list_; //!< File name list for spacecraft initialization @@ -35,4 +37,6 @@ struct SimulationConfiguration { ~SimulationConfiguration() { delete main_logger_; } }; +} // namespace s2e::simulation + #endif // S2E_SIMULATION_SIMULATION_CONFIGURATION_HPP_ diff --git a/src/simulation/spacecraft/installed_components.cpp b/src/simulation/spacecraft/installed_components.cpp index 015b606ac..c6a482fce 100644 --- a/src/simulation/spacecraft/installed_components.cpp +++ b/src/simulation/spacecraft/installed_components.cpp @@ -5,16 +5,20 @@ #include "installed_components.hpp" -#include +#include -libra::Vector<3> InstalledComponents::GenerateForce_b_N() { - libra::Vector<3> force_b_N_(0.0); +namespace s2e::spacecraft { + +math::Vector<3> InstalledComponents::GenerateForce_b_N() { + math::Vector<3> force_b_N_(0.0); return force_b_N_; } -libra::Vector<3> InstalledComponents::GenerateTorque_b_Nm() { - libra::Vector<3> torque_b_Nm_(0.0); +math::Vector<3> InstalledComponents::GenerateTorque_b_Nm() { + math::Vector<3> torque_b_Nm_(0.0); return torque_b_Nm_; } -void InstalledComponents::LogSetup(Logger& logger) { UNUSED(logger); } +void InstalledComponents::LogSetup(logger::Logger& logger) { UNUSED(logger); } + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/installed_components.hpp b/src/simulation/spacecraft/installed_components.hpp index fed441308..096bba236 100644 --- a/src/simulation/spacecraft/installed_components.hpp +++ b/src/simulation/spacecraft/installed_components.hpp @@ -6,8 +6,10 @@ #ifndef S2E_SIMULATION_SPACECRAFT_INSTALLED_COMPONENTS_HPP_ #define S2E_SIMULATION_SPACECRAFT_INSTALLED_COMPONENTS_HPP_ -#include -#include +#include +#include + +namespace s2e::spacecraft { /** * @class InstalledComponents @@ -26,14 +28,14 @@ class InstalledComponents { * @brief Return force generated by components in unit Newton in body fixed frame * @details Users need to override this function to add force generated by components */ - virtual libra::Vector<3> GenerateForce_b_N(); + virtual math::Vector<3> GenerateForce_b_N(); /** * @fn GenerateTorque_b_Nm * @brief Return torque generated by components in unit Newton-meter in body fixed frame * @details Users need to override this function to add torque generated by components */ - virtual libra::Vector<3> GenerateTorque_b_Nm(); + virtual math::Vector<3> GenerateTorque_b_Nm(); /** * @fn ComponentInterference @@ -46,7 +48,9 @@ class InstalledComponents { * @brief Setup the logger for components * @details Users need to override this function to add logger for components */ - virtual void LogSetup(Logger& logger); + virtual void LogSetup(logger::Logger& logger); }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_INSTALLED_COMPONENTS_HPP_ diff --git a/src/simulation/spacecraft/spacecraft.cpp b/src/simulation/spacecraft/spacecraft.cpp index c138a95bc..59e060a3a 100644 --- a/src/simulation/spacecraft/spacecraft.cpp +++ b/src/simulation/spacecraft/spacecraft.cpp @@ -5,11 +5,13 @@ #include "spacecraft.hpp" -#include -#include +#include +#include -Spacecraft::Spacecraft(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, const int spacecraft_id, - RelativeInformation* relative_information) +namespace s2e::spacecraft { + +Spacecraft::Spacecraft(const simulation::SimulationConfiguration* simulation_configuration, const environment::GlobalEnvironment* global_environment, + const int spacecraft_id, simulation::RelativeInformation* relative_information) : spacecraft_id_(spacecraft_id) { Initialize(simulation_configuration, global_environment, spacecraft_id, relative_information); } @@ -25,14 +27,15 @@ Spacecraft::~Spacecraft() { delete components_; } -void Spacecraft::Initialize(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, - const int spacecraft_id, RelativeInformation* relative_information) { +void Spacecraft::Initialize(const simulation::SimulationConfiguration* simulation_configuration, + const environment::GlobalEnvironment* global_environment, const int spacecraft_id, + simulation::RelativeInformation* relative_information) { clock_generator_.ClearTimerCount(); - structure_ = new Structure(simulation_configuration, spacecraft_id); - local_environment_ = new LocalEnvironment(simulation_configuration, global_environment, spacecraft_id); - dynamics_ = new Dynamics(simulation_configuration, &(global_environment->GetSimulationTime()), local_environment_, spacecraft_id, structure_, - relative_information); - disturbances_ = new Disturbances(simulation_configuration, spacecraft_id, structure_, global_environment); + structure_ = new spacecraft::Structure(simulation_configuration, spacecraft_id); + local_environment_ = new environment::LocalEnvironment(simulation_configuration, global_environment, spacecraft_id); + dynamics_ = new dynamics::Dynamics(simulation_configuration, &(global_environment->GetSimulationTime()), local_environment_, spacecraft_id, + structure_, relative_information); + disturbances_ = new disturbances::Disturbances(simulation_configuration, spacecraft_id, structure_, global_environment); simulation_configuration->main_logger_->CopyFileToLogDirectory(simulation_configuration->spacecraft_file_list_[spacecraft_id]); @@ -42,14 +45,14 @@ void Spacecraft::Initialize(const SimulationConfiguration* simulation_configurat } } -void Spacecraft::LogSetup(Logger& logger) { +void Spacecraft::LogSetup(logger::Logger& logger) { dynamics_->LogSetup(logger); local_environment_->LogSetup(logger); disturbances_->LogSetup(logger); components_->LogSetup(logger); } -void Spacecraft::Update(const SimulationTime* simulation_time) { +void Spacecraft::Update(const environment::SimulationTime* simulation_time) { dynamics_->ClearForceTorque(); // Update local environment and disturbance @@ -74,3 +77,5 @@ void Spacecraft::Update(const SimulationTime* simulation_time) { } void Spacecraft::Clear(void) { dynamics_->ClearForceTorque(); } + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/spacecraft.hpp b/src/simulation/spacecraft/spacecraft.hpp index 2d9552f24..b7de8189c 100644 --- a/src/simulation/spacecraft/spacecraft.hpp +++ b/src/simulation/spacecraft/spacecraft.hpp @@ -15,6 +15,8 @@ #include "installed_components.hpp" #include "structure/structure.hpp" +namespace s2e::spacecraft { + /** * @class Spacecraft * @brief Base class to express Spacecraft @@ -25,8 +27,8 @@ class Spacecraft { * @fn Spacecraft * @brief Constructor for single satellite simulation */ - Spacecraft(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, const int spacecraft_id, - RelativeInformation* relative_information = nullptr); + Spacecraft(const simulation::SimulationConfiguration* simulation_configuration, const environment::GlobalEnvironment* global_environment, + const int spacecraft_id, simulation::RelativeInformation* relative_information = nullptr); /** * @fn ~Spacecraft @@ -43,14 +45,15 @@ class Spacecraft { * @fn Initialize * @brief Initialize function for multiple spacecraft simulation */ - virtual void Initialize(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, - const int spacecraft_id, RelativeInformation* relative_information = nullptr); + virtual void Initialize(const simulation::SimulationConfiguration* simulation_configuration, + const environment::GlobalEnvironment* global_environment, const int spacecraft_id, + simulation::RelativeInformation* relative_information = nullptr); /** * @fn Update * @brief Update all states related with the spacecraft */ - virtual void Update(const SimulationTime* simulation_time); + virtual void Update(const environment::SimulationTime* simulation_time); /** * @fn Clear @@ -62,29 +65,29 @@ class Spacecraft { * @fn LogSetup * @brief Logger setting for the spacecraft specific information */ - virtual void LogSetup(Logger& logger); + virtual void LogSetup(logger::Logger& logger); // Getters /** * @fn GetDynamics * @brief Get dynamics of the spacecraft */ - inline const Dynamics& GetDynamics() const { return *dynamics_; } + inline const dynamics::Dynamics& GetDynamics() const { return *dynamics_; } /** * @fn GetLocalEnvironment * @brief Get local environment around the spacecraft */ - inline const LocalEnvironment& GetLocalEnvironment() const { return *local_environment_; } + inline const environment::LocalEnvironment& GetLocalEnvironment() const { return *local_environment_; } /** * @fn GetDisturbances * @brief Get disturbance acting of the spacecraft */ - inline const Disturbances& GetDisturbances() const { return *disturbances_; } + inline const disturbances::Disturbances& GetDisturbances() const { return *disturbances_; } /** * @fn GetStructure * @brief Get structure of the spacecraft */ - inline const Structure& GetStructure() const { return *structure_; } + inline const spacecraft::Structure& GetStructure() const { return *structure_; } /** * @fn GetInstalledComponents * @brief Get components installed on the spacecraft @@ -97,14 +100,16 @@ class Spacecraft { inline unsigned int GetSpacecraftId() const { return spacecraft_id_; } protected: - ClockGenerator clock_generator_; //!< Origin of clock for the spacecraft - Dynamics* dynamics_; //!< Dynamics information of the spacecraft - RelativeInformation* relative_information_; //!< Relative information with respect to the other spacecraft - LocalEnvironment* local_environment_; //!< Local environment information around the spacecraft - Disturbances* disturbances_; //!< Disturbance information acting on the spacecraft - Structure* structure_; //!< Structure information of the spacecraft - InstalledComponents* components_; //!< Components information installed on the spacecraft - const unsigned int spacecraft_id_; //!< ID of the spacecraft + environment::ClockGenerator clock_generator_; //!< Origin of clock for the spacecraft + dynamics::Dynamics* dynamics_; //!< Dynamics information of the spacecraft + simulation::RelativeInformation* relative_information_; //!< Relative information with respect to the other spacecraft + environment::LocalEnvironment* local_environment_; //!< Local environment information around the spacecraft + disturbances::Disturbances* disturbances_; //!< Disturbance information acting on the spacecraft + spacecraft::Structure* structure_; //!< Structure information of the spacecraft + InstalledComponents* components_; //!< Components information installed on the spacecraft + const unsigned int spacecraft_id_; //!< ID of the spacecraft }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_SPACECRAFT_HPP_ diff --git a/src/simulation/spacecraft/structure/initialize_structure.cpp b/src/simulation/spacecraft/structure/initialize_structure.cpp index 3ad332234..4fa2b131c 100644 --- a/src/simulation/spacecraft/structure/initialize_structure.cpp +++ b/src/simulation/spacecraft/structure/initialize_structure.cpp @@ -5,19 +5,21 @@ #include "initialize_structure.hpp" -#include -#include +#include +#include + +namespace s2e::spacecraft { #define MIN_VAL 1e-6 KinematicsParameters InitKinematicsParameters(std::string file_name) { - auto conf = IniAccess(file_name); + auto conf = setting_file_reader::IniAccess(file_name); const char* section = "KINEMATIC_PARAMETERS"; - libra::Vector<3> center_of_gravity_b_m; + math::Vector<3> center_of_gravity_b_m; conf.ReadVector(section, "center_of_gravity_b_m", center_of_gravity_b_m); double mass_kg = conf.ReadDouble(section, "mass_kg"); - libra::Vector<9> inertia_vec; - libra::Matrix<3, 3> inertia_tensor_b_kgm2; + math::Vector<9> inertia_vec; + math::Matrix<3, 3> inertia_tensor_b_kgm2; conf.ReadVector(section, "inertia_tensor_kgm2", inertia_vec); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { @@ -29,14 +31,14 @@ KinematicsParameters InitKinematicsParameters(std::string file_name) { return kinematics_params; } -std::vector InitSurfaces(std::string file_name) { +std::vector InitSurfaces(std::string file_name) { using std::cout; - auto conf = IniAccess(file_name); + auto conf = setting_file_reader::IniAccess(file_name); const char* section = "SURFACES"; const int num_surface = conf.ReadInt(section, "number_of_surfaces"); - std::vector surfaces; + std::vector surfaces; for (int i = 0; i < num_surface; i++) { std::string idx = std::to_string(i); @@ -87,7 +89,7 @@ std::vector InitSurfaces(std::string file_name) { break; } - Vector<3> position, normal; + math::Vector<3> position, normal; keyword = "position" + idx + "_b_m"; conf.ReadVector(section, keyword.c_str(), position); @@ -101,16 +103,16 @@ std::vector InitSurfaces(std::string file_name) { } // Add a surface - surfaces.push_back(Surface(position, normal, area, ref, spe, air_spe)); + surfaces.push_back(spacecraft::Surface(position, normal, area, ref, spe, air_spe)); } return surfaces; } ResidualMagneticMoment InitResidualMagneticMoment(std::string file_name) { - auto conf = IniAccess(file_name); + auto conf = setting_file_reader::IniAccess(file_name); const char* section = "RESIDUAL_MAGNETIC_MOMENT"; - libra::Vector<3> rmm_const_b; + math::Vector<3> rmm_const_b; conf.ReadVector(section, "rmm_constant_b_Am2", rmm_const_b); double rmm_rwdev = conf.ReadDouble(section, "rmm_random_walk_speed_Am2"); double random_walk_limit_Am2 = conf.ReadDouble(section, "rmm_random_walk_limit_Am2"); @@ -119,3 +121,5 @@ ResidualMagneticMoment InitResidualMagneticMoment(std::string file_name) { ResidualMagneticMoment rmm_params(rmm_const_b, rmm_rwdev, random_walk_limit_Am2, random_noise_standard_deviation_Am2); return rmm_params; } + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/structure/initialize_structure.hpp b/src/simulation/spacecraft/structure/initialize_structure.hpp index 59311219a..8995a9689 100644 --- a/src/simulation/spacecraft/structure/initialize_structure.hpp +++ b/src/simulation/spacecraft/structure/initialize_structure.hpp @@ -6,10 +6,10 @@ #ifndef S2E_SIMULATION_SPACECRAFT_STRUCTURE_INITIALIZE_STRUCTURE_HPP_ #define S2E_SIMULATION_SPACECRAFT_STRUCTURE_INITIALIZE_STRUCTURE_HPP_ -#pragma once - #include +namespace s2e::spacecraft { + /** * @fn InitKinematicsParameters * @brief Initialize the kinematics parameters with an ini file @@ -26,4 +26,6 @@ std::vector InitSurfaces(std::string file_name); */ ResidualMagneticMoment InitResidualMagneticMoment(std::string file_name); +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_STRUCTURE_INITIALIZE_STRUCTURE_HPP_ diff --git a/src/simulation/spacecraft/structure/kinematics_parameters.cpp b/src/simulation/spacecraft/structure/kinematics_parameters.cpp index bd2cc3346..5768c73e7 100644 --- a/src/simulation/spacecraft/structure/kinematics_parameters.cpp +++ b/src/simulation/spacecraft/structure/kinematics_parameters.cpp @@ -5,5 +5,9 @@ #include "kinematics_parameters.hpp" -KinematicsParameters::KinematicsParameters(libra::Vector<3> center_of_gravity_b_m, double mass_kg, libra::Matrix<3, 3> inertia_tensor_b_kgm2) - : center_of_gravity_b_m_(center_of_gravity_b_m), mass_kg_(mass_kg), inertia_tensor_b_kgm2_(inertia_tensor_b_kgm2) {} \ No newline at end of file +namespace s2e::spacecraft { + +KinematicsParameters::KinematicsParameters(math::Vector<3> center_of_gravity_b_m, double mass_kg, math::Matrix<3, 3> inertia_tensor_b_kgm2) + : center_of_gravity_b_m_(center_of_gravity_b_m), mass_kg_(mass_kg), inertia_tensor_b_kgm2_(inertia_tensor_b_kgm2) {} + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/structure/kinematics_parameters.hpp b/src/simulation/spacecraft/structure/kinematics_parameters.hpp index 2246dcd63..4559b3f01 100644 --- a/src/simulation/spacecraft/structure/kinematics_parameters.hpp +++ b/src/simulation/spacecraft/structure/kinematics_parameters.hpp @@ -6,8 +6,10 @@ #ifndef S2E_SIMULATION_SPACECRAFT_STRUCTURE_KINEMATICS_PARAMETERS_HPP_ #define S2E_SIMULATION_SPACECRAFT_STRUCTURE_KINEMATICS_PARAMETERS_HPP_ -#include -#include +#include +#include + +namespace s2e::spacecraft { /** * @class KinematicsParameters @@ -19,7 +21,7 @@ class KinematicsParameters { * @fn KinematicsParameters * @brief Constructor */ - KinematicsParameters(libra::Vector<3> center_of_gravity_b_m, double mass_kg, libra::Matrix<3, 3> inertia_tensor_b_kgm2); + KinematicsParameters(math::Vector<3> center_of_gravity_b_m, double mass_kg, math::Matrix<3, 3> inertia_tensor_b_kgm2); /** * @fn ~KinematicsParameters * @brief Destructor @@ -31,7 +33,7 @@ class KinematicsParameters { * @fn GetCenterOfGravity_b_m * @brief Return Position vector of center of gravity at body frame [m] */ - inline const libra::Vector<3>& GetCenterOfGravity_b_m() const { return center_of_gravity_b_m_; } + inline const math::Vector<3>& GetCenterOfGravity_b_m() const { return center_of_gravity_b_m_; } /** * @fn GetMass_kg * @brief Return Mass of the satellite [kg] @@ -41,7 +43,7 @@ class KinematicsParameters { * @fn GetInertiaTensor_b_kgm2 * @brief Return Inertia tensor at body frame [kgm2] */ - inline const libra::Matrix<3, 3>& GetInertiaTensor_b_kgm2() const { return inertia_tensor_b_kgm2_; } + inline const math::Matrix<3, 3>& GetInertiaTensor_b_kgm2() const { return inertia_tensor_b_kgm2_; } // Setter /** @@ -49,7 +51,7 @@ class KinematicsParameters { * @brief Set center of gravity vector at the body frame [m] * @param [in] center_of_gravity_vector_b_m: Center of gravity vector at the body frame [m] */ - inline void SetCenterOfGravityVector_b_m(const libra::Vector<3> center_of_gravity_vector_b_m) { + inline void SetCenterOfGravityVector_b_m(const math::Vector<3> center_of_gravity_vector_b_m) { center_of_gravity_b_m_ = center_of_gravity_vector_b_m; } /** @@ -75,15 +77,17 @@ class KinematicsParameters { * @brief Inertia tensor at body frame * @param [in] inertia_tensor_b_kgm2: Inertia tensor at body frame [kgm2] */ - inline void SetInertiaTensor_b_kgm2(const libra::Matrix<3, 3> inertia_tensor_b_kgm2) { + inline void SetInertiaTensor_b_kgm2(const math::Matrix<3, 3> inertia_tensor_b_kgm2) { // TODO add assertion check inertia_tensor_b_kgm2_ = inertia_tensor_b_kgm2; } private: - libra::Vector<3> center_of_gravity_b_m_; //!< Position vector of center of gravity at body frame [m] - double mass_kg_; //!< Mass of the satellite [kg] - libra::Matrix<3, 3> inertia_tensor_b_kgm2_; //!< Inertia tensor at body frame [kgm2] + math::Vector<3> center_of_gravity_b_m_; //!< Position vector of center of gravity at body frame [m] + double mass_kg_; //!< Mass of the satellite [kg] + math::Matrix<3, 3> inertia_tensor_b_kgm2_; //!< Inertia tensor at body frame [kgm2] }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_STRUCTURE_KINEMATICS_PARAMETERS_HPP_ diff --git a/src/simulation/spacecraft/structure/residual_magnetic_moment.cpp b/src/simulation/spacecraft/structure/residual_magnetic_moment.cpp index 0fe90e09f..7e10c5014 100644 --- a/src/simulation/spacecraft/structure/residual_magnetic_moment.cpp +++ b/src/simulation/spacecraft/structure/residual_magnetic_moment.cpp @@ -5,9 +5,13 @@ #include "residual_magnetic_moment.hpp" -ResidualMagneticMoment::ResidualMagneticMoment(const Vector<3> constant_value_b_Am2_, const double random_walk_standard_deviation_Am2, +namespace s2e::spacecraft { + +ResidualMagneticMoment::ResidualMagneticMoment(const math::Vector<3> constant_value_b_Am2_, const double random_walk_standard_deviation_Am2, const double random_walk_limit_Am2, const double random_noise_standard_deviation_Am2) : constant_value_b_Am2_(constant_value_b_Am2_), random_walk_standard_deviation_Am2_(random_walk_standard_deviation_Am2), random_walk_limit_Am2_(random_walk_limit_Am2), random_noise_standard_deviation_Am2_(random_noise_standard_deviation_Am2) {} + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/structure/residual_magnetic_moment.hpp b/src/simulation/spacecraft/structure/residual_magnetic_moment.hpp index e12ecc4dd..14037ad30 100644 --- a/src/simulation/spacecraft/structure/residual_magnetic_moment.hpp +++ b/src/simulation/spacecraft/structure/residual_magnetic_moment.hpp @@ -6,8 +6,9 @@ #ifndef S2E_SIMULATION_SPACECRAFT_STRUCTURE_RESIDUAL_MAGNETIC_MOMENT_HPP_ #define S2E_SIMULATION_SPACECRAFT_STRUCTURE_RESIDUAL_MAGNETIC_MOMENT_HPP_ -#include -using libra::Vector; +#include + +namespace s2e::spacecraft { /** * @class ResidualMagneticMoment @@ -19,8 +20,8 @@ class ResidualMagneticMoment { * @fn ResidualMagneticMoment * @brief Constructor */ - ResidualMagneticMoment(const Vector<3> constant_value_b_Am2_, const double random_walk_standard_deviation_Am2, const double random_walk_limit_Am2, - const double random_noise_standard_deviation_Am2); + ResidualMagneticMoment(const math::Vector<3> constant_value_b_Am2_, const double random_walk_standard_deviation_Am2, + const double random_walk_limit_Am2, const double random_noise_standard_deviation_Am2); /** * @fn ~ResidualMagneticMoment * @brief Destructor @@ -32,7 +33,7 @@ class ResidualMagneticMoment { * @fn GetConstantValue_b_Am2 * @brief Return Constant value of RMM at body frame [Am2] */ - inline const Vector<3>& GetConstantValue_b_Am2(void) const { return constant_value_b_Am2_; } + inline const math::Vector<3>& GetConstantValue_b_Am2(void) const { return constant_value_b_Am2_; } /** * @fn GetRandomWalkStandardDeviation_Am2 * @brief Return Random walk standard deviation of RMM [Am2] @@ -55,19 +56,21 @@ class ResidualMagneticMoment { * @brief Set Constant value of RMM at body frame [Am2] * @param [in] rmm_const_b_Am2: Constant value of RMM at the body frame [Am2] */ - inline void SetRmmConstant_b_Am2(const Vector<3> rmm_const_b_Am2) { constant_value_b_Am2_ = rmm_const_b_Am2; } + inline void SetRmmConstant_b_Am2(const math::Vector<3> rmm_const_b_Am2) { constant_value_b_Am2_ = rmm_const_b_Am2; } /** * @fn AddRMMConst_b_Am2 * @brief Add Constant value of RMM at body frame [Am2] * @param [in] rmm_const_b_Am2: Constant value of RMM at the body frame [Am2] */ - inline void AddRmmConstant_b_Am2(const Vector<3> rmm_const_b_Am2) { constant_value_b_Am2_ += rmm_const_b_Am2; } + inline void AddRmmConstant_b_Am2(const math::Vector<3> rmm_const_b_Am2) { constant_value_b_Am2_ += rmm_const_b_Am2; } private: - Vector<3> constant_value_b_Am2_; //!< Constant value of RMM at body frame [Am2] + math::Vector<3> constant_value_b_Am2_; //!< Constant value of RMM at body frame [Am2] double random_walk_standard_deviation_Am2_; //!< Random walk standard deviation of RMM [Am2] double random_walk_limit_Am2_; //!< Random walk limit of RMM [Am2] double random_noise_standard_deviation_Am2_; //!< Standard deviation of white noise of RMM [Am2] }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_STRUCTURE_RESIDUAL_MAGNETIC_MOMENT_HPP_ \ No newline at end of file diff --git a/src/simulation/spacecraft/structure/structure.cpp b/src/simulation/spacecraft/structure/structure.cpp index b16de8b09..af7e345d7 100644 --- a/src/simulation/spacecraft/structure/structure.cpp +++ b/src/simulation/spacecraft/structure/structure.cpp @@ -5,10 +5,12 @@ #include "structure.hpp" -#include +#include #include -Structure::Structure(const SimulationConfiguration* simulation_configuration, const int spacecraft_id) { +namespace s2e::spacecraft { + +Structure::Structure(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id) { Initialize(simulation_configuration, spacecraft_id); } @@ -17,9 +19,9 @@ Structure::~Structure() { delete residual_magnetic_moment_; } -void Structure::Initialize(const SimulationConfiguration* simulation_configuration, const int spacecraft_id) { +void Structure::Initialize(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id) { // Read file name - IniAccess conf = IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); + setting_file_reader::IniAccess conf = setting_file_reader::IniAccess(simulation_configuration->spacecraft_file_list_[spacecraft_id]); std::string ini_fname = conf.ReadString("SETTING_FILES", "structure_file"); // Save ini file simulation_configuration->main_logger_->CopyFileToLogDirectory(ini_fname); @@ -28,3 +30,5 @@ void Structure::Initialize(const SimulationConfiguration* simulation_configurati surfaces_ = InitSurfaces(ini_fname); residual_magnetic_moment_ = new ResidualMagneticMoment(InitResidualMagneticMoment(ini_fname)); } + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/structure/structure.hpp b/src/simulation/spacecraft/structure/structure.hpp index acc0b5d36..09001aaeb 100644 --- a/src/simulation/spacecraft/structure/structure.hpp +++ b/src/simulation/spacecraft/structure/structure.hpp @@ -13,6 +13,8 @@ #include "residual_magnetic_moment.hpp" #include "surface.hpp" +namespace s2e::spacecraft { + /** * @class Structure * @brief Class for spacecraft structure information @@ -23,7 +25,7 @@ class Structure { * @fn Structure * @brief Constructor */ - Structure(const SimulationConfiguration* simulation_configuration, const int spacecraft_id); + Structure(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id); /** * @fn ~Structure * @brief Destructor @@ -33,7 +35,7 @@ class Structure { * @fn Initialize * @brief Initialize function */ - void Initialize(const SimulationConfiguration* simulation_configuration, const int spacecraft_id); + void Initialize(const simulation::SimulationConfiguration* simulation_configuration, const int spacecraft_id); // Getter /** @@ -74,4 +76,6 @@ class Structure { ResidualMagneticMoment* residual_magnetic_moment_; //!< Residual Magnetic Moment }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_STRUCTURE_STRUCTURE_HPP_ diff --git a/src/simulation/spacecraft/structure/surface.cpp b/src/simulation/spacecraft/structure/surface.cpp index 2666526e2..316d6165e 100644 --- a/src/simulation/spacecraft/structure/surface.cpp +++ b/src/simulation/spacecraft/structure/surface.cpp @@ -5,7 +5,9 @@ #include "surface.hpp" -Surface::Surface(const libra::Vector<3> position_b_m, const libra::Vector<3> normal_b, const double area_m2, const double reflectivity, +namespace s2e::spacecraft { + +Surface::Surface(const math::Vector<3> position_b_m, const math::Vector<3> normal_b, const double area_m2, const double reflectivity, const double specularity, const double air_specularity) : position_b_m_(position_b_m), normal_b_(normal_b), @@ -13,3 +15,5 @@ Surface::Surface(const libra::Vector<3> position_b_m, const libra::Vector<3> nor reflectivity_(reflectivity), specularity_(specularity), air_specularity_(air_specularity) {} + +} // namespace s2e::spacecraft diff --git a/src/simulation/spacecraft/structure/surface.hpp b/src/simulation/spacecraft/structure/surface.hpp index ad93c3b0d..3c286ce94 100644 --- a/src/simulation/spacecraft/structure/surface.hpp +++ b/src/simulation/spacecraft/structure/surface.hpp @@ -6,7 +6,9 @@ #ifndef S2E_SIMULATION_SPACECRAFT_STRUCTURE_SURFACE_HPP_ #define S2E_SIMULATION_SPACECRAFT_STRUCTURE_SURFACE_HPP_ -#include +#include + +namespace s2e::spacecraft { /** * @class Surface @@ -18,7 +20,7 @@ class Surface { * @fn Surface * @brief Constructor */ - Surface(const libra::Vector<3> position_b_m, const libra::Vector<3> normal_b, const double area_m2, const double reflectivity, + Surface(const math::Vector<3> position_b_m, const math::Vector<3> normal_b, const double area_m2, const double reflectivity, const double specularity, const double air_specularity); /** * @fn ~Surface @@ -31,12 +33,12 @@ class Surface { * @fn GetPosition_b_m * @brief Return position vector of geometric center of the surface in body frame and meter unit */ - inline const libra::Vector<3>& GetPosition_b_m(void) const { return position_b_m_; } + inline const math::Vector<3>& GetPosition_b_m(void) const { return position_b_m_; } /** * @fn GetNormal_b * @brief Return normal vector of the surface in body frame */ - inline const libra::Vector<3>& GetNormal_b(void) const { return normal_b_; } + inline const math::Vector<3>& GetNormal_b(void) const { return normal_b_; } /** * @fn GetArea_m2 * @brief Return area of the surface in meter^2 unit @@ -64,13 +66,13 @@ class Surface { * @brief Set position vector of geometric center of the surface in body frame [m] * @param[in] position_b_m: Position vector of geometric center of the surface in body frame [m] */ - inline void SetPosition_b_m(const libra::Vector<3> position_b_m) { position_b_m_ = position_b_m; } + inline void SetPosition_b_m(const math::Vector<3> position_b_m) { position_b_m_ = position_b_m; } /** * @fn SetNormal * @brief Set normal vector of the surface in body frame * @param[in] normal_b: Normal vector of the surface in body frame */ - inline void SetNormal_b(const libra::Vector<3> normal_b) { normal_b_ = normal_b.CalcNormalizedVector(); } + inline void SetNormal_b(const math::Vector<3> normal_b) { normal_b_ = normal_b.CalcNormalizedVector(); } /** * @fn SetArea_m2 * @brief Set area of the surface @@ -105,12 +107,14 @@ class Surface { } private: - libra::Vector<3> position_b_m_; //!< Position vector of the surface @ Body Frame [m] - libra::Vector<3> normal_b_; //!< Normal unit vector of the surface @ Body Frame [-] - double area_m2_; //!< Area of the surface [m2] - double reflectivity_; //!< Total reflectivity for solar wavelength (1.0 - solar absorption) - double specularity_; //!< Ratio of specular reflection in the total reflected light - double air_specularity_; //!< Specularity for air drag + math::Vector<3> position_b_m_; //!< Position vector of the surface @ Body Frame [m] + math::Vector<3> normal_b_; //!< Normal unit vector of the surface @ Body Frame [-] + double area_m2_; //!< Area of the surface [m2] + double reflectivity_; //!< Total reflectivity for solar wavelength (1.0 - solar absorption) + double specularity_; //!< Ratio of specular reflection in the total reflected light + double air_specularity_; //!< Specularity for air drag }; +} // namespace s2e::spacecraft + #endif // S2E_SIMULATION_SPACECRAFT_STRUCTURE_SURFACE_HPP_ diff --git a/src/simulation_sample/case/sample_case.cpp b/src/simulation_sample/case/sample_case.cpp index ce6376ebe..4697ecd07 100644 --- a/src/simulation_sample/case/sample_case.cpp +++ b/src/simulation_sample/case/sample_case.cpp @@ -5,7 +5,9 @@ #include "sample_case.hpp" -SampleCase::SampleCase(std::string initialise_base_file) : SimulationCase(initialise_base_file) {} +namespace s2e::sample { + +SampleCase::SampleCase(std::string initialise_base_file) : simulation::SimulationCase(initialise_base_file) {} SampleCase::~SampleCase() { delete sample_spacecraft_; @@ -35,7 +37,7 @@ void SampleCase::UpdateTargetObjects() { std::string SampleCase::GetLogHeader() const { std::string str_tmp = ""; - str_tmp += WriteScalar("time", "s"); + str_tmp += logger::WriteScalar("time", "s"); return str_tmp; } @@ -43,7 +45,9 @@ std::string SampleCase::GetLogHeader() const { std::string SampleCase::GetLogValue() const { std::string str_tmp = ""; - str_tmp += WriteScalar(global_environment_->GetSimulationTime().GetElapsedTime_s()); + str_tmp += logger::WriteScalar(global_environment_->GetSimulationTime().GetElapsedTime_s()); return str_tmp; } + +} // namespace s2e::sample diff --git a/src/simulation_sample/case/sample_case.hpp b/src/simulation_sample/case/sample_case.hpp index a4664a190..af3fc5b74 100644 --- a/src/simulation_sample/case/sample_case.hpp +++ b/src/simulation_sample/case/sample_case.hpp @@ -11,11 +11,13 @@ #include "../ground_station/sample_ground_station.hpp" #include "../spacecraft/sample_spacecraft.hpp" +namespace s2e::sample { + /** * @class SampleCase * @brief An example of user defined simulation class */ -class SampleCase : public SimulationCase { +class SampleCase : public simulation::SimulationCase { public: /** * @fn SampleCase @@ -57,4 +59,6 @@ class SampleCase : public SimulationCase { void UpdateTargetObjects(); }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_CASE_SAMPLE_CASE_HPP_ diff --git a/src/simulation_sample/ground_station/sample_ground_station.cpp b/src/simulation_sample/ground_station/sample_ground_station.cpp index 1aa881352..5ca22e707 100644 --- a/src/simulation_sample/ground_station/sample_ground_station.cpp +++ b/src/simulation_sample/ground_station/sample_ground_station.cpp @@ -7,19 +7,23 @@ #include "sample_ground_station_components.hpp" -SampleGroundStation::SampleGroundStation(const SimulationConfiguration* configuration, const unsigned int ground_station_id) - : GroundStation(configuration, ground_station_id) { +namespace s2e::sample { + +SampleGroundStation::SampleGroundStation(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id) + : ground_station::GroundStation(configuration, ground_station_id) { components_ = new SampleGsComponents(configuration); } SampleGroundStation::~SampleGroundStation() { delete components_; } -void SampleGroundStation::LogSetup(Logger& logger) { - GroundStation::LogSetup(logger); +void SampleGroundStation::LogSetup(logger::Logger& logger) { + ground_station::GroundStation::LogSetup(logger); components_->CompoLogSetUp(logger); } -void SampleGroundStation::Update(const EarthRotation& celestial_rotation, const SampleSpacecraft& spacecraft) { - GroundStation::Update(celestial_rotation, spacecraft); +void SampleGroundStation::Update(const environment::EarthRotation& celestial_rotation, const SampleSpacecraft& spacecraft) { + ground_station::GroundStation::Update(celestial_rotation, spacecraft); components_->GetGsCalculator()->Update(spacecraft, spacecraft.GetInstalledComponents().GetAntenna(), *this, *(components_->GetAntenna())); } + +} // namespace s2e::sample diff --git a/src/simulation_sample/ground_station/sample_ground_station.hpp b/src/simulation_sample/ground_station/sample_ground_station.hpp index 8fe089bba..0d45f86f4 100644 --- a/src/simulation_sample/ground_station/sample_ground_station.hpp +++ b/src/simulation_sample/ground_station/sample_ground_station.hpp @@ -14,19 +14,21 @@ #include "../spacecraft/sample_spacecraft.hpp" +namespace s2e::sample { + class SampleGsComponents; /** * @class SampleGroundStation * @brief An example of user defined ground station class */ -class SampleGroundStation : public GroundStation { +class SampleGroundStation : public ground_station::GroundStation { public: /** * @fn SampleGroundStation * @brief Constructor */ - SampleGroundStation(const SimulationConfiguration* configuration, const unsigned int ground_station_id); + SampleGroundStation(const simulation::SimulationConfiguration* configuration, const unsigned int ground_station_id); /** * @fn ~SampleGroundStation * @brief Destructor @@ -37,16 +39,18 @@ class SampleGroundStation : public GroundStation { * @fn LogSetup * @brief Override function of LogSetup in GroundStation class */ - virtual void LogSetup(Logger& logger); + virtual void LogSetup(logger::Logger& logger); /** * @fn Update * @brief Override function of Update in GroundStation class */ - virtual void Update(const EarthRotation& celestial_rotation, const SampleSpacecraft& spacecraft); + virtual void Update(const environment::EarthRotation& celestial_rotation, const SampleSpacecraft& spacecraft); private: using GroundStation::Update; SampleGsComponents* components_; //!< Ground station related components }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_GROUND_STATION_SAMPLE_GROUND_STATION_HPP_ diff --git a/src/simulation_sample/ground_station/sample_ground_station_components.cpp b/src/simulation_sample/ground_station/sample_ground_station_components.cpp index 53d5e67f3..45ba2ee24 100644 --- a/src/simulation_sample/ground_station/sample_ground_station_components.cpp +++ b/src/simulation_sample/ground_station/sample_ground_station_components.cpp @@ -4,17 +4,19 @@ */ #include "sample_ground_station_components.hpp" -#include +#include -SampleGsComponents::SampleGsComponents(const SimulationConfiguration* configuration) : configuration_(configuration) { - IniAccess iniAccess = IniAccess(configuration_->ground_station_file_list_[0]); +namespace s2e::sample { + +SampleGsComponents::SampleGsComponents(const simulation::SimulationConfiguration* configuration) : configuration_(configuration) { + setting_file_reader::IniAccess iniAccess = setting_file_reader::IniAccess(configuration_->ground_station_file_list_[0]); std::string ant_ini_path = iniAccess.ReadString("COMPONENT_FILES", "ground_station_antenna_file"); configuration_->main_logger_->CopyFileToLogDirectory(ant_ini_path); - antenna_ = new Antenna(InitAntenna(1, ant_ini_path)); + antenna_ = new components::Antenna(components::InitAntenna(1, ant_ini_path)); std::string gs_calculator_ini_path = iniAccess.ReadString("COMPONENT_FILES", "ground_station_calculator_file"); configuration_->main_logger_->CopyFileToLogDirectory(gs_calculator_ini_path); - gs_calculator_ = new GroundStationCalculator(InitGsCalculator(gs_calculator_ini_path)); + gs_calculator_ = new components::GroundStationCalculator(components::InitGsCalculator(gs_calculator_ini_path)); } SampleGsComponents::~SampleGsComponents() { @@ -22,7 +24,9 @@ SampleGsComponents::~SampleGsComponents() { delete gs_calculator_; } -void SampleGsComponents::CompoLogSetUp(Logger& logger) { +void SampleGsComponents::CompoLogSetUp(logger::Logger& logger) { // logger.AddLogList(ant_); logger.AddLogList(gs_calculator_); } + +} // namespace s2e::sample diff --git a/src/simulation_sample/ground_station/sample_ground_station_components.hpp b/src/simulation_sample/ground_station/sample_ground_station_components.hpp index 15f1632bb..35df9ce22 100644 --- a/src/simulation_sample/ground_station/sample_ground_station_components.hpp +++ b/src/simulation_sample/ground_station/sample_ground_station_components.hpp @@ -9,6 +9,8 @@ #include #include +namespace s2e::sample { + /** * @class SampleGsComponents * @brief An example of ground station related components list class @@ -19,7 +21,7 @@ class SampleGsComponents { * @fn SampleGsComponents * @brief Constructor */ - SampleGsComponents(const SimulationConfiguration* configuration); + SampleGsComponents(const simulation::SimulationConfiguration* configuration); /** * @fn ~SampleGsComponents * @brief Destructor @@ -29,24 +31,26 @@ class SampleGsComponents { * @fn CompoLogSetUp * @brief Log setup for ground station components */ - void CompoLogSetUp(Logger& logger); + void CompoLogSetUp(logger::Logger& logger); // Getter /** * @fn GetAntenna * @brief Return antenna */ - inline Antenna* GetAntenna() const { return antenna_; } + inline components::Antenna* GetAntenna() const { return antenna_; } /** * @fn GetGsCalculator * @brief Return ground station calculator */ - inline GroundStationCalculator* GetGsCalculator() const { return gs_calculator_; } + inline components::GroundStationCalculator* GetGsCalculator() const { return gs_calculator_; } private: - Antenna* antenna_; //!< Antenna on ground station - GroundStationCalculator* gs_calculator_; //!< Ground station calculation algorithm - const SimulationConfiguration* configuration_; //!< Simulation setting + components::Antenna* antenna_; //!< Antenna on ground station + components::GroundStationCalculator* gs_calculator_; //!< Ground station calculation algorithm + const simulation::SimulationConfiguration* configuration_; //!< Simulation setting }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_GROUND_STATION_SAMPLE_GROUND_STATION_COMPONENTS_HPP_ diff --git a/src/simulation_sample/spacecraft/sample_components.cpp b/src/simulation_sample/spacecraft/sample_components.cpp index d529d040a..12cd92b38 100644 --- a/src/simulation_sample/spacecraft/sample_components.cpp +++ b/src/simulation_sample/spacecraft/sample_components.cpp @@ -5,19 +5,24 @@ #include "sample_components.hpp" -#include +#include #include "sample_port_configuration.hpp" -SampleComponents::SampleComponents(const Dynamics* dynamics, Structure* structure, const LocalEnvironment* local_environment, - const GlobalEnvironment* global_environment, const SimulationConfiguration* configuration, - ClockGenerator* clock_generator, const unsigned int spacecraft_id) +namespace s2e::sample { + +using namespace components; + +SampleComponents::SampleComponents(const dynamics::Dynamics* dynamics, spacecraft::Structure* structure, + const environment::LocalEnvironment* local_environment, const environment::GlobalEnvironment* global_environment, + const simulation::SimulationConfiguration* configuration, environment::ClockGenerator* clock_generator, + const unsigned int spacecraft_id) : configuration_(configuration), dynamics_(dynamics), structure_(structure), local_environment_(local_environment), global_environment_(global_environment) { - IniAccess iniAccess = IniAccess(configuration_->spacecraft_file_list_[spacecraft_id]); + setting_file_reader::IniAccess iniAccess = setting_file_reader::IniAccess(configuration_->spacecraft_file_list_[spacecraft_id]); // PCU power port connection pcu_ = new PowerControlUnit(clock_generator); @@ -27,7 +32,7 @@ SampleComponents::SampleComponents(const Dynamics* dynamics, Structure* structur // Components obc_ = new OnBoardComputer(1, clock_generator, pcu_->GetPowerPort(0)); - hils_port_manager_ = new HilsPortManager(); + hils_port_manager_ = new simulation::HilsPortManager(); // GyroSensor std::string file_name = iniAccess.ReadString("COMPONENT_FILES", "gyro_file"); @@ -84,11 +89,10 @@ SampleComponents::SampleComponents(const Dynamics* dynamics, Structure* structur thruster_ = new SimpleThruster(InitSimpleThruster(clock_generator, pcu_->GetPowerPort(2), 1, file_name, structure_, dynamics)); // Mission - const std::string telescope_ini_path = iniAccess.ReadString("COMPONENT_FILES", "telescope_file"); + file_name = iniAccess.ReadString("COMPONENT_FILES", "telescope_file"); configuration_->main_logger_->CopyFileToLogDirectory(file_name); - telescope_ = - new Telescope(InitTelescope(clock_generator, 1, telescope_ini_path, &(dynamics_->GetAttitude()), &(global_environment_->GetHipparcosCatalog()), - &(local_environment_->GetCelestialInformation()), &(dynamics_->GetOrbit()))); + telescope_ = new Telescope(InitTelescope(clock_generator, 1, file_name, &(dynamics_->GetAttitude()), &(global_environment_->GetHipparcosCatalog()), + &(local_environment_->GetCelestialInformation()), &(dynamics_->GetOrbit()))); // Force Generator file_name = iniAccess.ReadString("COMPONENT_FILES", "force_generator_file"); @@ -106,6 +110,11 @@ SampleComponents::SampleComponents(const Dynamics* dynamics, Structure* structur configuration_->main_logger_->CopyFileToLogDirectory(file_name); attitude_observer_ = new AttitudeObserver(InitializeAttitudeObserver(clock_generator, file_name, dynamics_->GetAttitude())); + // Orbit Observer + file_name = iniAccess.ReadString("COMPONENT_FILES", "orbit_observer_file"); + configuration_->main_logger_->CopyFileToLogDirectory(file_name); + orbit_observer_ = new OrbitObserver(InitializeOrbitObserver(clock_generator, file_name, dynamics_->GetOrbit())); + // Antenna file_name = iniAccess.ReadString("COMPONENT_FILES", "antenna_file"); configuration_->main_logger_->CopyFileToLogDirectory(file_name); @@ -137,21 +146,21 @@ SampleComponents::SampleComponents(const Dynamics* dynamics, Structure* structur /**************/ // actuator debug output - // libra::Vector mag_moment_c{0.01}; + // math::Vector mag_moment_c{0.01}; // magnetorquer_->SetOutputMagneticMoment_c_Am2(mag_moment_c); // reaction_wheel_->SetTargetTorque_rw_Nm(0.01); // reaction_wheel_->SetDriveFlag(true); // thruster_->SetDuty(0.9); // force generator debug output - // libra::Vector<3> force_N; + // math::Vector<3> force_N; // force_N[0] = 1.0; // force_N[1] = 0.0; // force_N[2] = 0.0; // force_generator_->SetForce_b_N(force_N); // torque generator debug output - // libra::Vector<3> torque_Nm; + // math::Vector<3> torque_Nm; // torque_Nm[0] = 0.1; // torque_Nm[1] = 0.0; // torque_Nm[2] = 0.0; @@ -171,6 +180,7 @@ SampleComponents::~SampleComponents() { delete torque_generator_; delete angular_velocity_observer_; delete attitude_observer_; + delete orbit_observer_; delete antenna_; delete mtq_magnetometer_interference_; // delete change_structure_; @@ -183,15 +193,15 @@ SampleComponents::~SampleComponents() { delete hils_port_manager_; // delete after exp_hils } -libra::Vector<3> SampleComponents::GenerateForce_b_N() { - libra::Vector<3> force_b_N_(0.0); +math::Vector<3> SampleComponents::GenerateForce_b_N() { + math::Vector<3> force_b_N_(0.0); force_b_N_ += thruster_->GetOutputThrust_b_N(); force_b_N_ += force_generator_->GetGeneratedForce_b_N(); return force_b_N_; } -libra::Vector<3> SampleComponents::GenerateTorque_b_Nm() { - libra::Vector<3> torque_b_Nm_(0.0); +math::Vector<3> SampleComponents::GenerateTorque_b_Nm() { + math::Vector<3> torque_b_Nm_(0.0); torque_b_Nm_ += magnetorquer_->GetOutputTorque_b_Nm(); torque_b_Nm_ += reaction_wheel_->GetOutputTorque_b_Nm(); torque_b_Nm_ += thruster_->GetOutputTorque_b_Nm(); @@ -201,7 +211,7 @@ libra::Vector<3> SampleComponents::GenerateTorque_b_Nm() { void SampleComponents::ComponentInterference() { mtq_magnetometer_interference_->UpdateInterference(); } -void SampleComponents::LogSetup(Logger& logger) { +void SampleComponents::LogSetup(logger::Logger& logger) { logger.AddLogList(gyro_sensor_); logger.AddLogList(magnetometer_); logger.AddLogList(star_sensor_); @@ -215,4 +225,7 @@ void SampleComponents::LogSetup(Logger& logger) { logger.AddLogList(torque_generator_); logger.AddLogList(angular_velocity_observer_); logger.AddLogList(attitude_observer_); + logger.AddLogList(orbit_observer_); } + +} // namespace s2e::sample diff --git a/src/simulation_sample/spacecraft/sample_components.hpp b/src/simulation_sample/spacecraft/sample_components.hpp index 2b7574f27..11a534e95 100644 --- a/src/simulation_sample/spacecraft/sample_components.hpp +++ b/src/simulation_sample/spacecraft/sample_components.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -28,11 +29,12 @@ #include #include #include -#include +#include #include #include #include +namespace s2e::components { class OnBoardComputer; class PowerControlUnit; class GyroSensor; @@ -48,20 +50,23 @@ class TorqueGenerator; class AngularVelocityObserver; class AttitudeObserver; class Telescope; +} // namespace s2e::components + +namespace s2e::sample { /** * @class SampleComponents * @brief An example of user side components management class */ -class SampleComponents : public InstalledComponents { +class SampleComponents : public spacecraft::InstalledComponents { public: /** * @fn SampleComponents * @brief Constructor */ - SampleComponents(const Dynamics* dynamics, Structure* structure, const LocalEnvironment* local_environment, - const GlobalEnvironment* global_environment, const SimulationConfiguration* configuration, ClockGenerator* clock_generator, - const unsigned int spacecraft_id); + SampleComponents(const dynamics::Dynamics* dynamics, spacecraft::Structure* structure, const environment::LocalEnvironment* local_environment, + const environment::GlobalEnvironment* global_environment, const simulation::SimulationConfiguration* configuration, + environment::ClockGenerator* clock_generator, const unsigned int spacecraft_id); /** * @fn ~SampleComponents * @brief Destructor @@ -73,12 +78,12 @@ class SampleComponents : public InstalledComponents { * @fn GenerateForce_b_N * @brief Return force generated by components in unit Newton in body fixed frame */ - libra::Vector<3> GenerateForce_b_N() override; + math::Vector<3> GenerateForce_b_N() override; /** * @fn GenerateTorque_b_Nm * @brief Return torque generated by components in unit Newton-meter in body fixed frame */ - libra::Vector<3> GenerateTorque_b_Nm() override; + math::Vector<3> GenerateTorque_b_Nm() override; /** * @fn ComponentInterference * @brief Handle component interference effect @@ -89,40 +94,41 @@ class SampleComponents : public InstalledComponents { * @fn LogSetup * @brief Setup the logger for components */ - void LogSetup(Logger& logger) override; + void LogSetup(logger::Logger& logger) override; // Getter - inline Antenna& GetAntenna() const { return *antenna_; } + inline components::Antenna& GetAntenna() const { return *antenna_; } private: - PowerControlUnit* pcu_; //!< Power Control Unit - OnBoardComputer* obc_; //!< Onboard Computer - HilsPortManager* hils_port_manager_; //!< Port manager for HILS test + components::PowerControlUnit* pcu_; //!< Power Control Unit + components::OnBoardComputer* obc_; //!< Onboard Computer + simulation::HilsPortManager* hils_port_manager_; //!< Port manager for HILS test // AOCS - GyroSensor* gyro_sensor_; //!< GyroSensor sensor - Magnetometer* magnetometer_; //!< Magnetometer - StarSensor* star_sensor_; //!< Star sensor - SunSensor* sun_sensor_; //!< Sun sensor - GnssReceiver* gnss_receiver_; //!< GNSS receiver - Magnetorquer* magnetorquer_; //!< Magnetorquer - ReactionWheel* reaction_wheel_; //!< Reaction Wheel - SimpleThruster* thruster_; //!< Thruster + components::GyroSensor* gyro_sensor_; //!< GyroSensor sensor + components::Magnetometer* magnetometer_; //!< Magnetometer + components::StarSensor* star_sensor_; //!< Star sensor + components::SunSensor* sun_sensor_; //!< Sun sensor + components::GnssReceiver* gnss_receiver_; //!< GNSS receiver + components::Magnetorquer* magnetorquer_; //!< Magnetorquer + components::ReactionWheel* reaction_wheel_; //!< Reaction Wheel + components::SimpleThruster* thruster_; //!< Thruster // Ideal component - ForceGenerator* force_generator_; //!< Ideal Force Generator - TorqueGenerator* torque_generator_; //!< Ideal Torque Generator - AngularVelocityObserver* angular_velocity_observer_; //!< Ideal Angular velocity observer - AttitudeObserver* attitude_observer_; //!< Ideal Attitude observer + components::ForceGenerator* force_generator_; //!< Ideal Force Generator + components::TorqueGenerator* torque_generator_; //!< Ideal Torque Generator + components::AngularVelocityObserver* angular_velocity_observer_; //!< Ideal Angular velocity observer + components::AttitudeObserver* attitude_observer_; //!< Ideal Attitude observer + components::OrbitObserver* orbit_observer_; //!< Ideal Orbit observer // Mission - Telescope* telescope_; //!< Telescope + components::Telescope* telescope_; //!< Telescope // CommGs - Antenna* antenna_; //!< Antenna + components::Antenna* antenna_; //!< Antenna // Component Interference - MtqMagnetometerInterference* mtq_magnetometer_interference_; //!< Additional Bias noise by MTQ-Magnetometer interference + components::MtqMagnetometerInterference* mtq_magnetometer_interference_; //!< Additional Bias noise by MTQ-Magnetometer interference // Examples // ExampleChangeStructure* change_structure_; //!< Change structure @@ -134,11 +140,13 @@ class SampleComponents : public InstalledComponents { */ // States - const SimulationConfiguration* configuration_; //!< Simulation settings - const Dynamics* dynamics_; //!< Dynamics information of the spacecraft - Structure* structure_; //!< Structure information of the spacecraft - const LocalEnvironment* local_environment_; //!< Local environment information around the spacecraft - const GlobalEnvironment* global_environment_; //!< Global environment information + const simulation::SimulationConfiguration* configuration_; //!< Simulation settings + const dynamics::Dynamics* dynamics_; //!< Dynamics information of the spacecraft + spacecraft::Structure* structure_; //!< Structure information of the spacecraft + const environment::LocalEnvironment* local_environment_; //!< Local environment information around the spacecraft + const environment::GlobalEnvironment* global_environment_; //!< Global environment information }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_SPACECRAFT_SAMPLE_COMPONENTS_HPP_ diff --git a/src/simulation_sample/spacecraft/sample_port_configuration.hpp b/src/simulation_sample/spacecraft/sample_port_configuration.hpp index 413e22fce..dd67bddab 100644 --- a/src/simulation_sample/spacecraft/sample_port_configuration.hpp +++ b/src/simulation_sample/spacecraft/sample_port_configuration.hpp @@ -6,6 +6,8 @@ #ifndef S2E_SIMULATION_SAMPLE_SPACECRAFT_SAMPLE_PORT_CONFIGURATION_HPP_ #define S2E_SIMULATION_SAMPLE_SPACECRAFT_SAMPLE_PORT_CONFIGURATION_HPP_ +namespace s2e::sample { + /** * @enum PowerPortConfig * @brief ID list of electrical power switch ports @@ -27,4 +29,6 @@ enum class UARTPortConfig { kUartComponentMax //!< Maximum port number. Do not remove. Place on the bottom. }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_SPACECRAFT_SAMPLE_PORT_CONFIGURATION_HPP_ diff --git a/src/simulation_sample/spacecraft/sample_spacecraft.cpp b/src/simulation_sample/spacecraft/sample_spacecraft.cpp index c162ffab8..4a4970ab6 100644 --- a/src/simulation_sample/spacecraft/sample_spacecraft.cpp +++ b/src/simulation_sample/spacecraft/sample_spacecraft.cpp @@ -6,14 +6,18 @@ #include "sample_spacecraft.hpp" #include -#include +#include #include "sample_components.hpp" -SampleSpacecraft::SampleSpacecraft(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, - const unsigned int spacecraft_id) - : Spacecraft(simulation_configuration, global_environment, spacecraft_id) { +namespace s2e::sample { + +SampleSpacecraft::SampleSpacecraft(const simulation::SimulationConfiguration* simulation_configuration, + const environment::GlobalEnvironment* global_environment, const unsigned int spacecraft_id) + : spacecraft::Spacecraft(simulation_configuration, global_environment, spacecraft_id) { sample_components_ = new SampleComponents(dynamics_, structure_, local_environment_, global_environment, simulation_configuration, &clock_generator_, spacecraft_id); components_ = sample_components_; } + +} // namespace s2e::sample diff --git a/src/simulation_sample/spacecraft/sample_spacecraft.hpp b/src/simulation_sample/spacecraft/sample_spacecraft.hpp index 1436dbfe1..d745e1774 100644 --- a/src/simulation_sample/spacecraft/sample_spacecraft.hpp +++ b/src/simulation_sample/spacecraft/sample_spacecraft.hpp @@ -12,17 +12,19 @@ class SampleComponents; +namespace s2e::sample { + /** * @class SampleSpacecraft * @brief An example of user side spacecraft class */ -class SampleSpacecraft : public Spacecraft { +class SampleSpacecraft : public spacecraft::Spacecraft { public: /** * @fn SampleSpacecraft * @brief Constructor */ - SampleSpacecraft(const SimulationConfiguration* simulation_configuration, const GlobalEnvironment* global_environment, + SampleSpacecraft(const simulation::SimulationConfiguration* simulation_configuration, const environment::GlobalEnvironment* global_environment, const unsigned int spacecraft_id); /** @@ -35,4 +37,6 @@ class SampleSpacecraft : public Spacecraft { SampleComponents* sample_components_; }; +} // namespace s2e::sample + #endif // S2E_SIMULATION_SAMPLE_SPACECRAFT_SAMPLE_SPACECRAFT_HPP_ diff --git a/src/utilities/CMakeLists.txt b/src/utilities/CMakeLists.txt new file mode 100644 index 000000000..ce9bef781 --- /dev/null +++ b/src/utilities/CMakeLists.txt @@ -0,0 +1,11 @@ +project(UTILITIES) +cmake_minimum_required(VERSION 3.13) + +add_library(${PROJECT_NAME} STATIC + endian.cpp + slip.cpp + quantization.cpp + ring_buffer.cpp +) + +include(../../common.cmake) diff --git a/src/library/communication/com_port_interface.cpp b/src/utilities/com_port_interface.cpp similarity index 98% rename from src/library/communication/com_port_interface.cpp rename to src/utilities/com_port_interface.cpp index ab15eb3ab..4644fa5c9 100644 --- a/src/library/communication/com_port_interface.cpp +++ b/src/utilities/com_port_interface.cpp @@ -7,6 +7,8 @@ #include "com_port_interface.hpp" +namespace s2e::utilities { + ComPortInterface::ComPortInterface(int port_id, int baudrate, unsigned int tx_buffer_size, unsigned int rx_buffer_size) : kPortId(port_id), kPortName(PortName(port_id)), kBaudRate(baudrate), kTxBufferSize(tx_buffer_size), kRxBufferSize(rx_buffer_size) { // Allocate managed memory @@ -114,3 +116,5 @@ int ComPortInterface::DiscardInBuffer() { } return 0; } + +} // namespace s2e::utilities diff --git a/src/library/communication/com_port_interface.hpp b/src/utilities/com_port_interface.hpp similarity index 98% rename from src/library/communication/com_port_interface.hpp rename to src/utilities/com_port_interface.hpp index 03ccd568b..3da5bd6eb 100644 --- a/src/library/communication/com_port_interface.hpp +++ b/src/utilities/com_port_interface.hpp @@ -17,6 +17,9 @@ using namespace System; using namespace System::Runtime::InteropServices; + +namespace s2e::utilities { + typedef cli::array bytearray; /** @@ -105,4 +108,6 @@ class ComPortInterface { msclr::gcroot rx_buf_; //!< RX Buffer }; +} // namespace s2e::utilities + #endif // S2E_LIBRARY_COMMUNICATION_COM_PORT_INTERFACE_HPP_ diff --git a/src/library/utilities/endian.cpp b/src/utilities/endian.cpp similarity index 88% rename from src/library/utilities/endian.cpp rename to src/utilities/endian.cpp index a20149b0c..6aa2111a1 100644 --- a/src/library/utilities/endian.cpp +++ b/src/utilities/endian.cpp @@ -7,6 +7,8 @@ #include +namespace s2e::utilities { + void *endian_memcpy(void *dst, const void *src, size_t size) { #ifdef IS_LITTLE_ENDIAN uint8_t *src_ = (uint8_t *)src; @@ -25,4 +27,6 @@ void *endian_memcpy(void *dst, const void *src, size_t size) { #else return memcpy(dst, src, size); #endif // IS_LITTLE_ENDIAN -} \ No newline at end of file +} + +} // namespace s2e::utilities diff --git a/src/library/utilities/endian.hpp b/src/utilities/endian.hpp similarity index 89% rename from src/library/utilities/endian.hpp rename to src/utilities/endian.hpp index 27195efd1..0660d78f9 100644 --- a/src/library/utilities/endian.hpp +++ b/src/utilities/endian.hpp @@ -11,6 +11,8 @@ #include "endian_define.hpp" // for IS_LITTLE_ENDIAN +namespace s2e::utilities { + /** * @fn endian_memcpy * @brief Memory copy considering endian @@ -20,4 +22,6 @@ */ void *endian_memcpy(void *dst, const void *src, size_t count); +} // namespace s2e::utilities + #endif // S2E_LIBRARY_UTILITIES_ENDIAN_HPP_ diff --git a/src/library/utilities/endian_define.hpp b/src/utilities/endian_define.hpp similarity index 100% rename from src/library/utilities/endian_define.hpp rename to src/utilities/endian_define.hpp diff --git a/src/library/utilities/macros.hpp b/src/utilities/macros.hpp similarity index 81% rename from src/library/utilities/macros.hpp rename to src/utilities/macros.hpp index 308db3cd8..cbd37f012 100644 --- a/src/library/utilities/macros.hpp +++ b/src/utilities/macros.hpp @@ -6,6 +6,10 @@ #ifndef S2E_LIBRARY_UTILITIES_MACROS_HPP_ #define S2E_LIBRARY_UTILITIES_MACROS_HPP_ +namespace s2e::utilities { + #define UNUSED(x) (void)(x) //!< Macro to avoid unused warnings +} // namespace s2e::utilities + #endif // S2E_LIBRARY_UTILITIES_MACROS_HPP_ diff --git a/src/library/utilities/quantization.cpp b/src/utilities/quantization.cpp similarity index 87% rename from src/library/utilities/quantization.cpp rename to src/utilities/quantization.cpp index 114c0e2fe..1cfd3268e 100644 --- a/src/library/utilities/quantization.cpp +++ b/src/utilities/quantization.cpp @@ -5,9 +5,13 @@ #include "quantization.hpp" +namespace s2e::utilities { + double quantization(const double continuous_number, const double resolution) { int bin_num = (int)((double)continuous_number / resolution); return (double)bin_num * resolution; } float quantization_float(const double continuous_number, const double resolution) { return (float)quantization(continuous_number, resolution); } + +} // namespace s2e::utilities diff --git a/src/library/utilities/quantization.hpp b/src/utilities/quantization.hpp similarity index 93% rename from src/library/utilities/quantization.hpp rename to src/utilities/quantization.hpp index f23eebdeb..9fd075e3b 100644 --- a/src/library/utilities/quantization.hpp +++ b/src/utilities/quantization.hpp @@ -6,6 +6,8 @@ #ifndef S2E_LIBRARY_UTILITIES_QUANTIZATION_HPP_ #define S2E_LIBRARY_UTILITIES_QUANTIZATION_HPP_ +namespace s2e::utilities { + /** * @fn quantization * @brief Default constructor without any initialization @@ -24,4 +26,6 @@ double quantization(const double continuous_number, const double resolution); */ float quantization_float(const double continuous_number, const double resolution); +} // namespace s2e::utilities + #endif // S2E_LIBRARY_UTILITIES_QUANTIZATION_HPP_ diff --git a/src/library/utilities/ring_buffer.cpp b/src/utilities/ring_buffer.cpp similarity index 96% rename from src/library/utilities/ring_buffer.cpp rename to src/utilities/ring_buffer.cpp index d89f10204..40aed8adb 100644 --- a/src/library/utilities/ring_buffer.cpp +++ b/src/utilities/ring_buffer.cpp @@ -10,6 +10,8 @@ #include #include +namespace s2e::utilities { + RingBuffer::RingBuffer(int buffer_size) : buffer_size_(buffer_size) { buffer_ = new byte[buffer_size]; write_pointer_ = 0; @@ -44,3 +46,5 @@ int RingBuffer::Read(byte* buffer, const unsigned int offset, const unsigned int return read_count; } + +} // namespace s2e::utilities diff --git a/src/library/utilities/ring_buffer.hpp b/src/utilities/ring_buffer.hpp similarity index 96% rename from src/library/utilities/ring_buffer.hpp rename to src/utilities/ring_buffer.hpp index 3e133de26..3855c8179 100644 --- a/src/library/utilities/ring_buffer.hpp +++ b/src/utilities/ring_buffer.hpp @@ -6,6 +6,8 @@ #ifndef S2E_LIBRARY_UTILITIES_RING_BUFFER_HPP_ #define S2E_LIBRARY_UTILITIES_RING_BUFFER_HPP_ +namespace s2e::utilities { + typedef unsigned char byte; /** @@ -52,4 +54,6 @@ class RingBuffer { unsigned int write_pointer_; //!< Write pointer }; +} // namespace s2e::utilities + #endif // S2E_LIBRARY_UTILITIES_RING_BUFFER_HPP_ diff --git a/src/library/utilities/slip.cpp b/src/utilities/slip.cpp similarity index 97% rename from src/library/utilities/slip.cpp rename to src/utilities/slip.cpp index 6f2192409..b1f0fbb03 100644 --- a/src/library/utilities/slip.cpp +++ b/src/utilities/slip.cpp @@ -8,6 +8,8 @@ #include #include +namespace s2e::utilities { + static uint8_t kSlipFend_ = 0xc0; //!< FEND: Frame End static uint8_t kSlipFesc_ = 0xdb; //!< FESC: Frame Escape static uint8_t kSlipTfend_ = 0xdc; //!< TFEND: Transposed Frame End @@ -77,3 +79,5 @@ std::vector encode_slip_with_header(const std::vector in) { out.insert(out.begin(), kSlipFend_); return out; } + +} // namespace s2e::utilities diff --git a/src/library/utilities/slip.hpp b/src/utilities/slip.hpp similarity index 94% rename from src/library/utilities/slip.hpp rename to src/utilities/slip.hpp index b5355bb5d..da9e222d5 100644 --- a/src/library/utilities/slip.hpp +++ b/src/utilities/slip.hpp @@ -10,6 +10,8 @@ #include +namespace s2e::utilities { + /** * @fn decode_slip * @brief Decode SLIP data @@ -40,4 +42,6 @@ std::vector encode_slip(std::vector in); */ std::vector encode_slip_with_header(std::vector in); +} // namespace s2e::utilities + #endif // S2E_LIBRARY_UTILITIES_SLIP_HPP_